@@ -1239,6 +1239,9 @@ static void **mk_hbw_preferred;
1239
1239
static void **mk_hugetlb;
1240
1240
static void **mk_hbw_hugetlb;
1241
1241
static void **mk_hbw_preferred_hugetlb;
1242
+ static void **mk_dax_kmem;
1243
+ static void **mk_dax_kmem_all;
1244
+ static void **mk_dax_kmem_preferred;
1242
1245
1243
1246
#if KMP_OS_UNIX && KMP_DYNAMIC_LIB
1244
1247
static inline void chk_kind (void ***pkind) {
@@ -1279,25 +1282,21 @@ void __kmp_init_memkind() {
1279
1282
mk_hbw_preferred_hugetlb =
1280
1283
(void **)dlsym (h_memkind, " MEMKIND_HBW_PREFERRED_HUGETLB" );
1281
1284
chk_kind (&mk_hbw_preferred_hugetlb);
1285
+ mk_dax_kmem = (void **)dlsym (h_memkind, " MEMKIND_DAX_KMEM" );
1286
+ chk_kind (&mk_dax_kmem);
1287
+ mk_dax_kmem_all = (void **)dlsym (h_memkind, " MEMKIND_DAX_KMEM_ALL" );
1288
+ chk_kind (&mk_dax_kmem_all);
1289
+ mk_dax_kmem_preferred =
1290
+ (void **)dlsym (h_memkind, " MEMKIND_DAX_KMEM_PREFERRED" );
1291
+ chk_kind (&mk_dax_kmem_preferred);
1282
1292
KE_TRACE (25 , (" __kmp_init_memkind: memkind library initialized\n " ));
1283
1293
return ; // success
1284
1294
}
1285
1295
dlclose (h_memkind); // failure
1286
- h_memkind = NULL ;
1287
1296
}
1288
- kmp_mk_check = NULL ;
1289
- kmp_mk_alloc = NULL ;
1290
- kmp_mk_free = NULL ;
1291
- mk_default = NULL ;
1292
- mk_interleave = NULL ;
1293
- mk_hbw = NULL ;
1294
- mk_hbw_interleave = NULL ;
1295
- mk_hbw_preferred = NULL ;
1296
- mk_hugetlb = NULL ;
1297
- mk_hbw_hugetlb = NULL ;
1298
- mk_hbw_preferred_hugetlb = NULL ;
1299
- #else
1297
+ #else // !(KMP_OS_UNIX && KMP_DYNAMIC_LIB)
1300
1298
kmp_mk_lib_name = " " ;
1299
+ #endif // !(KMP_OS_UNIX && KMP_DYNAMIC_LIB)
1301
1300
h_memkind = NULL ;
1302
1301
kmp_mk_check = NULL ;
1303
1302
kmp_mk_alloc = NULL ;
@@ -1310,7 +1309,9 @@ void __kmp_init_memkind() {
1310
1309
mk_hugetlb = NULL ;
1311
1310
mk_hbw_hugetlb = NULL ;
1312
1311
mk_hbw_preferred_hugetlb = NULL ;
1313
- #endif
1312
+ mk_dax_kmem = NULL ;
1313
+ mk_dax_kmem_all = NULL ;
1314
+ mk_dax_kmem_preferred = NULL ;
1314
1315
}
1315
1316
1316
1317
void __kmp_fini_memkind () {
@@ -1332,6 +1333,9 @@ void __kmp_fini_memkind() {
1332
1333
mk_hugetlb = NULL ;
1333
1334
mk_hbw_hugetlb = NULL ;
1334
1335
mk_hbw_preferred_hugetlb = NULL ;
1336
+ mk_dax_kmem = NULL ;
1337
+ mk_dax_kmem_all = NULL ;
1338
+ mk_dax_kmem_preferred = NULL ;
1335
1339
#endif
1336
1340
}
1337
1341
@@ -1401,6 +1405,17 @@ omp_allocator_handle_t __kmpc_init_allocator(int gtid, omp_memspace_handle_t ms,
1401
1405
__kmp_free (al);
1402
1406
return omp_null_allocator;
1403
1407
}
1408
+ } else if (ms == omp_large_cap_mem_space) {
1409
+ if (mk_dax_kmem_all) {
1410
+ // All pmem nodes are visited
1411
+ al->memkind = mk_dax_kmem_all;
1412
+ } else if (mk_dax_kmem) {
1413
+ // Only closest pmem node is visited
1414
+ al->memkind = mk_dax_kmem;
1415
+ } else {
1416
+ __kmp_free (al);
1417
+ return omp_null_allocator;
1418
+ }
1404
1419
} else {
1405
1420
if (al->memkind == (void *)omp_atv_interleaved && mk_interleave) {
1406
1421
al->memkind = mk_interleave;
@@ -1473,6 +1488,8 @@ void *__kmpc_alloc(int gtid, size_t size, omp_allocator_handle_t allocator) {
1473
1488
// pre-defined allocator
1474
1489
if (allocator == omp_high_bw_mem_alloc && mk_hbw_preferred) {
1475
1490
ptr = kmp_mk_alloc (*mk_hbw_preferred, desc.size_a );
1491
+ } else if (allocator == omp_large_cap_mem_alloc && mk_dax_kmem_all) {
1492
+ ptr = kmp_mk_alloc (*mk_dax_kmem_all, desc.size_a );
1476
1493
} else {
1477
1494
ptr = kmp_mk_alloc (*mk_default, desc.size_a );
1478
1495
}
@@ -1529,6 +1546,8 @@ void *__kmpc_alloc(int gtid, size_t size, omp_allocator_handle_t allocator) {
1529
1546
// pre-defined allocator
1530
1547
if (allocator == omp_high_bw_mem_alloc) {
1531
1548
// ptr = NULL;
1549
+ } else if (allocator == omp_large_cap_mem_alloc) {
1550
+ // warnings?
1532
1551
} else {
1533
1552
ptr = __kmp_thread_malloc (__kmp_thread_from_gtid (gtid), desc.size_a );
1534
1553
}
@@ -1684,6 +1703,8 @@ void __kmpc_free(int gtid, void *ptr, const omp_allocator_handle_t allocator) {
1684
1703
// pre-defined allocator
1685
1704
if (oal == omp_high_bw_mem_alloc && mk_hbw_preferred) {
1686
1705
kmp_mk_free (*mk_hbw_preferred, desc.ptr_alloc );
1706
+ } else if (oal == omp_large_cap_mem_alloc && mk_dax_kmem_all) {
1707
+ kmp_mk_free (*mk_dax_kmem_all, desc.ptr_alloc );
1687
1708
} else {
1688
1709
kmp_mk_free (*mk_default, desc.ptr_alloc );
1689
1710
}
0 commit comments