Le 13/03/2012 17:04, Hartmut Kaiser a écrit : >>> But the problems I was seeing were not MSVC specific. It's a >>> proliferation of arcane (non-POSIX) function use (like strcasecmp, >>> etc.) missing use of HAVE_UNISTD_H, HAVE_STRINGS_H to wrap >>> non-standard headers, unsafe mixing of >>> int32<->int64 data types, reliance on int (and other types) having a >>> certain bit-size, totally unsafe shift operations, wide use of >>> (non-C-standard) gcc extensions, etc. Should I go on? > More investigation shows that the code currently assumes group (and > processor) masks to be 32 bit, which is not true on 64 bit systems. For > instance this (topology-windows.c: line 643): > > hwloc_bitmap_from_ith_ulong(obj->cpuset, GroupMask[i].Group, > GroupMask[i].Mask);
Try applying something like the patch below. Totally untested obviously, but we'll see if that starts improving lstopo. Brice diff --git a/src/topology-windows.c b/src/topology-windows.c index 55821a4..94e5073 100644 --- a/src/topology-windows.c +++ b/src/topology-windows.c @@ -520,7 +520,8 @@ hwloc_look_windows(struct hwloc_topology *topology) obj = hwloc_alloc_setup_object(type, id); obj->cpuset = hwloc_bitmap_alloc(); hwloc_debug("%s#%u mask %lx\n", hwloc_obj_type_string(type), id, procInfo[i].ProcessorMask); - hwloc_bitmap_from_ulong(obj->cpuset, procInfo[i].ProcessorMask); + hwloc_bitmap_from_ulong(obj->cpuset, procInfo[i].ProcessorMask & 0xffffffff); + hwloc_bitmap_from_ith_ulong(obj->cpuset, 1, procInfo[i].ProcessorMask >> 32); switch (type) { case HWLOC_OBJ_NODE: @@ -622,7 +623,8 @@ hwloc_look_windows(struct hwloc_topology *topology) mask = procInfo->Group.GroupInfo[id].ActiveProcessorMask; hwloc_debug("group %u %d cpus mask %lx\n", id, procInfo->Group.GroupInfo[id].ActiveProcessorCount, mask); - hwloc_bitmap_from_ith_ulong(obj->cpuset, id, mask); + hwloc_bitmap_from_ith_ulong(obj->cpuset, 2*id, mask & 0xffffffff); + hwloc_bitmap_from_ith_ulong(obj->cpuset, 2*id+1, mask >> 32); hwloc_insert_object_by_cpuset(topology, obj); } continue; @@ -636,7 +638,8 @@ hwloc_look_windows(struct hwloc_topology *topology) obj->cpuset = hwloc_bitmap_alloc(); for (i = 0; i < num; i++) { hwloc_debug("%s#%u %d: mask %d:%lx\n", hwloc_obj_type_string(type), id, i, GroupMask[i].Group, GroupMask[i].Mask); - hwloc_bitmap_from_ith_ulong(obj->cpuset, GroupMask[i].Group, GroupMask[i].Mask); + hwloc_bitmap_from_ith_ulong(obj->cpuset, 2*GroupMask[i].Group, GroupMask[i].Mask & 0xfffffff); + hwloc_bitmap_from_ith_ulong(obj->cpuset, 2*GroupMask[i].Group+1, GroupMask[i].Mask >> 32); } switch (type) {