Skip to content

Commit d6281ca

Browse files
committed
[OpenMP] Add API for pinned memory
This patch adds API support for the atk_pinned trait for omp_alloc. It does not implement kmp_target_lock_mem and kmp_target_unlock_mem in libomptarget, but prepares libomp for it. Patches to libomptarget to implement lock/unlock coming after this one. Reviewed by: jlpeyton, jdoerfert Differential Revision: https://reviews.llvm.org/D138933
1 parent da80639 commit d6281ca

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

openmp/runtime/src/kmp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,6 +1033,7 @@ typedef struct kmp_allocator_t {
10331033
kmp_allocator_t *fb_data;
10341034
kmp_uint64 pool_size;
10351035
kmp_uint64 pool_used;
1036+
bool pinned;
10361037
} kmp_allocator_t;
10371038

10381039
extern omp_allocator_handle_t __kmpc_init_allocator(int gtid,

openmp/runtime/src/kmp_alloc.cpp

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,6 +1245,8 @@ static void **mk_dax_kmem_preferred;
12451245
static void *(*kmp_target_alloc_host)(size_t size, int device);
12461246
static void *(*kmp_target_alloc_shared)(size_t size, int device);
12471247
static void *(*kmp_target_alloc_device)(size_t size, int device);
1248+
static void *(*kmp_target_lock_mem)(void *ptr, size_t size, int device);
1249+
static void *(*kmp_target_unlock_mem)(void *ptr, int device);
12481250
static void *(*kmp_target_free_host)(void *ptr, int device);
12491251
static void *(*kmp_target_free_shared)(void *ptr, int device);
12501252
static void *(*kmp_target_free_device)(void *ptr, int device);
@@ -1386,7 +1388,9 @@ omp_allocator_handle_t __kmpc_init_allocator(int gtid, omp_memspace_handle_t ms,
13861388
switch (traits[i].key) {
13871389
case omp_atk_sync_hint:
13881390
case omp_atk_access:
1391+
break;
13891392
case omp_atk_pinned:
1393+
al->pinned = true;
13901394
break;
13911395
case omp_atk_alignment:
13921396
__kmp_type_convert(traits[i].value, &(al->alignment));
@@ -1545,6 +1549,8 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
15451549
return NULL;
15461550
if (allocator == omp_null_allocator)
15471551
allocator = __kmp_threads[gtid]->th.th_def_allocator;
1552+
kmp_int32 default_device =
1553+
__kmp_threads[gtid]->th.th_current_task->td_icvs.default_device;
15481554

15491555
al = RCAST(kmp_allocator_t *, allocator);
15501556

@@ -1560,6 +1566,9 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
15601566
align = algn; // max of allocator trait, parameter and sizeof(void*)
15611567
desc.size_orig = size;
15621568
desc.size_a = size + sz_desc + align;
1569+
bool is_pinned = false;
1570+
if (allocator > kmp_max_mem_alloc)
1571+
is_pinned = al->pinned;
15631572

15641573
// Use default allocator if libmemkind is not available
15651574
int use_default_allocator = (__kmp_memkind_available) ? false : true;
@@ -1589,7 +1598,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
15891598
} else if (al->fb == omp_atv_allocator_fb) {
15901599
KMP_ASSERT(al != al->fb_data);
15911600
al = al->fb_data;
1592-
return __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
1601+
ptr = __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
1602+
if (is_pinned && kmp_target_lock_mem)
1603+
kmp_target_lock_mem(ptr, size, default_device);
1604+
return ptr;
15931605
} // else ptr == NULL;
15941606
} else {
15951607
// pool has enough space
@@ -1603,7 +1615,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
16031615
} else if (al->fb == omp_atv_allocator_fb) {
16041616
KMP_ASSERT(al != al->fb_data);
16051617
al = al->fb_data;
1606-
return __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
1618+
ptr = __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
1619+
if (is_pinned && kmp_target_lock_mem)
1620+
kmp_target_lock_mem(ptr, size, default_device);
1621+
return ptr;
16071622
}
16081623
}
16091624
}
@@ -1619,7 +1634,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
16191634
} else if (al->fb == omp_atv_allocator_fb) {
16201635
KMP_ASSERT(al != al->fb_data);
16211636
al = al->fb_data;
1622-
return __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
1637+
ptr = __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
1638+
if (is_pinned && kmp_target_lock_mem)
1639+
kmp_target_lock_mem(ptr, size, default_device);
1640+
return ptr;
16231641
}
16241642
}
16251643
}
@@ -1689,7 +1707,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
16891707
} else if (al->fb == omp_atv_allocator_fb) {
16901708
KMP_ASSERT(al != al->fb_data);
16911709
al = al->fb_data;
1692-
return __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
1710+
ptr = __kmp_alloc(gtid, algn, size, (omp_allocator_handle_t)al);
1711+
if (is_pinned && kmp_target_lock_mem)
1712+
kmp_target_lock_mem(ptr, size, default_device);
1713+
return ptr;
16931714
} // else ptr == NULL;
16941715
} else {
16951716
// pool has enough space
@@ -1709,6 +1730,9 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
17091730
if (ptr == NULL)
17101731
return NULL;
17111732

1733+
if (is_pinned && kmp_target_lock_mem)
1734+
kmp_target_lock_mem(ptr, desc.size_a, default_device);
1735+
17121736
addr = (kmp_uintptr_t)ptr;
17131737
addr_align = (addr + sz_desc + align - 1) & ~(align - 1);
17141738
addr_descr = addr_align - sz_desc;
@@ -1825,6 +1849,12 @@ void ___kmpc_free(int gtid, void *ptr, omp_allocator_handle_t allocator) {
18251849
oal = (omp_allocator_handle_t)al; // cast to void* for comparisons
18261850
KMP_DEBUG_ASSERT(al);
18271851

1852+
if (allocator > kmp_max_mem_alloc && kmp_target_unlock_mem && al->pinned) {
1853+
kmp_int32 device =
1854+
__kmp_threads[gtid]->th.th_current_task->td_icvs.default_device;
1855+
kmp_target_unlock_mem(desc.ptr_alloc, device);
1856+
}
1857+
18281858
if (__kmp_memkind_available) {
18291859
if (oal < kmp_max_mem_alloc) {
18301860
// pre-defined allocator

0 commit comments

Comments
 (0)