Open MPI logo

Hardware Locality Users' Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Hardware Locality Users mailing list

Subject: Re: [hwloc-users] some questions about hwloc
From: Brice Goglin (Brice.Goglin_at_[hidden])
Date: 2011-01-28 10:03:45


Le 28/01/2011 15:32, guillaume Arnal a écrit :
> Hi everyone,
>
> I'm beginner in using hwloc and I have some questions.
>
> First: I'm looking for a way to find which core is using by the
> current thread. (maybe with hwloc_get_thread_cpubind ??)
>
> Second: is there a way to set the number of core usable for the
> current process ?
>
> Thank you in advance for your help.
> Guillaume Arnal

Hello,

First, are you talking about cores for real (one core that may contain
multiple hyperthread), or are physical processors ok (those that you see
in /proc/cpuinfo) ?

hwloc_get_thread_cpubind() returns the binding of a thread specified by
its Linux thread id number. For the current thread, you may also use
hwloc_get_cpubind() with flag HWLOC_CPUBIND_THREAD. Both give a cpuset
listing all physical processors where the thread is currently allowed to
run. Processes are not bound by default, so the cpuset would contain all
existing processors, even if your thread actually uses a single core.

hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
hwloc_get_cpubind(topology, cpuset, HWLOC_CPUBIND_THREAD);

Once you have a cpuset, you may get the corresponding cores with:

hwloc_obj_t prev = NULL;
while ((prev = hwloc_get_next_obj_inside_cpuset_by_type(topology, cpuset, HWLOC_OBJ_CORE, prev)) != NULL)
   /* do what you want with object core */

If the thread is bound to a single physical processors, you can get its
physical id with:

hwloc_bitmap_first(cpuset);

If you want to force your current process to run on the 3rd core, you
can do something like:

hwloc_obj_t core = hwloc_get_obj_by_type(topology, HWLOC_OBJ_CORE, 2);
hwloc_set_cpubind(topology, core->cpuset, HWLOC_CPUBIND_PROCESS);

Hope this helps,
Brice