omp-loop01.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <omp.h>
  5. #define MAX 1000
  6. void main1()
  7. {
  8. int i, N1, N2, step;
  9. int a[MAX], b[MAX];
  10. N1 = rand () % 13;
  11. N2 = rand () % (MAX - 51) + 50;
  12. step = rand () % 7 + 1;
  13. printf ("N1 = %d\nN2 = %d\nstep = %d\n", N1, N2, step);
  14. for (i = N1; i <= N2; i += step)
  15. a[i] = 42+ i;
  16. /* COUNTING UP (<). Fill in array 'b' in parallel. */
  17. memset (b, 0, sizeof b);
  18. #pragma omp parallel shared(a,b,N1,N2,step) private(i)
  19. {
  20. #pragma omp for
  21. for (i = N1; i < N2; i += step)
  22. b[i] = a[i];
  23. }
  24. /* COUNTING UP (<). Check that all the cells were filled in properly. */
  25. for (i = N1; i < N2; i += step)
  26. if (a[i] != b[i])
  27. abort ();
  28. printf ("for (i = %d; i < %d; i += %d) [OK]\n", N1, N2, step);
  29. /* COUNTING UP (<=). Fill in array 'b' in parallel. */
  30. memset (b, 0, sizeof b);
  31. #pragma omp parallel shared(a,b,N1,N2,step) private(i)
  32. {
  33. #pragma omp for
  34. for (i = N1; i <= N2; i += step)
  35. b[i] = a[i];
  36. }
  37. /* COUNTING UP (<=). Check that all the cells were filled in properly. */
  38. for (i = N1; i <= N2; i += step)
  39. if (a[i] != b[i])
  40. abort ();
  41. printf ("for (i = %d; i <= %d; i += %d) [OK]\n", N1, N2, step);
  42. /* COUNTING DOWN (>). Fill in array 'b' in parallel. */
  43. memset (b, 0, sizeof b);
  44. #pragma omp parallel shared(a,b,N1,N2,step) private(i)
  45. {
  46. #pragma omp for
  47. for (i = N2; i > N1; i -= step)
  48. b[i] = a[i];
  49. }
  50. /* COUNTING DOWN (>). Check that all the cells were filled in properly. */
  51. for (i = N2; i > N1; i -= step)
  52. if (a[i] != b[i])
  53. abort ();
  54. printf ("for (i = %d; i > %d; i -= %d) [OK]\n", N2, N1, step);
  55. /* COUNTING DOWN (>=). Fill in array 'b' in parallel. */
  56. memset (b, 0, sizeof b);
  57. #pragma omp parallel shared(a,b,N1,N2,step) private(i)
  58. {
  59. #pragma omp for
  60. for (i = N2; i >= N1; i -= step)
  61. b[i] = a[i];
  62. }
  63. /* COUNTING DOWN (>=). Check that all the cells were filled in properly. */
  64. for (i = N2; i >= N1; i -= step)
  65. if (a[i] != b[i])
  66. abort ();
  67. printf ("for (i = %d; i >= %d; i -= %d) [OK]\n", N2, N1, step);
  68. }
  69. int
  70. main ()
  71. {
  72. int i;
  73. srand (0);
  74. for (i = 0; i < 10; ++i)
  75. main1();
  76. return 0;
  77. }