Skip to content

Commit 6724996

Browse files
committed
make topology_init faster
1 parent a882507 commit 6724996

File tree

3 files changed

+25
-15
lines changed

3 files changed

+25
-15
lines changed

src/libumf.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ umf_result_t umfInit(void) {
7575
LOG_DEBUG("UMF library initialized");
7676
}
7777

78+
// some benchmarks uses multiple forks, and topology initialization is very slow
79+
// so if we initialize topology before the first fork, we can get significant performance gain.
80+
umfGetTopology();
7881
return UMF_RESULT_SUCCESS;
7982
}
8083

src/provider/provider_os_memory.c

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "ctl/ctl_internal.h"
2525
#include "libumf.h"
2626
#include "provider_os_memory_internal.h"
27+
#include "topology.h"
2728
#include "utils_assert.h"
2829
#include "utils_common.h"
2930
#include "utils_concurrency.h"
@@ -556,27 +557,19 @@ static umf_result_t os_initialize(const void *params, void **provider) {
556557

557558
memset(os_provider, 0, sizeof(*os_provider));
558559

559-
int r = hwloc_topology_init(&os_provider->topo);
560-
if (r) {
561-
LOG_ERR("HWLOC topology init failed");
562-
ret = UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
563-
goto err_free_os_provider;
564-
}
565-
566-
r = hwloc_topology_load(os_provider->topo);
567-
if (r) {
560+
os_provider->topo = umfGetTopology();
561+
if (!os_provider->topo) {
568562
os_store_last_native_error(UMF_OS_RESULT_ERROR_TOPO_DISCOVERY_FAILED,
569563
0);
570564
LOG_ERR("HWLOC topology discovery failed");
571565
ret = UMF_RESULT_ERROR_MEMORY_PROVIDER_SPECIFIC;
572-
goto err_destroy_hwloc_topology;
573566
}
574567

575568
os_provider->fd_offset_map = critnib_new(NULL, NULL);
576569
if (!os_provider->fd_offset_map) {
577570
LOG_ERR("creating file descriptor offset map failed");
578571
ret = UMF_RESULT_ERROR_OUT_OF_HOST_MEMORY;
579-
goto err_destroy_hwloc_topology;
572+
goto err_free_os_provider;
580573
}
581574

582575
ret = translate_params(in_params, os_provider);
@@ -619,8 +612,6 @@ static umf_result_t os_initialize(const void *params, void **provider) {
619612
free_bitmaps(os_provider);
620613
err_destroy_critnib:
621614
critnib_delete(os_provider->fd_offset_map);
622-
err_destroy_hwloc_topology:
623-
hwloc_topology_destroy(os_provider->topo);
624615
err_free_os_provider:
625616
umf_ba_global_free(os_provider);
626617
return ret;
@@ -644,7 +635,7 @@ static umf_result_t os_finalize(void *provider) {
644635
if (os_provider->nodeset_str_buf) {
645636
umf_ba_global_free(os_provider->nodeset_str_buf);
646637
}
647-
hwloc_topology_destroy(os_provider->topo);
638+
648639
umf_ba_global_free(os_provider);
649640
return UMF_RESULT_SUCCESS;
650641
}

src/topology.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
*
3-
* Copyright (C) 2024 Intel Corporation
3+
* Copyright (C) 2024-2025 Intel Corporation
44
*
55
* Under the Apache License v2.0 with LLVM Exceptions. See LICENSE.TXT.
66
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@@ -33,6 +33,22 @@ static void umfCreateTopology(void) {
3333
return;
3434
}
3535

36+
if (hwloc_topology_set_all_types_filter(topology,
37+
HWLOC_TYPE_FILTER_KEEP_NONE)) {
38+
LOG_ERR("Failed to set topology filter");
39+
hwloc_topology_destroy(topology);
40+
topology = NULL;
41+
return;
42+
}
43+
44+
if (hwloc_topology_set_type_filter(topology, HWLOC_OBJ_CORE,
45+
HWLOC_TYPE_FILTER_KEEP_ALL)) {
46+
LOG_ERR("Failed to set core filter");
47+
hwloc_topology_destroy(topology);
48+
topology = NULL;
49+
return;
50+
}
51+
3652
if (hwloc_topology_load(topology)) {
3753
LOG_ERR("Failed to initialize topology");
3854
hwloc_topology_destroy(topology);

0 commit comments

Comments
 (0)