[Mlir-commits] [llvm] [mlir] [OMPIRBuilder] - Make offloading input data persist for deferred target tasks (PR #133499)
Sergio Afonso
llvmlistbot at llvm.org
Thu May 8 05:50:53 PDT 2025
================
@@ -7204,55 +7287,80 @@ OpenMPIRBuilder::InsertPointOrErrorTy OpenMPIRBuilder::emitTargetTask(
// (iii) Create a task with the task entry point created in (ii)
//
// That is we create the following
- //
+ // struct task_with_privates {
+ // struct kmp_task_ompbuilder_t;
+ // struct privates {
+ // [2 x ptr], ; baseptrs
+ // [2 x ptr] ; ptrs
+ // [2 x i64] ; sizes
+ // }
+ // }
// void user_code_that_offloads(...) {
- // %.offload_baseptrs = alloca [3 x ptr], align 8
- // %.offload_ptrs = alloca [3 x ptr], align 8
- // %.offload_mappers = alloca [3 x ptr], align 8
+ // %.offload_baseptrs = alloca [2 x ptr], align 8
+ // %.offload_ptrs = alloca [2 x ptr], align 8
+ // %.offload_sizes = alloca [2 x i64], align 8
//
// %structArg = alloca { ptr, ptr, ptr }, align 8
- // %strucArg[0] = %.offload_baseptrs
- // %strucArg[1] = %.offload_ptrs
- // %strucArg[2] = %.offload_mappers
- // proxy_target_task = @__kmpc_omp_task_alloc(...,
- // @.omp_target_task_proxy_func)
- // memcpy(proxy_target_task->shareds, %structArg, sizeof(structArg))
+ // %strucArg[0] = a
+ // %strucArg[1] = b
+ // %strucArg[2] = &n
+ //
+ // target_task_with_privates = @__kmpc_omp_target_task_alloc(...,
+ // sizeof(kmp_task_ompbuilder_t),
+ // sizeof(structArg),
+ // @.omp_target_task_proxy_func,
+ // ...)
+ // memcpy(target_task->shareds, %structArg, sizeof(structArg))
+ // memcpy(target_task->privates->baseptrs,
+ // offload_baseptrs, sizeof(offload_baseptrs)
+ // memcpy(target_task->privates->ptrs,
+ // offload_ptrs, sizeof(offload_ptrs)
+ // memcpy(target_task->privates->sizes,
+ // offload_sizes, sizeof(offload_sizes)
// dependencies_array = ...
// ;; if nowait not present
// call @__kmpc_omp_wait_deps(..., dependencies_array)
// call @__kmpc_omp_task_begin_if0(...)
// call @ @.omp_target_task_proxy_func(i32 thread_id, ptr
- // %proxy_target_task) call @__kmpc_omp_task_complete_if0(...)
+ // %target_task_with_privates)
+ // call @__kmpc_omp_task_complete_if0(...)
// }
//
// define internal void @.omp_target_task_proxy_func(i32 %thread.id,
// ptr %task) {
// %structArg = alloca {ptr, ptr, ptr}
- // %shared_data = load (getelementptr %task, 0, 0)
- // mempcy(%structArg, %shared_data, sizeof(structArg))
- // kernel_launch_function(%thread.id, %structArg)
+ // %task_ptr = getelementptr(%task, 0, 0)
+ // %shared_data = load (getelementptr %task_ptr, 0, 0)
+ // mempcy(%structArg, %shared_data, sizeof(%structArg))
+ //
+ // %offloading_arrays = getelementptr(%task, 0, 1)
+ // %offload_baseptrs = getelementptr(%offloading_arrays, 0, 0)
+ // %offload_ptrs = getelementptr(%offloading_arrays, 0, 1)
+ // %offload_sizes = getelementptr(%offloading_arrays, 0, 2)
+ // kernel_launch_function(%thread.id, %offload_baseptrs, %offload_ptrs,
+ // %offload_sizes, %structArg)
// }
//
// We need the proxy function because the signature of the task entry point
// expected by kmpc_omp_task is always the same and will be different from
// that of the kernel_launch function.
//
// kernel_launch_function is generated by emitKernelLaunch and has the
- // always_inline attribute.
- // void kernel_launch_function(thread_id,
- // structArg) alwaysinline {
+ // always_inline attribute. For this example, it'll look like so
----------------
skatrak wrote:
```suggestion
// always_inline attribute. For this example, it'll look like so:
```
https://github.com/llvm/llvm-project/pull/133499
More information about the Mlir-commits
mailing list