brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.1 KiB · 1fdb5ec Raw
544 lines · c
1// RUN: %libomp-compile-and-run2#include <stdio.h>3#include <math.h>4#include "omp_testsuite.h"5 6int test_omp_sections_reduction()7{8  int sum;9  int known_sum;10  double dpt,dsum;11  double dknown_sum;12  double dt=0.5; /* base of geometric row for + and - test*/13  double rounding_error= 1.E-9;14  int diff;15  double ddiff;16  int product;17  int known_product;18  int logic_and;19  int bit_and;20  int logic_or;21  int bit_or;22  int exclusiv_bit_or;23  int logics[1000];24  int i;25  int result;26  /* int my_islarger; */27  /*int is_larger=1;*/28  sum =7;29  dpt =1;30  dsum=0;31  product =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  dt = 1./3.;39 40  known_sum = (999*1000)/2+7;41  #pragma omp parallel42  {43    #pragma omp 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  }65  if(known_sum!=sum) {66    ++result;67    fprintf(stderr,"Error in sum with integers: Result was %d"68      " instead of %d\n", sum,known_sum);69  }70 71  diff = (999*1000)/2;72  #pragma omp parallel73  {74    #pragma omp sections private(i) reduction(-:diff)75    {76      #pragma omp section77      {78        for (i=1;i<300;i++) {79          diff=diff-i;80        }81      }82      #pragma omp section83      {84        for (i=300;i<700;i++) {85          diff=diff-i;86        }87      }88      #pragma omp section89      {90        for (i=700;i<1000;i++) {91          diff=diff-i;92        }93      }94    }95  }96  if(diff != 0) {97    result++;98    fprintf(stderr,"Error in Difference with integers: Result was %d"99      " instead of 0.\n",diff);100  }101 102  for (i=0;i<20;++i) {103    dpt*=dt;104  }105  dknown_sum = (1-dpt)/(1-dt);106  #pragma omp parallel107  {108    #pragma omp sections private(i) reduction(+:dsum)109    {110      #pragma omp section111      {112        for (i=0;i<6;++i) {113          dsum += pow(dt,i);114        }115      }116      #pragma omp section117      {118        for (i=6;i<12;++i) {119          dsum += pow(dt,i);120        }121      }122      #pragma omp section123      {124        for (i=12;i<20;++i) {125          dsum += pow(dt,i);126        }127      }128    }129  }130  if( fabs(dsum-dknown_sum) > rounding_error ) {131    result++;132    fprintf(stderr,"Error in sum with doubles: Result was %f"133      " instead of %f (Difference: %E)\n",134      dsum, dknown_sum, dsum-dknown_sum);135  }136 137  dpt=1;138  for (i=0;i<20;++i) {139    dpt*=dt;140  }141  fprintf(stderr,"\n");142  ddiff = (1-dpt)/(1-dt);143  #pragma omp parallel144  {145    #pragma omp sections private(i) reduction(-:ddiff)146    {147      #pragma omp section148      {149        for (i=0;i<6;++i) {150          ddiff -= pow(dt,i);151        }152      }153      #pragma omp section154      {155        for (i=6;i<12;++i) {156          ddiff -= pow(dt,i);157        }158      }159      #pragma omp section160      {161        for (i=12;i<20;++i) {162          ddiff -= pow(dt,i);163        }164      }165    }166  }167 168  if(fabs(ddiff) > rounding_error) {169    result++;170    fprintf(stderr,"Error in Difference with doubles: Result was %E"171      " instead of 0.0\n",ddiff);172  }173 174  known_product = 3628800;175  #pragma omp parallel176  {177    #pragma omp sections private(i) reduction(*:product)178    {179      #pragma omp section180      {181        for(i=1;i<3;i++) {182          product *= i;183        }184      }185      #pragma omp section186      {187        for(i=3;i<7;i++) {188          product *= i;189        }190      }191      #pragma omp section192      {193        for(i=7;i<11;i++) {194          product *= i;195        }196      }197    }198  }199  if(known_product != product) {200    result++;201    fprintf(stderr,"Error in Product with integers: Result was %d"202      " instead of %d\n",product,known_product);203  }204 205  for(i=0;i<1000;i++) {206    logics[i]=1;207  }208 209  #pragma omp parallel210  {211    #pragma omp sections private(i) reduction(&&:logic_and)212    {213      #pragma omp section214      {215        for (i=1;i<300;i++) {216          logic_and = (logic_and && logics[i]);217        }218      }219      #pragma omp section220      {221        for (i=300;i<700;i++) {222          logic_and = (logic_and && logics[i]);223        }224      }225      #pragma omp section226      {227        for (i=700;i<1000;i++) {228          logic_and = (logic_and && logics[i]);229        }230      }231    }232  }233  if(!logic_and) {234    result++;235    fprintf(stderr,"Error in logic AND part 1\n");236  }237 238  logic_and = 1;239  logics[501] = 0;240 241  #pragma omp parallel242  {243    #pragma omp sections private(i) reduction(&&:logic_and)244    {245      #pragma omp section246      {247        for (i=1;i<300;i++) {248          logic_and = (logic_and && logics[i]);249        }250      }251      #pragma omp section252      {253        for (i=300;i<700;i++) {254          logic_and = (logic_and && logics[i]);255        }256      }257      #pragma omp section258      {259        for (i=700;i<1000;i++) {260          logic_and = (logic_and && logics[i]);261        }262      }263    }264  }265  if(logic_and) {266    result++;267    fprintf(stderr,"Error in logic AND part 2\n");268  }269 270  for(i=0;i<1000;i++) {271    logics[i]=0;272  }273 274  #pragma omp parallel275  {276    #pragma omp sections private(i) reduction(||:logic_or)277    {278      #pragma omp section279      {280        for (i=1;i<300;i++) {281          logic_or = (logic_or || logics[i]);282        }283      }284      #pragma omp section285      {286        for (i=300;i<700;i++) {287          logic_or = (logic_or || logics[i]);288        }289      }290      #pragma omp section291      {292        for (i=700;i<1000;i++) {293          logic_or = (logic_or || logics[i]);294        }295      }296    }297  }298  if(logic_or) {299    result++;300    fprintf(stderr,"\nError in logic OR part 1\n");301  }302 303  logic_or = 0;304  logics[501]=1;305 306  #pragma omp parallel307  {308    #pragma omp sections private(i) reduction(||:logic_or)309    {310      #pragma omp section311      {312        for (i=1;i<300;i++) {313          logic_or = (logic_or || logics[i]);314        }315      }316      #pragma omp section317      {318        for (i=300;i<700;i++) {319          logic_or = (logic_or || logics[i]);320        }321      }322      #pragma omp section323      {324        for (i=700;i<1000;i++) {325          logic_or = (logic_or || logics[i]);326        }327      }328    }329  }330  if(!logic_or) {331    result++;332    fprintf(stderr,"Error in logic OR part 2\n");333  }334 335  for(i=0;i<1000;++i) {336    logics[i]=1;337  }338 339  #pragma omp parallel340  {341    #pragma omp sections private(i) reduction(&:bit_and)342    {343      #pragma omp section344      {345        for(i=0;i<300;++i) {346          bit_and = (bit_and & logics[i]);347        }348      }349      #pragma omp section350      {351        for(i=300;i<700;++i) {352          bit_and = (bit_and & logics[i]);353        }354      }355      #pragma omp section356      {357        for(i=700;i<1000;++i) {358          bit_and = (bit_and & logics[i]);359        }360      }361    }362  }363  if(!bit_and) {364    result++;365    fprintf(stderr,"Error in BIT AND part 1\n");366  }367 368  bit_and = 1;369  logics[501]=0;370 371  #pragma omp parallel372  {373    #pragma omp sections private(i) reduction(&:bit_and)374    {375      #pragma omp section376      {377        for(i=0;i<300;++i) {378          bit_and = bit_and & logics[i];379        }380      }381      #pragma omp section382      {383        for(i=300;i<700;++i) {384          bit_and = bit_and & logics[i];385        }386      }387      #pragma omp section388      {389        for(i=700;i<1000;++i) {390          bit_and = bit_and & logics[i];391        }392      }393    }394  }395  if(bit_and) {396    result++;397    fprintf(stderr,"Error in BIT AND part 2\n");398  }399 400  for(i=0;i<1000;i++) {401    logics[i]=0;402  }403 404  #pragma omp parallel405  {406    #pragma omp sections private(i) reduction(|:bit_or)407    {408      #pragma omp section409      {410        for(i=0;i<300;++i) {411          bit_or = bit_or | logics[i];412        }413      }414      #pragma omp section415      {416        for(i=300;i<700;++i) {417          bit_or = bit_or | logics[i];418        }419      }420      #pragma omp section421      {422        for(i=700;i<1000;++i) {423          bit_or = bit_or | logics[i];424        }425      }426    }427  }428  if(bit_or) {429    result++;430    fprintf(stderr,"Error in BIT OR part 1\n");431  }432  bit_or = 0;433  logics[501]=1;434 435  #pragma omp parallel436  {437    #pragma omp sections private(i) reduction(|:bit_or)438    {439      #pragma omp section440      {441        for(i=0;i<300;++i) {442          bit_or = bit_or | logics[i];443        }444      }445      #pragma omp section446      {447        for(i=300;i<700;++i) {448          bit_or = bit_or | logics[i];449        }450      }451      #pragma omp section452      {453        for(i=700;i<1000;++i) {454          bit_or = bit_or | logics[i];455        }456      }457    }458  }459  if(!bit_or) {460    result++;461    fprintf(stderr,"Error in BIT OR part 2\n");462  }463 464  for(i=0;i<1000;i++) {465    logics[i]=0;466  }467 468  #pragma omp parallel469  {470    #pragma omp sections private(i) reduction(^:exclusiv_bit_or)471    {472      #pragma omp section473      {474        for(i=0;i<300;++i) {475          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];476        }477      }478      #pragma omp section479      {480        for(i=300;i<700;++i) {481          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];482        }483      }484      #pragma omp section485      {486        for(i=700;i<1000;++i) {487          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];488        }489      }490    }491  }492  if(exclusiv_bit_or) {493    result++;494    fprintf(stderr,"Error in EXCLUSIV BIT OR part 1\n");495  }496 497  exclusiv_bit_or = 0;498  logics[501]=1;499 500  #pragma omp parallel501  {502    #pragma omp sections private(i) reduction(^:exclusiv_bit_or)503    {504      #pragma omp section505      {506        for(i=0;i<300;++i) {507          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];508        }509      }510      #pragma omp section511      {512        for(i=300;i<700;++i) {513          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];514        }515      }516      #pragma omp section517      {518        for(i=700;i<1000;++i) {519          exclusiv_bit_or = exclusiv_bit_or ^ logics[i];520        }521      }522    }523  }524  if(!exclusiv_bit_or) {525    result++;526    fprintf(stderr,"Error in EXCLUSIV BIT OR part 2\n");527  }528 529  /*printf("\nResult:%d\n",result);*/530  return (result==0);531}532int main()533{534  int i;535  int num_failed=0;536 537  for(i = 0; i < REPETITIONS; i++) {538    if(!test_omp_sections_reduction()) {539      num_failed++;540    }541  }542  return num_failed;543}544