Since I am new to hwloc there might be a misunderstanding from my side,
but I have a problem getting the cpuset of MPI tasks. I just want to run
a simple MPI program to see on which cores (or CPUs in case of
hyperthreading or SMT) the tasks run, so that I can arrange my MPI
communicators.
For the program below I get the following output:
Process 0 of 2 on tide
Process 1 of 2 on tide
--> cpuset of process 0 is 0x0000000f
--> cpuset of process 0 after singlify is 0x00000001
--> cpuset of process 1 is 0x0000000f
--> cpuset of process 1 after singlify is 0x00000001
So why do both MPI tasks report the same cpuset?
Here is the program (attached you find the output of
hwloc-gather-topology.sh):
#include <stdio.h>
#include <string.h>
#include "hwloc.h"
#include "mpi.h"
int main(int argc, char* argv[]) {
hwloc_topology_t topology;
hwloc_bitmap_t cpuset;
char *str = NULL;
int myid, numprocs, namelen;
char procname[MPI_MAX_PROCESSOR_NAME];
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
MPI_Comm_rank(MPI_COMM_WORLD,&myid);
MPI_Get_processor_name(procname,&namelen);
printf("Process %d of %d on %s\n", myid, numprocs, procname);
hwloc_topology_init(&topology);
hwloc_topology_load(topology);
/* get native cpuset of this process */
cpuset = hwloc_bitmap_alloc();
hwloc_get_cpubind(topology, cpuset, 0);
hwloc_bitmap_asprintf(&str, cpuset);
printf("--> cpuset of process %d is %s\n", myid, str);
free(str);
hwloc_bitmap_singlify(cpuset);
hwloc_bitmap_asprintf(&str, cpuset);
printf("--> cpuset of process %d after singlify is %s\n", myid, str);
free(str);
hwloc_bitmap_free(cpuset);
hwloc_topology_destroy(topology);
MPI_Finalize();
return 0;
}
|