Hi ... I was trying to bind each quarter of an array to 4 different NUMA nodes, and doing as below:
*//ALLOCATION * *obj_a = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NODE, 0);* *array =* hwloc_alloc_membind_nodeset( topology, size, obj_a->nodeset, HWLOC_MEMBIND_BIND, 1); *tmp *= hwloc_alloc_membind_nodeset( topology, size, obj_a->nodeset, HWLOC_MEMBIND_BIND, 1); *// DISTRIBUTED BINDING [my system has 8 NUMA nodes (0-7)]* printf("Address of array:= %p, array+size/4:= %p, array+size/2:= %p, array+3*size/4:= %p \n", array, array+size/4, array+size/2, array+3*size/4); // bind 1st quarter to node (n-1) hwloc_set_area_membind_nodeset(topology, (array), size/4, obj_a->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_MIGRATE); hwloc_set_area_membind_nodeset(topology, (tmp), size/4, obj_a->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_MIGRATE); // bind 2nd quarter to node (2) *obj_b = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NODE, 2);* hwloc_set_area_membind_nodeset(topology, (array+size/4), size/4, obj_b->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_MIGRATE); hwloc_set_area_membind_nodeset(topology, (tmp +size/4), size/4, obj_b->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_MIGRATE); // bind 3rd quarter to node (4) * obj_c = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NODE, 4);* hwloc_set_area_membind_nodeset(topology, array+size/2, size/4, obj_c->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_MIGRATE); hwloc_set_area_membind_nodeset(topology, tmp+size/2, size/4, obj_c->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_MIGRATE); // bind 4th quarter to node (6) * obj_d = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NODE, 6);* hwloc_set_area_membind_nodeset(topology, array+3*size/4, size/4, obj_d->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_MIGRATE); hwloc_set_area_membind_nodeset(topology, tmp+3*size/4, size/4, obj_d->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_MIGRATE); My intention here is to distribute 'array' (which is - long type element: array = (ELM *) malloc(bots_arg_size * sizeof(ELM)); tmp = (ELM *) malloc(bots_arg_size * sizeof(ELM));) over nodes through hwloc memory binding. 1). But except only *obj_a, it can not bind the specified memory section (addr, len) to the desired NUMA node. * 2). I did tried with MEMBIND_INTERLEAVE policy array = hwloc_alloc_membind_nodeset(topology, size, cset_available, HWLOC_MEMBIND_INTERLEAVE, HWLOC_MEMBIND_MIGRATE); tmp = hwloc_alloc_membind_nodeset(topology, size, cset_available, HWLOC_MEMBIND_INTERLEAVE, HWLOC_MEMBIND_MIGRATE); but I did get it working here as well. *Can you please comment on this..? * Thank you very much in advance..!! - Raju On Mon, Mar 21, 2016 at 11:25 AM, Rezaul Karim Raju <raju.cse.b...@gmail.com > wrote: > Thanks, Brice.! > > On Mon, Mar 21, 2016 at 11:22 AM, Brice Goglin <brice.gog...@inria.fr> > wrote: > >> For testing, you can use this tarball: >> >> https://ci.inria.fr/hwloc/job/zcustombranch-0-tarball/lastSuccessfulBuild/artifact/hwloc-getmemlocation-20160320.2208.gitd2f6537.tar.gz >> >> >> >> >> Le 21/03/2016 17:21, Rezaul Karim Raju a écrit : >> >> Hi Brice, >> >> Thanks for your email. >> I believe it is definitely helpful. Getting memory range within the >> current process will be very good information to drill down. >> Let me use this and I will get back if any clarification/comment I have. >> >> Regards- >> Raju >> >> On Sun, Mar 20, 2016 at 4:26 PM, Brice Goglin <brice.gog...@inria.fr> >> wrote: >> >>> I just pushed a proposal, see >>> https://github.com/open-mpi/hwloc/issues/97 >>> >>> Brice >>> >>> >>> >>> >>> Le 18/12/2015 20:45, Brice Goglin a écrit : >>> >>> Yes, we're "thinking" about it. But there are open questions as >>> mentioned in the github issue. >>> By the way, we wouldn't return NULL in case of non-physically-allocated >>> buffer, but rather set the output nodeset to 0. >>> You should comment on the issue directly, instead of replying here, >>> otherwise your comments may get lost. >>> >>> Brice >>> >>> >>> >>> >>> Le 18/12/2015 18:57, Rezaul Karim Raju a écrit : >>> >>> Hi Brice, >>> >>> Thanks for your time and nice explanation. >>> I have looked at the issue with location return (the page proportion >>> across multiple node & physical allocation). Are you thinking to add this >>> function..? Like if we think list of node or nodes where the array is >>> allocated (only if physically allocated otherwise NULL) is it possible..? >>> >>> I am looking for getting the physical location of data allocated by OS >>> default policy. Appreciate any better idea and please share with me. >>> >>> Best Regards, >>> - Raju >>> >>> On Tue, Dec 15, 2015 at 3:28 AM, Brice Goglin < <brice.gog...@inria.fr> >>> brice.gog...@inria.fr> wrote: >>> >>>> >>>> >>>> Le 15/12/2015 07:21, Brice Goglin a écrit : >>>> >>>> >>>> >>>> Le 15/12/2015 05:57, Rezaul Karim Raju a écrit : >>>> >>>> *OUTPUT: * >>>> *Policy-->* buffer(Array: A) *membind [default OS binding] Policy is:= >>>> 1 [1 refers to *HWLOC_MEMBIND_FIRSTTOUCH >>>> <https://www.open-mpi.org/projects/hwloc/doc/v1.11.1/a00083.php#ggac9764f79505775d06407b40f5e4661e8a979c7aa78dd32780858f30f47a72cca0> >>>> *]* >>>> *Nodeset --> *buffer(Array: A) bound to nodeset* 0x000000ff *with >>>> contains*:* >>>> node #0 (OS index 0) with 8387047424 bytes of memory >>>> node #1 (OS index 1) with 8471617536 bytes of memory >>>> node #2 (OS index 2) with 8471621632 bytes of memory >>>> node #3 (OS index 3) with 8471617536 bytes of memory >>>> node #4 (OS index 4) with 8471621632 bytes of memory >>>> node #5 (OS index 5) with 8471617536 bytes of memory >>>> node #6 (OS index 6) with 8471621632 bytes of memory >>>> node #7 (OS index 7) with 8471564288 bytes of memory >>>> >>>> *why it shows allocated memory is bound to all available nodeset..? >>>> should it not be allocated to a specific nodeset one ..?* >>>> >>>> >>>> Hello >>>> >>>> You are confusing the "binding" and the "actual location". Your memory >>>> buffer isn't bound to a specific location by default. But Linux has to >>>> allocate it somewhere. So your buffer is "located" in some node after the >>>> allocation, but it is not "bound" there (what get_area_membind returns) >>>> which means Linux could have allocated it somewhere else. >>>> >>>> hwloc cannot currently return the "location" of a memory buffer. I have >>>> been thinking about adding this feature in the past, but it looks like you >>>> are the first actual user requesting this. We could add something like >>>> hwloc_get_last_memory_location(topology, input buffer, outputnodeset) >>>> At least on Linux that's possible. >>>> >>>> For clarity, this is similar to the difference between >>>> hwloc_get_cpubind() and hwloc_get_last_cpu_location(): A task always runs >>>> on a specific PU, even if it is not bound to anything specific PU. >>>> >>>> >>>> By the way, there is already an issue for this: >>>> https://github.com/open-mpi/hwloc/issues/97 >>>> >>>> Feel to comment there. >>>> >>>> Brice >>>> >>>> >>>> _______________________________________________ >>>> hwloc-users mailing list >>>> hwloc-us...@open-mpi.org >>>> Subscription: http://www.open-mpi.org/mailman/listinfo.cgi/hwloc-users >>>> Link to this post: >>>> <http://www.open-mpi.org/community/lists/hwloc-users/2015/12/1226.php> >>>> http://www.open-mpi.org/community/lists/hwloc-users/2015/12/1226.php >>>> >>> >>> >>> >>> -- >>> ------------------------ >>> RaJu, Rezaul Karim >>> Graduate Student (PhD) | Computer Science | University of Houston >>> Research in High Performance Computing Tools >>> Houston, Texas-77004 >>> >>> >>> >>> >> >> >> -- >> ------------------------ >> RaJu, Rezaul Karim >> Graduate Student (PhD) | Computer Science | University of Houston >> Research in High Performance Computing Tools >> Houston, Texas-77004 >> >> >> > > > -- > ------------------------ > RaJu, Rezaul Karim > Graduate Student (PhD) | Computer Science | University of Houston > Research in High Performance Computing Tools > Houston, Texas-77004 > -- ------------------------ RaJu, Rezaul Karim Graduate Student (PhD) | Computer Science | University of Houston Research in High Performance Computing Tools Houston, Texas-77004