target-18.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. extern void abort (void);
  2. struct S { int e, f; };
  3. void
  4. foo (int n)
  5. {
  6. int a[4] = { 0, 1, 2, 3 }, b[n], c = 4;
  7. struct S d = { 5, 6 };
  8. int *p = a + 1, i, err;
  9. for (i = 0; i < n; i++)
  10. b[i] = 9 + i;
  11. #pragma omp target data map(to:a)
  12. #pragma omp target data use_device_ptr(p) map(from:err)
  13. #pragma omp target is_device_ptr(p) private(i) map(from:err)
  14. {
  15. err = 0;
  16. for (i = 0; i < 4; i++)
  17. if (p[i - 1] != i)
  18. err = 1;
  19. }
  20. if (err)
  21. abort ();
  22. for (i = 0; i < 4; i++)
  23. a[i] = 23 + i;
  24. #pragma omp target data map(to:a)
  25. #pragma omp target data use_device_addr(a) map(from:err)
  26. #pragma omp target is_device_ptr(a) private(i) map(from:err)
  27. {
  28. err = 0;
  29. for (i = 0; i < 4; i++)
  30. if (a[i] != 23 + i)
  31. err = 1;
  32. }
  33. if (err)
  34. abort ();
  35. #pragma omp target data map(to:b)
  36. #pragma omp target data use_device_addr(b) map(from:err)
  37. #pragma omp target is_device_ptr(b) private(i) map(from:err)
  38. {
  39. err = 0;
  40. for (i = 0; i < 4; i++)
  41. if (b[i] != 9 + i)
  42. err = 1;
  43. }
  44. if (err)
  45. abort ();
  46. #pragma omp target data map(to:c)
  47. #pragma omp target data use_device_addr(c) map(from:err)
  48. {
  49. int *q = &c;
  50. #pragma omp target is_device_ptr(q) map(from:err)
  51. {
  52. err = *q != 4;
  53. }
  54. }
  55. if (err)
  56. abort ();
  57. #pragma omp target data map(to:d)
  58. #pragma omp target data use_device_addr(d) map(from:err)
  59. {
  60. struct S *r = &d;
  61. #pragma omp target is_device_ptr(r) map(from:err)
  62. {
  63. err = r->e != 5 || r->f != 6;
  64. }
  65. }
  66. if (err)
  67. abort ();
  68. }
  69. int
  70. main ()
  71. {
  72. foo (9);
  73. return 0;
  74. }