shared-1.c 843 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. extern void abort (void);
  2. extern int omp_get_num_threads (void);
  3. struct Y
  4. {
  5. int l[5][10];
  6. };
  7. struct X
  8. {
  9. struct Y y;
  10. float b[10];
  11. };
  12. void
  13. parallel (int a, int b)
  14. {
  15. int i, j;
  16. struct X A[10][5];
  17. a = b = 3;
  18. for (i = 0; i < 10; i++)
  19. for (j = 0; j < 5; j++)
  20. A[i][j].y.l[3][3] = -10;
  21. #pragma omp parallel shared (a, b, A) num_threads (5)
  22. {
  23. int i, j;
  24. #pragma omp atomic
  25. a += omp_get_num_threads ();
  26. #pragma omp atomic
  27. b += omp_get_num_threads ();
  28. #pragma omp for private (j)
  29. for (i = 0; i < 10; i++)
  30. for (j = 0; j < 5; j++)
  31. A[i][j].y.l[3][3] += 20;
  32. }
  33. for (i = 0; i < 10; i++)
  34. for (j = 0; j < 5; j++)
  35. if (A[i][j].y.l[3][3] != 10)
  36. abort ();
  37. if (a != 28)
  38. abort ();
  39. if (b != 28)
  40. abort ();
  41. }
  42. int
  43. main()
  44. {
  45. parallel (1, 2);
  46. return 0;
  47. }