175115Sfenner#include <omp.h> 275115Sfenner#include <stdlib.h> 375115Sfenner 475115Sfennerint 575115Sfennermain (void) 675115Sfenner{ 775115Sfenner int i = 0, j = 0, k = ~0, l; 875115Sfenner double d = 1.0; 975115Sfenner#pragma omp parallel num_threads(4) 1075115Sfenner { 1175115Sfenner#pragma omp single 1275115Sfenner { 1375115Sfenner i = 16; 1475115Sfenner k ^= (1 << 16); 1575115Sfenner d += 32.0; 1675115Sfenner } 1775115Sfenner 1875115Sfenner#pragma omp for reduction(+:i) reduction(*:d) reduction(&:k) 1975115Sfenner for (l = 0; l < 4; l++) 2075115Sfenner { 2175115Sfenner if (omp_get_num_threads () == 4 && (i != 0 || d != 1.0 || k != ~0)) 2275115Sfenner#pragma omp atomic 2375115Sfenner j |= 1; 2475115Sfenner 2575115Sfenner if (l == omp_get_thread_num ()) 2675115Sfenner { 2775115Sfenner i = omp_get_thread_num (); 2875115Sfenner d = i + 1; 2975115Sfenner k = ~(1 << (2 * i)); 3075115Sfenner } 3175115Sfenner } 3275115Sfenner 3375115Sfenner if (omp_get_num_threads () == 4) 3475115Sfenner { 3575115Sfenner if (i != (16 + 0 + 1 + 2 + 3)) 3675115Sfenner#pragma omp atomic 3775115Sfenner j |= 2; 3875115Sfenner if (d != (33.0 * 1.0 * 2.0 * 3.0 * 4.0)) 3975115Sfenner#pragma omp atomic 4075115Sfenner j |= 4; 4175115Sfenner if (k != (~0 ^ 0x55 ^ (1 << 16))) 4275115Sfenner#pragma omp atomic 4375115Sfenner j |= 8; 4475115Sfenner } 4575115Sfenner } 4675115Sfenner 4775115Sfenner if (j) 4875115Sfenner abort (); 4975115Sfenner return 0; 5075115Sfenner} 5175115Sfenner