On 21/04/2012 13:15, Jeffrey Squyres wrote:
On Apr 21, 2012, at 7:09 AM, Brice Goglin wrote:

I assume you have the entire distance (latency) matrix between all NUMA nodes 
as usually reported by the BIOS.

const struct hwloc_distance_s *distances = 
hwloc_get_whole_distance_matrix_by_type(topology, HWLOC_OBJ_NODE);
assert(distances);
assert(distances->latency);
Is this stored on the topology object?

No it's stored in the object that covers all objects connected by the distance matrix. So usually in the root object.

Hence, if this distance data is already covered by the XML export/import, then 
I should have this data.

Yes it should be there.

Now distances->latency[a+b*distances->nbobjs] contains the latency between NUMA 
nodes whose *logical* indexes are a and b (it may be asymmetrical).

Now get the NUMA node object close to your PUs and the NUMA objects close to each 
OFED device, take their ->logical_index and you'll get the latencies.
Ah, ok.  This is what I didn't understand from the docs -- is there no distance 
to actual PCI devices?  I.e., distance is only measured between NUMA nodes?

I ask because the functions allow measuring distance by depth and type -- are 
those effectively ignored, and really all you can check is the distance between 
NUMA nodes?

You can have distance matrices between any object sets of any type/depth. Depends what the BIOS reports or what the user adds. The BIOS usually only reports NUMA node distances.

We could extend them by saying that the distance between any child of NUMA node X and any child of NUMA node Y is equal to the distance between NUMA nodes X and Y, but we don't do that.

One reason is that the current distance stuff lets the user add a distance matrix between NUMA nodes and another one between sockets, even if they are incompatible. When this happens, which one do you use to generate the distance between two cores?

There are some tickets in trac they will help clarifying all this mess.

Brice


Reply via email to