On Tue, 2011-01-18 at 19:11 +0100, Brice Goglin wrote:
> Le 18/01/2011 17:40, Bernd Kallies a écrit :
> > Hallo,
> >
> > I'm using hwloc-1.1 on Linux 2.6.32.19 (x86_64) on a machine that has
> > several NUMA nodes. It seems to me that there are unwanted bits left in
> > the nodeset "set", when calling hwloc_get_membind_nodeset(topo,
> > set, ...) after a successful hwloc_set_membind() or
> > hwloc_set_membind_nodeset().
> >
> > E.g. when binding to node 2, then calling
> > hwloc_get_membind_nodeset(topo, set), then stringifying set, I get
> > something like 2,516,518. The machine has 64 nodes and 1024 pus.
> >
> > It seems that the following resolves the problem:
> >
> > --- src/topology-linux.c.bak        2010-11-25 15:01:48.000000000 +0100
> > +++ src/topology-linux.c    2011-01-18 17:38:18.000000000 +0100
> > @@ -886,18 +886,13 @@
> >  static void
> >  hwloc_linux_membind_mask_to_nodeset(hwloc_topology_t topology 
> > __hwloc_attribute_unused,
> >                                 hwloc_nodeset_t nodeset,
> > -                               unsigned _max_os_index, const unsigned long 
> > *linuxmask)
> > +                               unsigned max_os_index, const unsigned long 
> > *linuxmask)
> >  {
> > -  unsigned max_os_index;
> >    unsigned i;
> >  
> > -  /* round up to the nearest multiple of BITS_PER_LONG */
> > -  max_os_index = (_max_os_index + HWLOC_BITS_PER_LONG) & 
> > ~(HWLOC_BITS_PER_LONG - 1);
> > -
> >    hwloc_bitmap_zero(nodeset);
> >    for(i=0; i<max_os_index/HWLOC_BITS_PER_LONG; i++)
> >      hwloc_bitmap_set_ith_ulong(nodeset, i, linuxmask[i]);
> > -  /* if we don't trust the kernel, we could clear bits from 
> > _max_os_index+1 to max_os_index-1 */
> >  }
> >  #endif /* HWLOC_HAVE_SET_MEMPOLICY || HWLOC_HAVE_MBIND */
> >   
> 
> Hello Bernd,
> 
> I would like to understand better what's going on here.
> What's CONFIG_NODES_SHIFT in your kernel config?

/proc/config.gz says CONFIG_NODES_SHIFT=9

> Can you print max_os_index above (without round-up)?

max_os_index = 512, HWLOC_BITS_PER_LONG = 64, rounding gives
max_os_index = 576.

I also saw the same behaviour on a much smaller machine (usual 2-socket
Nehalem-EP). CONFIG_NODES_SHIFT is not found in /proc/config.gz.
max_os_index = 64, HWLOC_BITS_PER_LONG = 64, rounding gives max_os_index
= 128.

Hope this helps. BK


> Brice
> 

-- 
Dr. Bernd Kallies
Konrad-Zuse-Zentrum für Informationstechnik Berlin
Takustr. 7
14195 Berlin
Tel: +49-30-84185-270
Fax: +49-30-84185-311
e-mail: kall...@zib.de

Reply via email to