@@ -1245,6 +1245,8 @@ static void **mk_dax_kmem_preferred;
1245
1245
static void *(*kmp_target_alloc_host)(size_t size, int device);
1246
1246
static void *(*kmp_target_alloc_shared)(size_t size, int device);
1247
1247
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);
1248
1250
static void *(*kmp_target_free_host)(void *ptr, int device);
1249
1251
static void *(*kmp_target_free_shared)(void *ptr, int device);
1250
1252
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,
1386
1388
switch (traits[i].key ) {
1387
1389
case omp_atk_sync_hint:
1388
1390
case omp_atk_access:
1391
+ break ;
1389
1392
case omp_atk_pinned:
1393
+ al->pinned = true ;
1390
1394
break ;
1391
1395
case omp_atk_alignment:
1392
1396
__kmp_type_convert (traits[i].value , &(al->alignment ));
@@ -1545,6 +1549,8 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
1545
1549
return NULL ;
1546
1550
if (allocator == omp_null_allocator)
1547
1551
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 ;
1548
1554
1549
1555
al = RCAST (kmp_allocator_t *, allocator);
1550
1556
@@ -1560,6 +1566,9 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
1560
1566
align = algn; // max of allocator trait, parameter and sizeof(void*)
1561
1567
desc.size_orig = size;
1562
1568
desc.size_a = size + sz_desc + align;
1569
+ bool is_pinned = false ;
1570
+ if (allocator > kmp_max_mem_alloc)
1571
+ is_pinned = al->pinned ;
1563
1572
1564
1573
// Use default allocator if libmemkind is not available
1565
1574
int use_default_allocator = (__kmp_memkind_available) ? false : true ;
@@ -1589,7 +1598,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
1589
1598
} else if (al->fb == omp_atv_allocator_fb) {
1590
1599
KMP_ASSERT (al != al->fb_data );
1591
1600
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;
1593
1605
} // else ptr == NULL;
1594
1606
} else {
1595
1607
// pool has enough space
@@ -1603,7 +1615,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
1603
1615
} else if (al->fb == omp_atv_allocator_fb) {
1604
1616
KMP_ASSERT (al != al->fb_data );
1605
1617
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;
1607
1622
}
1608
1623
}
1609
1624
}
@@ -1619,7 +1634,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
1619
1634
} else if (al->fb == omp_atv_allocator_fb) {
1620
1635
KMP_ASSERT (al != al->fb_data );
1621
1636
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;
1623
1641
}
1624
1642
}
1625
1643
}
@@ -1689,7 +1707,10 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
1689
1707
} else if (al->fb == omp_atv_allocator_fb) {
1690
1708
KMP_ASSERT (al != al->fb_data );
1691
1709
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;
1693
1714
} // else ptr == NULL;
1694
1715
} else {
1695
1716
// pool has enough space
@@ -1709,6 +1730,9 @@ void *__kmp_alloc(int gtid, size_t algn, size_t size,
1709
1730
if (ptr == NULL )
1710
1731
return NULL ;
1711
1732
1733
+ if (is_pinned && kmp_target_lock_mem)
1734
+ kmp_target_lock_mem (ptr, desc.size_a , default_device);
1735
+
1712
1736
addr = (kmp_uintptr_t )ptr;
1713
1737
addr_align = (addr + sz_desc + align - 1 ) & ~(align - 1 );
1714
1738
addr_descr = addr_align - sz_desc;
@@ -1825,6 +1849,12 @@ void ___kmpc_free(int gtid, void *ptr, omp_allocator_handle_t allocator) {
1825
1849
oal = (omp_allocator_handle_t )al; // cast to void* for comparisons
1826
1850
KMP_DEBUG_ASSERT (al);
1827
1851
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
+
1828
1858
if (__kmp_memkind_available) {
1829
1859
if (oal < kmp_max_mem_alloc) {
1830
1860
// pre-defined allocator
0 commit comments