ptr-attach-1.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include <stdlib.h>
  2. struct S
  3. {
  4. int a, b;
  5. int *ptr;
  6. int c, d;
  7. };
  8. typedef struct S S;
  9. #pragma omp declare target
  10. int *gp;
  11. #pragma omp end declare target
  12. #define N 10
  13. int main (void)
  14. {
  15. /* Test to see if pointer attachment works, for scalar pointers,
  16. and pointer fields in structures. */
  17. int *ptr = (int *) malloc (sizeof (int) * N);
  18. int *orig_ptr = ptr;
  19. #pragma omp target map (ptr, ptr[:N])
  20. {
  21. for (int i = 0; i < N; i++)
  22. ptr[i] = N - i;
  23. }
  24. if (ptr != orig_ptr)
  25. abort ();
  26. for (int i = 0; i < N; i++)
  27. if (ptr[i] != N - i)
  28. abort ();
  29. S s = { 0 };
  30. s.ptr = ptr;
  31. #pragma omp target map (s, s.ptr[:N])
  32. {
  33. for (int i = 0; i < N; i++)
  34. s.ptr[i] = i;
  35. s.a = 1;
  36. s.b = 2;
  37. }
  38. if (s.ptr != ptr)
  39. abort ();
  40. for (int i = 0; i < N; i++)
  41. if (s.ptr[i] != i)
  42. abort ();
  43. if (s.a != 1 || s.b != 2 || s.c != 0 || s.d != 0)
  44. abort ();
  45. gp = (int *) malloc (sizeof (int) * N);
  46. orig_ptr = gp;
  47. for (int i = 0; i < N; i++)
  48. gp[i] = i - 1;
  49. #pragma omp target map (gp[:N])
  50. {
  51. for (int i = 0; i < N; i++)
  52. gp[i] += 1;
  53. }
  54. if (gp != orig_ptr)
  55. abort ();
  56. for (int i = 0; i < N; i++)
  57. if (gp[i] != i)
  58. abort ();
  59. free (ptr);
  60. free (gp);
  61. return 0;
  62. }