| // RUN: %libomptarget-compile-run-and-check-generic |
| // UNSUPPORTED: intelgpu |
| // Make sure multi-dimensional strided offset update works correctly. |
| |
| #include <stdio.h> |
| |
| #define N 6 |
| #define SLICE1 1 : 2 : 2 |
| #define SLICE2 2 : 3 |
| int main() { |
| int darr[N][N]; |
| |
| for (int i = 0; i < N; i++) |
| for (int j = 0; j < N; j++) |
| darr[i][j] = 100 + 10 * i + j; |
| |
| printf("Full array\n"); |
| for (int i = 0; i < N; i++) { |
| for (int j = 0; j < N; j++) { |
| printf("\t%d", darr[i][j]); |
| } |
| printf("\n"); |
| } |
| |
| #pragma omp target enter data map(alloc : darr[0 : N][0 : N]) |
| |
| // Zero out target array. |
| #pragma omp target |
| for (int i = 0; i < N; i++) |
| for (int j = 0; j < N; j++) |
| darr[i][j] = 0; |
| |
| // Only copy over the slice to the device. |
| #pragma omp target update to(darr[SLICE1][SLICE2]) |
| // Then copy over the entire array to the host. |
| #pragma omp target exit data map(from : darr[0 : N][0 : N]) |
| |
| printf("Only slice (to)\n"); |
| for (int i = 0; i < N; i++) { |
| for (int j = 0; j < N; j++) { |
| printf("\t%d", darr[i][j]); |
| } |
| printf("\n"); |
| } |
| |
| #pragma omp target enter data map(alloc : darr[0 : N][0 : N]) |
| |
| // Initialize on the device |
| #pragma omp target |
| for (int i = 0; i < N; i++) |
| for (int j = 0; j < N; j++) |
| darr[i][j] = 100 + 10 * i + j; |
| |
| // Zero out host array. |
| for (int i = 0; i < N; i++) |
| for (int j = 0; j < N; j++) |
| darr[i][j] = 0; |
| |
| // Copy over only the slice to the host |
| #pragma omp target update from(darr[SLICE1][SLICE2]) |
| #pragma omp target exit data map(delete : darr[0 : N][0 : N]) |
| |
| printf("Only slice (from)\n"); |
| for (int i = 0; i < N; i++) { |
| for (int j = 0; j < N; j++) { |
| printf("\t%d", darr[i][j]); |
| } |
| printf("\n"); |
| } |
| |
| return 0; |
| } |
| |
| // CHECK: Full array |
| // CHECK-NEXT: 100 101 102 103 104 105 |
| // CHECK-NEXT: 110 111 112 113 114 115 |
| // CHECK-NEXT: 120 121 122 123 124 125 |
| // CHECK-NEXT: 130 131 132 133 134 135 |
| // CHECK-NEXT: 140 141 142 143 144 145 |
| // CHECK-NEXT: 150 151 152 153 154 155 |
| // CHECK-NEXT: Only slice (to) |
| // CHECK-NEXT: 0 0 0 0 0 0 |
| // CHECK-NEXT: 0 0 112 113 114 0 |
| // CHECK-NEXT: 0 0 0 0 0 0 |
| // CHECK-NEXT: 0 0 132 133 134 0 |
| // CHECK-NEXT: 0 0 0 0 0 0 |
| // CHECK-NEXT: 0 0 0 0 0 0 |
| // CHECK-NEXT: Only slice (from) |
| // CHECK-NEXT: 0 0 0 0 0 0 |
| // CHECK-NEXT: 0 0 112 113 114 0 |
| // CHECK-NEXT: 0 0 0 0 0 0 |
| // CHECK-NEXT: 0 0 132 133 134 0 |
| // CHECK-NEXT: 0 0 0 0 0 0 |
| // CHECK-NEXT: 0 0 0 0 0 0 |