diff --git a/src/qvi-bbuff-rmi.h b/src/qvi-bbuff-rmi.h index 3b6c723..673b93b 100644 --- a/src/qvi-bbuff-rmi.h +++ b/src/qvi-bbuff-rmi.h @@ -459,7 +459,7 @@ qvi_bbuff_rmi_pack_item_impl( } // Non-null data. char *datas = nullptr; - int rc = qvi_hwloc_bitmap_asprintf(data, &datas); + int rc = qvi_hwloc_bitmap_asprintf(NULL, data, &datas); if (qvi_unlikely(rc != QV_SUCCESS)) return rc; // We are sending the string representation of the cpuset. rc = buff->append(datas, strlen(datas) + 1); diff --git a/src/qvi-hwloc.cc b/src/qvi-hwloc.cc index 3b45f3e..66209fe 100644 --- a/src/qvi-hwloc.cc +++ b/src/qvi-hwloc.cc @@ -180,15 +180,16 @@ qvi_hwloc_obj_type_is_host_resource( int qvi_hwloc_bitmap_string( + hwloc_topology_t topo, hwloc_const_bitmap_t bitmap, qv_bind_string_format_t format, char **result ) { switch (format) { case QV_BIND_STRING_AS_BITMAP: - return qvi_hwloc_bitmap_asprintf(bitmap, result); + return qvi_hwloc_bitmap_asprintf(topo, bitmap, result); case QV_BIND_STRING_AS_LIST: - return qvi_hwloc_bitmap_list_asprintf(bitmap, result); + return qvi_hwloc_bitmap_list_asprintf(topo, bitmap, result); default: *result = nullptr; return QV_ERR_INVLD_ARG; @@ -816,11 +817,11 @@ qvi_hwloc_emit_cpubind( if (rc != QV_SUCCESS) return rc; char *cpusets = nullptr; - rc = qvi_hwloc_bitmap_asprintf(cpuset, &cpusets); + rc = qvi_hwloc_bitmap_asprintf(hwl->topo, cpuset, &cpusets); if (rc != QV_SUCCESS) goto out; qvi_log_info( - "[pid={} tid={}] cpubind={}", + "[pid={} tid={}] cpubind (physical) = {}", getpid(), task_id, cpusets ); out: @@ -831,6 +832,7 @@ qvi_hwloc_emit_cpubind( int qvi_hwloc_bitmap_asprintf( + hwloc_topology_t topo, hwloc_const_cpuset_t cpuset, char **result ) { @@ -840,12 +842,44 @@ qvi_hwloc_bitmap_asprintf( qvi_log_error("hwloc_bitmap_asprintf() failed"); return QV_ERR_OOR; } + + if (topo) { + hwloc_bitmap_t cpuset_logical = hwloc_bitmap_alloc(); + hwloc_obj_t obj_pu = nullptr; + + int num_pus = hwloc_get_nbobjs_inside_cpuset_by_type(topo, cpuset, HWLOC_OBJ_PU); + for(int idx = 0; idx < num_pus ; idx++){ + obj_pu = hwloc_get_next_obj_inside_cpuset_by_type(topo, cpuset, HWLOC_OBJ_PU, obj_pu); + (void)hwloc_bitmap_set(cpuset_logical,obj_pu->logical_index); + } + + char *iresult_logical = nullptr; + (void)hwloc_bitmap_list_asprintf(&iresult_logical, cpuset_logical); + if (qvi_unlikely(!iresult_logical)) { + qvi_log_error("hwloc_bitmap_list_asprintf() failed"); + return QV_ERR_OOR; + } + (void)hwloc_bitmap_free(cpuset_logical); + + char head[] = " | (logical) = "; + char *final_result = (char*)calloc(strlen(iresult)+ + strlen(head)+ + strlen(iresult_logical)+1,sizeof(char)); + memcpy(final_result,iresult,strlen(iresult)); + strcat(final_result,head); + strcat(final_result,iresult_logical); + free(iresult_logical); + free(iresult); + iresult = final_result; + } + *result = iresult; return QV_SUCCESS; } int qvi_hwloc_bitmap_list_asprintf( + hwloc_topology_t topo, hwloc_const_cpuset_t cpuset, char **result ) { @@ -855,6 +889,37 @@ qvi_hwloc_bitmap_list_asprintf( qvi_log_error("hwloc_bitmap_list_asprintf() failed"); return QV_ERR_OOR; } + + if (topo) { + hwloc_bitmap_t cpuset_logical = hwloc_bitmap_alloc(); + hwloc_obj_t obj_pu = nullptr; + + int num_pus = hwloc_get_nbobjs_inside_cpuset_by_type(topo, cpuset, HWLOC_OBJ_PU); + for(int idx = 0; idx < num_pus ; idx++){ + obj_pu = hwloc_get_next_obj_inside_cpuset_by_type(topo, cpuset, HWLOC_OBJ_PU, obj_pu); + (void)hwloc_bitmap_set(cpuset_logical,obj_pu->logical_index); + } + + char *iresult_logical = nullptr; + (void)hwloc_bitmap_list_asprintf(&iresult_logical, cpuset_logical); + if (qvi_unlikely(!iresult_logical)) { + qvi_log_error("hwloc_bitmap_list_asprintf() failed"); + return QV_ERR_OOR; + } + (void)hwloc_bitmap_free(cpuset_logical); + + char head[] = " | (logical) = "; + char *final_result = (char*)calloc(strlen(iresult)+ + strlen(head)+ + strlen(iresult_logical)+1,sizeof(char)); + memcpy(final_result,iresult,strlen(iresult)); + strcat(final_result,head); + strcat(final_result,iresult_logical); + free(iresult_logical); + free(iresult); + iresult = final_result; + } + *result = iresult; return QV_SUCCESS; } @@ -869,7 +934,7 @@ qvi_hwloc_cpuset_debug( #endif assert(cpuset); char *cpusets = nullptr; - int rc = qvi_hwloc_bitmap_asprintf(cpuset, &cpusets); + int rc = qvi_hwloc_bitmap_asprintf(nullptr, cpuset, &cpusets); if (rc != QV_SUCCESS) { qvi_abort(); } @@ -957,7 +1022,7 @@ qvi_hwloc_task_get_cpubind_as_string( int rc = qvi_hwloc_task_get_cpubind(hwl, task_id, &cpuset); if (rc != QV_SUCCESS) return rc; - rc = qvi_hwloc_bitmap_asprintf(cpuset, cpusets); + rc = qvi_hwloc_bitmap_asprintf(hwl->topo, cpuset, cpusets); qvi_hwloc_bitmap_delete(&cpuset); return rc; } @@ -1185,7 +1250,7 @@ qvi_hwloc_devices_emit( } for (auto &dev : *devlist) { char *cpusets = nullptr; - int rc = qvi_hwloc_bitmap_asprintf(dev->affinity.cdata(), &cpusets); + int rc = qvi_hwloc_bitmap_asprintf(hwl->topo, dev->affinity.cdata(), &cpusets); if (rc != QV_SUCCESS) return rc; qvi_log_info(" Device Name: {}", dev->name); diff --git a/src/qvi-hwloc.h b/src/qvi-hwloc.h index 17c06bc..971a38f 100644 --- a/src/qvi-hwloc.h +++ b/src/qvi-hwloc.h @@ -187,6 +187,7 @@ qvi_hwloc_emit_cpubind( */ int qvi_hwloc_bitmap_asprintf( + hwloc_topology_t topo, hwloc_const_cpuset_t cpuset, char **result ); @@ -196,6 +197,7 @@ qvi_hwloc_bitmap_asprintf( */ int qvi_hwloc_bitmap_list_asprintf( + hwloc_topology_t topo, hwloc_const_cpuset_t cpuset, char **result ); @@ -537,6 +539,7 @@ qvi_hwloc_get_devices_in_bitmap( int qvi_hwloc_bitmap_string( + hwloc_topology_t topo, hwloc_const_bitmap_t bitmap, qv_bind_string_format_t format, char **result diff --git a/src/qvi-scope.cc b/src/qvi-scope.cc index f5d4184..736beaa 100644 --- a/src/qvi-scope.cc +++ b/src/qvi-scope.cc @@ -213,7 +213,9 @@ qv_scope::bind_string( int rc = m_group->task()->bind_top(&bitmap); if (qvi_unlikely(rc != QV_SUCCESS)) return rc; - rc = qvi_hwloc_bitmap_string(bitmap, format, result); + hwloc_topology_t topo = qvi_hwloc_get_topo_obj(m_group->hwloc()); + + rc = qvi_hwloc_bitmap_string(topo, bitmap, format, result); qvi_hwloc_bitmap_delete(&bitmap); return rc; } diff --git a/tests/common-test-utils.h b/tests/common-test-utils.h index 984c3db..deedf90 100644 --- a/tests/common-test-utils.h +++ b/tests/common-test-utils.h @@ -62,7 +62,7 @@ ctu_emit_task_bind( ers = "qv_bind_string() failed"; ctu_panic("%s (rc=%s)", ers, qv_strerr(rc)); } - printf("[%d] cpubind=%s\n", pid, binds); + printf("[%d] cpubind (physical) = %s\n", pid, binds); free(binds); } diff --git a/tests/internal/test-hwloc.c b/tests/internal/test-hwloc.c index ef00244..9c73745 100644 --- a/tests/internal/test-hwloc.c +++ b/tests/internal/test-hwloc.c @@ -208,7 +208,7 @@ main(void) ctu_panic("%s (rc=%s)", ers, qv_strerr(rc)); } - rc = qvi_hwloc_bitmap_asprintf(bitmap, &binds); + rc = qvi_hwloc_bitmap_asprintf(NULL, bitmap, &binds); if (rc != QV_SUCCESS) { ers = "qvi_hwloc_bitmap_asprintf() failed"; ctu_panic("%s (rc=%s)", ers, qv_strerr(rc)); diff --git a/tests/internal/test-rmi.cc b/tests/internal/test-rmi.cc index 4e6a160..893bdb0 100644 --- a/tests/internal/test-rmi.cc +++ b/tests/internal/test-rmi.cc @@ -112,7 +112,7 @@ client( } char *res; - qvi_hwloc_bitmap_asprintf(bitmap, &res); + qvi_hwloc_bitmap_asprintf(NULL, bitmap, &res); printf("# [%d] cpubind = %s\n", who, res); hwloc_bitmap_free(bitmap); free(res);