[Openmp-commits] [PATCH] D59783: [OpenMP] Implement 5.0 memory management
Shilei Tian via Phabricator via Openmp-commits
openmp-commits at lists.llvm.org
Fri Jan 20 19:02:19 PST 2023
tianshilei1992 added inline comments.
Herald added subscribers: sstefan1, yaxunl.
Herald added a reviewer: jdoerfert.
Herald added a project: All.
================
Comment at: runtime/src/include/50/omp.h.var:299
+ omp_thread_mem_alloc = 8,
+ KMP_ALLOCATOR_MAX_HANDLE = UINTPTR_MAX
+ } omp_allocator_handle_t;
----------------
This enum causes the front end some troubles.
```
extern int printf(const char *, ...);
typedef enum omp_allocator_handle_t {
omp_null_allocator = 0,
omp_default_mem_alloc = 1,
omp_large_cap_mem_alloc = 2,
omp_const_mem_alloc = 3,
omp_high_bw_mem_alloc = 4,
omp_low_lat_mem_alloc = 5,
omp_cgroup_mem_alloc = 6,
omp_pteam_mem_alloc = 7,
omp_thread_mem_alloc = 8,
llvm_omp_target_host_mem_alloc = 100,
llvm_omp_target_shared_mem_alloc = 101,
llvm_omp_target_device_mem_alloc = 102,
KMP_ALLOCATOR_MAX_HANDLE = 18446744073709551615UL
} omp_allocator_handle_t;
int main(int argc, char *argv[]) {
printf("sizeof(omp_allocator_handle_t)=%zu, sizeof(omp_null_allocator)=%zu\n",
sizeof(omp_allocator_handle_t), sizeof(omp_null_allocator));
return 0;
}
```
This simple code shows that `sizeof(omp_allocator_handle_t)=8`, while `sizeof(omp_null_allocator)=4`. It is not safe to assume that all members of the enum will be of the same type as `omp_allocator_handle_t`. It's not generally a problem at runtime, but things are messed up in front end if user uses allocators.
In clang, in order to determine the type of `omp_allocator_handle_t`, clang checks the type of those predefined allocators. The first one it checks is `omp_null_allocator`. What clang gets is a `int`, instead of an enum of size 8. If the allocator is captured by a region, let's say a parallel region, the allocator will be privatized. Because clang deems `omp_allocator_handle_t` as an `int`, it will first cast the value returned by runtime (for `libomp` it is a `void *`) to `int`, and then in the outlined function, it casts the `int` back to `omp_allocator_handle_t`. This two casts completely shaves the first 32-bit of the pointer, and when the private "new" pointer is fed to another runtime function call `__kmpc_allocate()`, it causes segment fault.
Can we define those allocators like how they are defined on Windows, aka global variables? This can make sure the size is fixed.
Repository:
rOMP OpenMP
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D59783/new/
https://reviews.llvm.org/D59783
More information about the Openmp-commits
mailing list