blob: 69a3b51c36e888a50dfc396d20ae4626b5f91e47 [file]
// RUN: %libomptarget-compile-generic
//
// RUN: env LIBOMPTARGET_DEBUG=1 LIBOMPTARGET_INFO=32 \
// RUN: %libomptarget-run-generic 2>&1 \
// RUN: | %fcheck-generic -check-prefix=DEBUG
//
// RUN: %libomptarget-run-generic 2>&1 | %fcheck-generic -check-prefix=CHECK
//
// REQUIRES: libomptarget-debug
// Ensure that the packed host buffer used to send firstprivate data to the
// device is released only after the transfer is done, i.e. that the buffer
// submitData() reads from is still alive when the queued device operations
// complete.
//
// The firstprivate payload has to be larger than a pointer for the runtime to
// allocate a separate host buffer for it, and small enough to be packed rather
// than transferred on its own, so use an explicitly-sized 48-byte array.
#include <stdint.h>
#include <stdio.h>
#define N 6
int main(void) {
uint64_t a[N];
for (int i = 0; i < N; ++i)
a[i] = i + 1;
int ok = 0;
// clang-format off
// The packed buffer is what gets submitted as the host source, ...
// DEBUG: Firstprivate array 0x{{.*}} of size 48 will be packed
// DEBUG: Submitting packed firstprivate arguments from host buffer at 0x[[#%x,BUF:]]
// DEBUG: Copying data from host to device, HstPtr=0x{{0*}}[[#BUF]], {{.*}}, Size=48
// ... and it is still alive once the queued operations have completed, which
// is when the release runs.
// DEBUG: Synchronization complete, running post-processing
// DEBUG: Releasing submitData source buffer at 0x{{0*}}[[#BUF]]
// clang-format on
#pragma omp target firstprivate(a) map(from : ok)
{
ok = 1;
for (int i = 0; i < N; ++i)
if (a[i] != i + 1)
ok = 0;
}
// CHECK: values_intact=1
printf("values_intact=%d\n", ok);
return 0;
}