Skip to content

Commit 5c26cda

Browse files
[OMPIRBuilder] Fix for SWDEV 503141 target .. nowait (llvm#631)
When we offload to the target, the pointers to data used by the kernel are passed in arrays of pointers created by OMPIRBuilder. These arrays of pointers are allocated on the stack on the host. This is fine for the most part because target tasks are included tasks i.e. the host waits for the target task to complete (in other words, the target kernel) before proceeding. This means that the host's stack frame is intact and accessing the array of pointers when offloading is safe. However, when nowait is used on the omp target instance, then the target task is a deferred task meaning, the generating task on the host does not have to wait for the target kernel to finish. In such cases, it is very likely that the stack frame of the function invoking the target call is wound up before the target task completes thereby leading to potential memory access errors seen below AMDGPU error: Error in hsa_amd_memory_pool_allocate: HSA_STATUS_ERROR_INVALID_ALLOCATION: The requested allocation is not valid. "PluginInterface" error: Failure to allocate device memory: Failed to allocate from memory manager This fix implements support in OMPIRBuilder to store the arrays of pointers into the task structure that is passed to the target task thereby ensuring it is available to the target task when it is eventually scheduled.
2 parents 55f26dc + d53296a commit 5c26cda

File tree

4 files changed

+264
-98
lines changed

4 files changed

+264
-98
lines changed

llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2492,7 +2492,7 @@ class OpenMPIRBuilder {
24922492
TargetTaskBodyCallbackTy TaskBodyCB, Value *DeviceID, Value *RTLoc,
24932493
OpenMPIRBuilder::InsertPointTy AllocaIP,
24942494
const SmallVector<llvm::OpenMPIRBuilder::DependData> &Dependencies,
2495-
bool HasNoWait);
2495+
TargetDataRTArgs &RTArgs, bool HasNoWait);
24962496

24972497
/// Emit the arguments to be passed to the runtime library based on the
24982498
/// arrays of base pointers, pointers, sizes, map types, and mappers. If

0 commit comments

Comments
 (0)