blob: 05af57692b7af0bf1ecccd7c968fa2e0a375aa5f [file] [log] [blame] [edit]
// 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