@@ -180,15 +180,16 @@ qvi_hwloc_obj_type_is_host_resource(
180
180
181
181
int
182
182
qvi_hwloc_bitmap_string (
183
+ hwloc_topology_t topo,
183
184
hwloc_const_bitmap_t bitmap,
184
185
qv_bind_string_format_t format,
185
186
char **result
186
187
) {
187
188
switch (format) {
188
189
case QV_BIND_STRING_AS_BITMAP:
189
- return qvi_hwloc_bitmap_asprintf (bitmap, result);
190
+ return qvi_hwloc_bitmap_asprintf (topo, bitmap, result);
190
191
case QV_BIND_STRING_AS_LIST:
191
- return qvi_hwloc_bitmap_list_asprintf (bitmap, result);
192
+ return qvi_hwloc_bitmap_list_asprintf (topo, bitmap, result);
192
193
default :
193
194
*result = nullptr ;
194
195
return QV_ERR_INVLD_ARG;
@@ -816,11 +817,11 @@ qvi_hwloc_emit_cpubind(
816
817
if (rc != QV_SUCCESS) return rc;
817
818
818
819
char *cpusets = nullptr ;
819
- rc = qvi_hwloc_bitmap_asprintf (cpuset, &cpusets);
820
+ rc = qvi_hwloc_bitmap_asprintf (hwl-> topo , cpuset, &cpusets);
820
821
if (rc != QV_SUCCESS) goto out;
821
822
822
823
qvi_log_info (
823
- " [pid={} tid={}] cpubind= {}" ,
824
+ " [pid={} tid={}] cpubind (physical) = {}" ,
824
825
getpid (), task_id, cpusets
825
826
);
826
827
out:
@@ -831,6 +832,7 @@ qvi_hwloc_emit_cpubind(
831
832
832
833
int
833
834
qvi_hwloc_bitmap_asprintf (
835
+ hwloc_topology_t topo,
834
836
hwloc_const_cpuset_t cpuset,
835
837
char **result
836
838
) {
@@ -840,12 +842,44 @@ qvi_hwloc_bitmap_asprintf(
840
842
qvi_log_error (" hwloc_bitmap_asprintf() failed" );
841
843
return QV_ERR_OOR;
842
844
}
845
+
846
+ if (topo) {
847
+ hwloc_bitmap_t cpuset_logical = hwloc_bitmap_alloc ();
848
+ hwloc_obj_t obj_pu = nullptr ;
849
+
850
+ int num_pus = hwloc_get_nbobjs_inside_cpuset_by_type (topo, cpuset, HWLOC_OBJ_PU);
851
+ for (int idx = 0 ; idx < num_pus ; idx++){
852
+ obj_pu = hwloc_get_next_obj_inside_cpuset_by_type (topo, cpuset, HWLOC_OBJ_PU, obj_pu);
853
+ (void )hwloc_bitmap_set (cpuset_logical,obj_pu->logical_index );
854
+ }
855
+
856
+ char *iresult_logical = nullptr ;
857
+ (void )hwloc_bitmap_list_asprintf (&iresult_logical, cpuset_logical);
858
+ if (qvi_unlikely (!iresult_logical)) {
859
+ qvi_log_error (" hwloc_bitmap_list_asprintf() failed" );
860
+ return QV_ERR_OOR;
861
+ }
862
+ (void )hwloc_bitmap_free (cpuset_logical);
863
+
864
+ char head[] = " | (logical) = " ;
865
+ char *final_result = (char *)calloc (strlen (iresult)+
866
+ strlen (head)+
867
+ strlen (iresult_logical)+1 ,sizeof (char ));
868
+ memcpy (final_result,iresult,strlen (iresult));
869
+ strcat (final_result,head);
870
+ strcat (final_result,iresult_logical);
871
+ free (iresult_logical);
872
+ free (iresult);
873
+ iresult = final_result;
874
+ }
875
+
843
876
*result = iresult;
844
877
return QV_SUCCESS;
845
878
}
846
879
847
880
int
848
881
qvi_hwloc_bitmap_list_asprintf (
882
+ hwloc_topology_t topo,
849
883
hwloc_const_cpuset_t cpuset,
850
884
char **result
851
885
) {
@@ -855,6 +889,37 @@ qvi_hwloc_bitmap_list_asprintf(
855
889
qvi_log_error (" hwloc_bitmap_list_asprintf() failed" );
856
890
return QV_ERR_OOR;
857
891
}
892
+
893
+ if (topo) {
894
+ hwloc_bitmap_t cpuset_logical = hwloc_bitmap_alloc ();
895
+ hwloc_obj_t obj_pu = nullptr ;
896
+
897
+ int num_pus = hwloc_get_nbobjs_inside_cpuset_by_type (topo, cpuset, HWLOC_OBJ_PU);
898
+ for (int idx = 0 ; idx < num_pus ; idx++){
899
+ obj_pu = hwloc_get_next_obj_inside_cpuset_by_type (topo, cpuset, HWLOC_OBJ_PU, obj_pu);
900
+ (void )hwloc_bitmap_set (cpuset_logical,obj_pu->logical_index );
901
+ }
902
+
903
+ char *iresult_logical = nullptr ;
904
+ (void )hwloc_bitmap_list_asprintf (&iresult_logical, cpuset_logical);
905
+ if (qvi_unlikely (!iresult_logical)) {
906
+ qvi_log_error (" hwloc_bitmap_list_asprintf() failed" );
907
+ return QV_ERR_OOR;
908
+ }
909
+ (void )hwloc_bitmap_free (cpuset_logical);
910
+
911
+ char head[] = " | (logical) = " ;
912
+ char *final_result = (char *)calloc (strlen (iresult)+
913
+ strlen (head)+
914
+ strlen (iresult_logical)+1 ,sizeof (char ));
915
+ memcpy (final_result,iresult,strlen (iresult));
916
+ strcat (final_result,head);
917
+ strcat (final_result,iresult_logical);
918
+ free (iresult_logical);
919
+ free (iresult);
920
+ iresult = final_result;
921
+ }
922
+
858
923
*result = iresult;
859
924
return QV_SUCCESS;
860
925
}
@@ -869,7 +934,7 @@ qvi_hwloc_cpuset_debug(
869
934
#endif
870
935
assert (cpuset);
871
936
char *cpusets = nullptr ;
872
- int rc = qvi_hwloc_bitmap_asprintf (cpuset, &cpusets);
937
+ int rc = qvi_hwloc_bitmap_asprintf (nullptr , cpuset, &cpusets);
873
938
if (rc != QV_SUCCESS) {
874
939
qvi_abort ();
875
940
}
@@ -957,7 +1022,7 @@ qvi_hwloc_task_get_cpubind_as_string(
957
1022
int rc = qvi_hwloc_task_get_cpubind (hwl, task_id, &cpuset);
958
1023
if (rc != QV_SUCCESS) return rc;
959
1024
960
- rc = qvi_hwloc_bitmap_asprintf (cpuset, cpusets);
1025
+ rc = qvi_hwloc_bitmap_asprintf (hwl-> topo , cpuset, cpusets);
961
1026
qvi_hwloc_bitmap_delete (&cpuset);
962
1027
return rc;
963
1028
}
@@ -1185,7 +1250,7 @@ qvi_hwloc_devices_emit(
1185
1250
}
1186
1251
for (auto &dev : *devlist) {
1187
1252
char *cpusets = nullptr ;
1188
- int rc = qvi_hwloc_bitmap_asprintf (dev->affinity .cdata (), &cpusets);
1253
+ int rc = qvi_hwloc_bitmap_asprintf (hwl-> topo , dev->affinity .cdata (), &cpusets);
1189
1254
if (rc != QV_SUCCESS) return rc;
1190
1255
1191
1256
qvi_log_info (" Device Name: {}" , dev->name );
0 commit comments