blob: 7e7829ac19b3669cc257bd80916d82bf0efba224 [file] [log] [blame]
Jim Cownie18d84732014-05-10 17:02:09 +00001<ompts:test>
2<ompts:testdescription>Test which checks the omp sections reduction directive with all its options.</ompts:testdescription>
3<ompts:ompversion>2.0</ompts:ompversion>
4<ompts:directive>omp sections reduction</ompts:directive>
5<ompts:testcode>
6#include <stdio.h>
7#include <math.h>
8#include "omp_testsuite.h"
9
10
11int <ompts:testcode:functionname>omp_sections_reduction</ompts:testcode:functionname>(FILE * logFile){
12 <ompts:orphan:vars>
13 int sum;
14 int known_sum;
15 double dpt,dsum;
16 double dknown_sum;
17 double dt=0.5; /* base of geometric row for + and - test*/
18 double rounding_error= 1.E-9;
19 int diff;
20 double ddiff;
21 int product;
22 int known_product;
23 int logic_and;
24 int bit_and;
25 int logic_or;
26 int bit_or;
27 int exclusiv_bit_or;
28 int logics[1000];
29 int i;
30 int result;
31 </ompts:orphan:vars>
32 /* int my_islarger;*/
33 /*int is_larger=1;*/
34
35 sum =7;
36 dpt =1;
37 dsum=0;
38 product =1;
39 logic_and=1;
40 bit_and=1;
41 logic_or=0;
42 bit_or=0;
43 exclusiv_bit_or=0;
44 result = 0;
45 dt = 1./3.;
46 known_sum = (999*1000)/2+7;
47<ompts:orphan>
48#pragma omp parallel
49 {
50
51#pragma omp sections private(i) <ompts:check>reduction(+:sum)</ompts:check><ompts:crosscheck></ompts:crosscheck>
52 {
53#pragma omp section
54 {
55 for (i=1;i<300;i++)
56 {
57 sum=sum+i;
58 }
59 }
60#pragma omp section
61 {
62 for (i=300;i<700;i++)
63 {
64 sum=sum+i;
65 }
66 }
67#pragma omp section
68 {
69 for (i=700;i<1000;i++)
70 {
71 sum=sum+i;
72 }
73 }
74 }
75 }
76
77 if(known_sum!=sum)
78 {
79 ++result;
80 fprintf(logFile,"Error in sum with integers: Result was %d instead of %d\n", sum,known_sum);
81 }
82
83 diff = (999*1000)/2;
84#pragma omp parallel
85 {
86#pragma omp sections private(i) <ompts:check>reduction(-:diff)</ompts:check><ompts:crosscheck></ompts:crosscheck>
87 {
88#pragma omp section
89 {
90 for (i=1;i<300;i++)
91 {
92 diff=diff-i;
93 }
94 }
95#pragma omp section
96 {
97 for (i=300;i<700;i++)
98 {
99 diff=diff-i;
100 }
101 }
102#pragma omp section
103 {
104 for (i=700;i<1000;i++)
105 {
106 diff=diff-i;
107 }
108 }
109 }
110 }
111
112 if(diff != 0)
113 {
114 result++;
115 fprintf(logFile,"Error in Difference with integers: Result was %d instead of 0.\n",diff);
116 }
117
118 for (i=0;i<20;++i)
119 {
120 dpt*=dt;
121 }
122 dknown_sum = (1-dpt)/(1-dt);
123#pragma omp parallel
124 {
125#pragma omp sections private(i) <ompts:check>reduction(+:dsum)</ompts:check><ompts:crosscheck></ompts:crosscheck>
126 {
127#pragma omp section
128 {
129 for (i=0;i<6;++i)
130 {
131 dsum += pow(dt,i);
132 }
133 }
134#pragma omp section
135 {
136 for (i=6;i<12;++i)
137 {
138 dsum += pow(dt,i);
139 }
140 }
141#pragma omp section
142 {
143 for (i=12;i<20;++i)
144 {
145 dsum += pow(dt,i);
146 }
147 }
148 }
149 }
150
151 if( fabs(dsum-dknown_sum) > rounding_error )
152 {
153 result++;
154 fprintf(logFile,"Error in sum with doubles: Result was %f instead of %f (Difference: %E)\n",dsum,dknown_sum, dsum-dknown_sum);
155 }
156
157 dpt=1;
158
159 for (i=0;i<20;++i)
160 {
161 dpt*=dt;
162 }
163 fprintf(logFile,"\n");
164 ddiff = (1-dpt)/(1-dt);
165#pragma omp parallel
166 {
167#pragma omp sections private(i) <ompts:check>reduction(-:ddiff)</ompts:check><ompts:crosscheck></ompts:crosscheck>
168 {
169#pragma omp section
170 {
171 for (i=0;i<6;++i)
172 {
173 ddiff -= pow(dt,i);
174 }
175 }
176#pragma omp section
177 {
178 for (i=6;i<12;++i)
179 {
180 ddiff -= pow(dt,i);
181 }
182 }
183#pragma omp section
184 {
185 for (i=12;i<20;++i)
186 {
187 ddiff -= pow(dt,i);
188 }
189 }
190 }
191 }
192
193 if( fabs(ddiff) > rounding_error)
194 {
195 result++;
196 fprintf(logFile,"Error in Difference with doubles: Result was %E instead of 0.0\n",ddiff);
197 }
198
199
200 known_product = 3628800;
201#pragma omp parallel
202 {
203#pragma omp sections private(i) <ompts:check>reduction(*:product)</ompts:check><ompts:crosscheck></ompts:crosscheck>
204 {
205#pragma omp section
206 {
207 for(i=1;i<3;i++)
208 {
209 product *= i;
210 }
211 }
212#pragma omp section
213 {
214 for(i=3;i<7;i++)
215 {
216 product *= i;
217 }
218 }
219#pragma omp section
220 {
221 for(i=7;i<11;i++)
222 {
223 product *= i;
224 }
225 }
226 }
227 }
228
229 if(known_product != product)
230 {
231 result++;
232 fprintf(logFile,"Error in Product with integers: Result was %d instead of %d\n",product,known_product);
233 }
234
235 for(i=0;i<1000;i++)
236 {
237 logics[i]=1;
238 }
239
240#pragma omp parallel
241 {
242#pragma omp sections private(i) <ompts:check>reduction(&&:logic_and)</ompts:check><ompts:crosscheck></ompts:crosscheck>
243 {
244#pragma omp section
245 {
246 for (i=1;i<300;i++)
247 {
248 logic_and = (logic_and && logics[i]);
249 }
250 }
251#pragma omp section
252 {
253 for (i=300;i<700;i++)
254 {
255 logic_and = (logic_and && logics[i]);
256 }
257 }
258#pragma omp section
259 {
260 for (i=700;i<1000;i++)
261 {
262 logic_and = (logic_and && logics[i]);
263 }
264 }
265 }
266 }
267
268 if(!logic_and)
269 {
270 result++;
271 fprintf(logFile,"Error in logic AND part 1\n");
272 }
273
274 logic_and = 1;
275 logics[501] = 0;
276
277#pragma omp parallel
278 {
279#pragma omp sections private(i) <ompts:check>reduction(&&:logic_and)</ompts:check><ompts:crosscheck></ompts:crosscheck>
280 {
281#pragma omp section
282 {
283 for (i=1;i<300;i++)
284 {
285 logic_and = (logic_and && logics[i]);
286 }
287 }
288#pragma omp section
289 {
290 for (i=300;i<700;i++)
291 {
292 logic_and = (logic_and && logics[i]);
293 }
294 }
295#pragma omp section
296 {
297 for (i=700;i<1000;i++)
298 {
299 logic_and = (logic_and && logics[i]);
300 }
301 }
302 }
303 }
304
305 if(logic_and)
306 {
307 result++;
308 fprintf(logFile,"Error in logic AND part 2\n");
309 }
310
311 for(i=0;i<1000;i++)
312 {
313 logics[i]=0;
314 }
315
316#pragma omp parallel
317 {
318#pragma omp sections private(i) <ompts:check>reduction(||:logic_or)</ompts:check><ompts:crosscheck></ompts:crosscheck>
319 {
320#pragma omp section
321 {
322 for (i=1;i<300;i++)
323 {
324 logic_or = (logic_or || logics[i]);
325 }
326 }
327#pragma omp section
328 {
329 for (i=300;i<700;i++)
330 {
331 logic_or = (logic_or || logics[i]);
332 }
333 }
334#pragma omp section
335 {
336 for (i=700;i<1000;i++)
337 {
338 logic_or = (logic_or || logics[i]);
339 }
340 }
341 }
342 }
343
344 if(logic_or)
345 {
346 result++;
347 fprintf(logFile,"\nError in logic OR part 1\n");
348 }
349
350 logic_or = 0;
351 logics[501]=1;
352
353#pragma omp parallel
354 {
355#pragma omp sections private(i) <ompts:check>reduction(||:logic_or)</ompts:check><ompts:crosscheck></ompts:crosscheck>
356 {
357#pragma omp section
358 {
359 for (i=1;i<300;i++)
360 {
361 logic_or = (logic_or || logics[i]);
362 }
363 }
364#pragma omp section
365 {
366 for (i=300;i<700;i++)
367 {
368 logic_or = (logic_or || logics[i]);
369 }
370 }
371#pragma omp section
372 {
373 for (i=700;i<1000;i++)
374 {
375 logic_or = (logic_or || logics[i]);
376 }
377 }
378 }
379 }
380
381 if(!logic_or)
382 {
383 result++;
384 fprintf(logFile,"Error in logic OR part 2\n");
385 }
386
387
388 for(i=0;i<1000;++i)
389 {
390 logics[i]=1;
391 }
392
393#pragma omp parallel
394 {
395#pragma omp sections private(i) <ompts:check>reduction(&:bit_and)</ompts:check><ompts:crosscheck></ompts:crosscheck>
396 {
397#pragma omp section
398 {
399 for(i=0;i<300;++i)
400 {
401 bit_and = (bit_and & logics[i]);
402 }
403 }
404#pragma omp section
405 {
406 for(i=300;i<700;++i)
407 {
408 bit_and = (bit_and & logics[i]);
409 }
410 }
411#pragma omp section
412 {
413 for(i=700;i<1000;++i)
414 {
415 bit_and = (bit_and & logics[i]);
416 }
417 }
418 }
419 }
420 if(!bit_and)
421 {
422 result++;
423 fprintf(logFile,"Error in BIT AND part 1\n");
424 }
425
426 bit_and = 1;
427 logics[501]=0;
428
429#pragma omp parallel
430 {
431#pragma omp sections private(i) <ompts:check>reduction(&:bit_and)</ompts:check><ompts:crosscheck></ompts:crosscheck>
432 {
433#pragma omp section
434 {
435 for(i=0;i<300;++i)
436 {
437 bit_and = bit_and & logics[i];
438 }
439 }
440#pragma omp section
441 {
442 for(i=300;i<700;++i)
443 {
444 bit_and = bit_and & logics[i];
445 }
446 }
447#pragma omp section
448 {
449 for(i=700;i<1000;++i)
450 {
451 bit_and = bit_and & logics[i];
452 }
453 }
454 }
455 }
456 if(bit_and)
457 {
458 result++;
459 fprintf(logFile,"Error in BIT AND part 2\n");
460 }
461
462 for(i=0;i<1000;i++)
463 {
464 logics[i]=0;
465 }
466
467#pragma omp parallel
468 {
469#pragma omp sections private(i) <ompts:check>reduction(|:bit_or)</ompts:check><ompts:crosscheck></ompts:crosscheck>
470 {
471#pragma omp section
472 {
473 for(i=0;i<300;++i)
474 {
475 bit_or = bit_or | logics[i];
476 }
477 }
478#pragma omp section
479 {
480 for(i=300;i<700;++i)
481 {
482 bit_or = bit_or | logics[i];
483 }
484 }
485#pragma omp section
486 {
487 for(i=700;i<1000;++i)
488 {
489 bit_or = bit_or | logics[i];
490 }
491 }
492 }
493 }
494 if(bit_or)
495 {
496 result++;
497 fprintf(logFile,"Error in BIT OR part 1\n");
498 }
499 bit_or = 0;
500 logics[501]=1;
501
502#pragma omp parallel
503 {
504#pragma omp sections private(i) <ompts:check>reduction(|:bit_or)</ompts:check><ompts:crosscheck></ompts:crosscheck>
505 {
506#pragma omp section
507 {
508 for(i=0;i<300;++i)
509 {
510 bit_or = bit_or | logics[i];
511 }
512 }
513#pragma omp section
514 {
515 for(i=300;i<700;++i)
516 {
517 bit_or = bit_or | logics[i];
518 }
519 }
520#pragma omp section
521 {
522 for(i=700;i<1000;++i)
523 {
524 bit_or = bit_or | logics[i];
525 }
526 }
527 }
528 }
529 if(!bit_or)
530 {
531 result++;
532 fprintf(logFile,"Error in BIT OR part 2\n");
533 }
534
535 for(i=0;i<1000;i++)
536 {
537 logics[i]=0;
538 }
539
540#pragma omp parallel
541 {
542#pragma omp sections private(i) <ompts:check>reduction(^:exclusiv_bit_or)</ompts:check><ompts:crosscheck></ompts:crosscheck>
543 {
544#pragma omp section
545 {
546 for(i=0;i<300;++i)
547 {
548 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
549 }
550 }
551#pragma omp section
552 {
553 for(i=300;i<700;++i)
554 {
555 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
556 }
557 }
558#pragma omp section
559 {
560 for(i=700;i<1000;++i)
561 {
562 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
563 }
564 }
565 }
566 }
567 if(exclusiv_bit_or)
568 {
569 result++;
570 fprintf(logFile,"Error in EXCLUSIV BIT OR part 1\n");
571 }
572
573 exclusiv_bit_or = 0;
574 logics[501]=1;
575
576#pragma omp parallel
577 {
578#pragma omp sections private(i) <ompts:check>reduction(^:exclusiv_bit_or)</ompts:check><ompts:crosscheck></ompts:crosscheck>
579 {
580#pragma omp section
581 {
582 for(i=0;i<300;++i)
583 {
584 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
585 }
586 }
587#pragma omp section
588 {
589 for(i=300;i<700;++i)
590 {
591 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
592 }
593 }
594#pragma omp section
595 {
596 for(i=700;i<1000;++i)
597 {
598 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];
599 }
600 }
601 }
602 }
603 if(!exclusiv_bit_or)
604 {
605 result++;
606 fprintf(logFile,"Error in EXCLUSIV BIT OR part 2\n");
607 }
608</ompts:orphan>
609 /*printf("\nResult:%d\n",result);*/
610 return (result==0);
611}
612</ompts:testcode>
613</ompts:test>