509 lines · c
1// RUN: %libomp-compile-and-run2#include <stdio.h>3#include <math.h>4#include "omp_testsuite.h"5 6int test_omp_parallel_sections_reduction()7{8 int sum;9 int known_sum;10 double dpt;11 double dsum;12 double dknown_sum;13 double dt=0.5; /* base of geometric row for + and - test*/14 double rounding_error= 1.E-5;15 int diff;16 double ddiff;17 int product;18 int known_product;19 int logic_and;20 int bit_and;21 int logic_or;22 int bit_or;23 int exclusiv_bit_or;24 int logics[1000];25 int i;26 int result;27 28 sum = 7;29 dsum=0;30 product =1;31 dpt = 1;32 logic_and=1;33 bit_and=1;34 logic_or=0;35 bit_or=0;36 exclusiv_bit_or=0;37 result =0;38 /* int my_islarger;*/39 /*int is_larger=1;*/40 41 // Test summation of integers42 known_sum = (999*1000)/2+7;43 #pragma omp parallel sections private(i) reduction(+:sum)44 {45 #pragma omp section46 {47 for (i=1;i<300;i++) {48 sum=sum+i;49 }50 }51 #pragma omp section52 {53 for (i=300;i<700;i++) {54 sum=sum+i;55 }56 }57 #pragma omp section58 {59 for (i=700;i<1000;i++) {60 sum=sum+i;61 }62 }63 }64 if(known_sum!=sum) {65 result++;66 fprintf(stderr,"Error in sum with integers: Result was %d"67 " instead of %d.\n",sum, known_sum);68 }69 70 // Test differences of integers71 diff = (999*1000)/2;72 #pragma omp parallel sections private(i) reduction(-:diff)73 {74 #pragma omp section75 {76 for (i=1;i<300;i++) {77 diff=diff-i;78 }79 }80 #pragma omp section81 {82 for (i=300;i<700;i++) {83 diff=diff-i;84 }85 }86 #pragma omp section87 {88 for (i=700;i<1000;i++) {89 diff=diff-i;90 }91 }92 }93 if(diff != 0) {94 result++;95 fprintf(stderr,"Error in Difference with integers: Result was %d"96 " instead of 0.\n",diff);97 }98 99 // Test summation of doubles100 for (i=0;i<20;++i) {101 dpt*=dt;102 }103 dknown_sum = (1-dpt)/(1-dt);104 #pragma omp parallel sections private(i) reduction(+:dsum)105 {106 #pragma omp section107 {108 for (i=0;i<6;++i) {109 dsum += pow(dt,i);110 }111 }112 #pragma omp section113 {114 for (i=6;i<12;++i) {115 dsum += pow(dt,i);116 }117 }118 #pragma omp section119 {120 for (i=12;i<20;++i) {121 dsum += pow(dt,i);122 }123 }124 }125 if( fabs(dsum-dknown_sum) > rounding_error ) {126 result++;127 fprintf(stderr,"Error in sum with doubles: Result was %f"128 " instead of %f (Difference: %E)\n",129 dsum, dknown_sum, dsum-dknown_sum);130 }131 132 // Test differences of doubles133 dpt=1;134 for (i=0;i<20;++i) {135 dpt*=dt;136 }137 fprintf(stderr,"\n");138 ddiff = (1-dpt)/(1-dt);139 #pragma omp parallel sections private(i) reduction(-:ddiff)140 {141 #pragma omp section142 {143 for (i=0;i<6;++i) {144 ddiff -= pow(dt,i);145 }146 }147 #pragma omp section148 {149 for (i=6;i<12;++i) {150 ddiff -= pow(dt,i);151 }152 }153 #pragma omp section154 {155 for (i=12;i<20;++i) {156 ddiff -= pow(dt,i);157 }158 }159 }160 if( fabs(ddiff) > rounding_error) {161 result++;162 fprintf(stderr,"Error in Difference with doubles: Result was %E"163 " instead of 0.0\n",ddiff);164 }165 166 // Test product of integers167 known_product = 3628800;168 #pragma omp parallel sections private(i) reduction(*:product)169 {170 #pragma omp section171 {172 for(i=1;i<3;i++) {173 product *= i;174 }175 }176 #pragma omp section177 {178 for(i=3;i<7;i++) {179 product *= i;180 }181 }182 #pragma omp section183 {184 for(i=7;i<11;i++) {185 product *= i;186 }187 }188 }189 if(known_product != product) {190 result++;191 fprintf(stderr,"Error in Product with integers: Result was %d"192 " instead of %d\n",product,known_product);193 }194 195 // Test logical AND196 for(i=0;i<1000;i++) {197 logics[i]=1;198 }199 200 #pragma omp parallel sections private(i) reduction(&&:logic_and)201 {202 #pragma omp section203 {204 for (i=1;i<300;i++) {205 logic_and = (logic_and && logics[i]);206 }207 }208 #pragma omp section209 {210 for (i=300;i<700;i++) {211 logic_and = (logic_and && logics[i]);212 }213 }214 #pragma omp section215 {216 for (i=700;i<1000;i++) {217 logic_and = (logic_and && logics[i]);218 }219 }220 }221 if(!logic_and) {222 result++;223 fprintf(stderr,"Error in logic AND part 1\n");224 }225 logic_and = 1;226 logics[501] = 0;227 228 #pragma omp parallel sections private(i) reduction(&&:logic_and)229 {230 #pragma omp section231 {232 for (i=1;i<300;i++) {233 logic_and = (logic_and && logics[i]);234 }235 }236 #pragma omp section237 {238 for (i=300;i<700;i++) {239 logic_and = (logic_and && logics[i]);240 }241 }242 #pragma omp section243 {244 for (i=700;i<1000;i++) {245 logic_and = (logic_and && logics[i]);246 }247 }248 }249 if(logic_and) {250 result++;251 fprintf(stderr,"Error in logic AND part 2");252 }253 254 // Test logical OR255 for(i=0;i<1000;i++) {256 logics[i]=0;257 }258 259 #pragma omp parallel sections private(i) reduction(||:logic_or)260 {261 #pragma omp section262 {263 for (i=1;i<300;i++) {264 logic_or = (logic_or || logics[i]);265 }266 }267 #pragma omp section268 {269 for (i=300;i<700;i++) {270 logic_or = (logic_or || logics[i]);271 }272 }273 #pragma omp section274 {275 for (i=700;i<1000;i++) {276 logic_or = (logic_or || logics[i]);277 }278 }279 }280 if(logic_or) {281 result++;282 fprintf(stderr,"Error in logic OR part 1\n");283 }284 285 logic_or = 0;286 logics[501]=1;287 288 #pragma omp parallel sections private(i) reduction(||:logic_or)289 {290 #pragma omp section291 {292 for (i=1;i<300;i++) {293 logic_or = (logic_or || logics[i]);294 }295 }296 #pragma omp section297 {298 for (i=300;i<700;i++) {299 logic_or = (logic_or || logics[i]);300 }301 }302 #pragma omp section303 {304 for (i=700;i<1000;i++) {305 logic_or = (logic_or || logics[i]);306 }307 }308 }309 if(!logic_or) {310 result++;311 fprintf(stderr,"Error in logic OR part 2\n");312 }313 314 // Test bitwise AND315 for(i=0;i<1000;++i) {316 logics[i]=1;317 }318 319 #pragma omp parallel sections private(i) reduction(&:bit_and)320 {321 #pragma omp section322 {323 for(i=0;i<300;++i) {324 bit_and = (bit_and & logics[i]);325 }326 }327 #pragma omp section328 {329 for(i=300;i<700;++i) {330 bit_and = (bit_and & logics[i]);331 }332 }333 #pragma omp section334 {335 for(i=700;i<1000;++i) {336 bit_and = (bit_and & logics[i]);337 }338 }339 }340 if(!bit_and) {341 result++;342 fprintf(stderr,"Error in BIT AND part 1\n");343 }344 345 bit_and = 1;346 logics[501]=0;347 348 #pragma omp parallel sections private(i) reduction(&:bit_and)349 {350 #pragma omp section351 {352 for(i=0;i<300;++i) {353 bit_and = bit_and & logics[i];354 }355 }356 #pragma omp section357 {358 for(i=300;i<700;++i) {359 bit_and = bit_and & logics[i];360 }361 }362 #pragma omp section363 {364 for(i=700;i<1000;++i) {365 bit_and = bit_and & logics[i];366 }367 }368 }369 if(bit_and) {370 result++;371 fprintf(stderr,"Error in BIT AND part 2");372 }373 374 // Test bitwise OR375 for(i=0;i<1000;i++) {376 logics[i]=0;377 }378 379 #pragma omp parallel sections private(i) reduction(|:bit_or)380 {381 #pragma omp section382 {383 for(i=0;i<300;++i) {384 bit_or = bit_or | logics[i];385 }386 }387 #pragma omp section388 {389 for(i=300;i<700;++i) {390 bit_or = bit_or | logics[i];391 }392 }393 #pragma omp section394 {395 for(i=700;i<1000;++i) {396 bit_or = bit_or | logics[i];397 }398 }399 }400 if(bit_or) {401 result++;402 fprintf(stderr,"Error in BIT OR part 1\n");403 }404 bit_or = 0;405 logics[501]=1;406 407 #pragma omp parallel sections private(i) reduction(|:bit_or)408 {409 #pragma omp section410 {411 for(i=0;i<300;++i) {412 bit_or = bit_or | logics[i];413 }414 }415 #pragma omp section416 {417 for(i=300;i<700;++i) {418 bit_or = bit_or | logics[i];419 }420 }421 #pragma omp section422 {423 for(i=700;i<1000;++i) {424 bit_or = bit_or | logics[i];425 }426 }427 }428 if(!bit_or) {429 result++;430 fprintf(stderr,"Error in BIT OR part 2\n");431 }432 433 // Test bitwise XOR434 for(i=0;i<1000;i++) {435 logics[i]=0;436 }437 438 #pragma omp parallel sections private(i) reduction(^:exclusiv_bit_or)439 {440 #pragma omp section441 {442 for(i=0;i<300;++i) {443 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];444 }445 }446 #pragma omp section447 {448 for(i=300;i<700;++i) {449 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];450 }451 }452 #pragma omp section453 {454 for(i=700;i<1000;++i) {455 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];456 }457 }458 }459 if(exclusiv_bit_or) {460 result++;461 fprintf(stderr,"Error in EXCLUSIV BIT OR part 1\n");462 }463 464 exclusiv_bit_or = 0;465 logics[501]=1;466 467 #pragma omp parallel sections private(i) reduction(^:exclusiv_bit_or)468 {469 #pragma omp section470 {471 for(i=0;i<300;++i) {472 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];473 }474 }475 #pragma omp section476 {477 for(i=300;i<700;++i) {478 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];479 }480 }481 #pragma omp section482 {483 for(i=700;i<1000;++i) {484 exclusiv_bit_or = exclusiv_bit_or ^ logics[i];485 }486 }487 }488 if(!exclusiv_bit_or) {489 result++;490 fprintf(stderr,"Error in EXCLUSIV BIT OR part 2\n");491 }492 493 /*printf("\nResult:%d\n",result);*/494 return (result==0);495}496 497int main()498{499 int i;500 int num_failed=0;501 502 for(i = 0; i < REPETITIONS; i++) {503 if(!test_omp_parallel_sections_reduction()) {504 num_failed++;505 }506 }507 return num_failed;508}509