
Currently, libomptarget will always perform a host-to-device memory transfer in order to update the device pointer of a PTR_AND_OBJ entry. This is not always necessary because the device pointer may have been set to the correct pointee address already, so we can eliminate the redundant memory transfer.
45 lines
903 B
C
45 lines
903 B
C
// RUN: %libomptarget-compile-generic
|
|
// RUN: env LIBOMPTARGET_DEBUG=1 %libomptarget-run-generic 2>&1 \
|
|
// RUN: | %fcheck-generic -check-prefix=DEBUG -check-prefix=CHECK
|
|
// REQUIRES: libomptarget-debug
|
|
|
|
#include <stdio.h>
|
|
|
|
struct S {
|
|
int *p;
|
|
};
|
|
|
|
int main(void) {
|
|
int A[10];
|
|
struct S s1;
|
|
|
|
s1.p = A;
|
|
|
|
// DEBUG: Update pointer ([[DEV_PTR:0x[^ ]+]]) -> {{\[}}[[DEV_OBJ_A:0x[^ ]+]]{{\]}}
|
|
#pragma omp target enter data map(alloc : s1.p [0:10])
|
|
|
|
// DEBUG-NOT: Update pointer ([[DEV_PTR]]) -> {{\[}}[[DEV_OBJ_A]]{{\]}}
|
|
#pragma omp target map(alloc : s1.p [0:10])
|
|
{
|
|
for (int i = 0; i < 10; ++i)
|
|
s1.p[i] = i;
|
|
}
|
|
|
|
#pragma omp target exit data map(from : s1.p [0:10])
|
|
|
|
int fail_A = 0;
|
|
for (int i = 0; i < 10; ++i) {
|
|
if (A[i] != i) {
|
|
fail_A = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// CHECK-NOT: Test A failed
|
|
if (fail_A) {
|
|
printf("Test A failed\n");
|
|
}
|
|
|
|
return fail_A;
|
|
}
|