1*404b540aSrobert #include <omp.h> 2*404b540aSrobert 3*404b540aSrobert extern "C" void abort (void); 4*404b540aSrobert 5*404b540aSrobert struct Y 6*404b540aSrobert { 7*404b540aSrobert int l[5][10]; 8*404b540aSrobert }; 9*404b540aSrobert 10*404b540aSrobert struct X 11*404b540aSrobert { 12*404b540aSrobert struct Y y; 13*404b540aSrobert float b[10]; 14*404b540aSrobert }; 15*404b540aSrobert 16*404b540aSrobert void parallel(int a,int b)17*404b540aSrobertparallel (int a, int b) 18*404b540aSrobert { 19*404b540aSrobert int i, j; 20*404b540aSrobert struct X A[10][5]; 21*404b540aSrobert a = b = 3; 22*404b540aSrobert 23*404b540aSrobert for (i = 0; i < 10; i++) 24*404b540aSrobert for (j = 0; j < 5; j++) 25*404b540aSrobert A[i][j].y.l[3][3] = -10; 26*404b540aSrobert 27*404b540aSrobert #pragma omp parallel shared (a, b, A) num_threads (5) 28*404b540aSrobert { 29*404b540aSrobert int i, j; 30*404b540aSrobert 31*404b540aSrobert #pragma omp atomic 32*404b540aSrobert a += omp_get_num_threads (); 33*404b540aSrobert 34*404b540aSrobert #pragma omp atomic 35*404b540aSrobert b += omp_get_num_threads (); 36*404b540aSrobert 37*404b540aSrobert #pragma omp for private (j) 38*404b540aSrobert for (i = 0; i < 10; i++) 39*404b540aSrobert for (j = 0; j < 5; j++) 40*404b540aSrobert A[i][j].y.l[3][3] += 20; 41*404b540aSrobert 42*404b540aSrobert } 43*404b540aSrobert 44*404b540aSrobert for (i = 0; i < 10; i++) 45*404b540aSrobert for (j = 0; j < 5; j++) 46*404b540aSrobert if (A[i][j].y.l[3][3] != 10) 47*404b540aSrobert abort (); 48*404b540aSrobert 49*404b540aSrobert if (a != 28) 50*404b540aSrobert abort (); 51*404b540aSrobert 52*404b540aSrobert if (b != 28) 53*404b540aSrobert abort (); 54*404b540aSrobert } 55*404b540aSrobert main()56*404b540aSrobertmain() 57*404b540aSrobert { 58*404b540aSrobert parallel (1, 2); 59*404b540aSrobert return 0; 60*404b540aSrobert } 61