int main(void) { int max = numa_max_node(); int maxmask = numa_num_possible_nodes(); struct bitmask *nodes, *mask; int pagesize = getpagesize(); int i; int pol; int node; int err = 0; nodes = numa_bitmask_alloc(maxmask); mask = numa_bitmask_alloc(maxmask); for (i = max; i >= 0; --i) { char *mem = mmap(NULL, pagesize*(max+1), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0); char *adr = mem; if (mem == (char *)-1) err("mmap"); printf("%d offset %lx\n", i, (long)(adr - mem)); numa_bitmask_clearall(nodes); numa_bitmask_clearall(mask); numa_bitmask_setbit(nodes, i); if (mbind(adr, pagesize, MPOL_PREFERRED, nodes->maskp, nodes->size, 0) < 0) err("mbind"); ++*adr; if (get_mempolicy(&pol, mask->maskp, mask->size, adr, MPOL_F_ADDR) < 0) err("get_mempolicy"); assert(pol == MPOL_PREFERRED); assert(numa_bitmask_isbitset(mask, i)); node = 0x123; if (get_mempolicy(&node, NULL, 0, adr, MPOL_F_ADDR|MPOL_F_NODE) < 0) err("get_mempolicy2"); printf("got node %d expected %d\n", node, i); if (node != i) err = 1; } return err; }
int bind_cpu(int cpu) { struct bitmask *nodemask = numa_parse_nodestring("0"); struct bitmask *cpumask = numa_allocate_cpumask(); numa_bind(nodemask); cpumask = numa_bitmask_clearall(cpumask); return numa_sched_setaffinity( getpid(), numa_bitmask_setbit(cpumask, cpu-1) ); }
MEMKIND_EXPORT int memkind_hbw_all_get_mbind_nodemask(struct memkind *kind, unsigned long *nodemask, unsigned long maxnode) { int cpu; struct bitmask nodemask_bm = {maxnode, nodemask}; struct memkind_hbw_closest_numanode_t *g = &memkind_hbw_closest_numanode_g; pthread_once(&memkind_hbw_closest_numanode_once_g, memkind_hbw_closest_numanode_init); if (MEMKIND_LIKELY(!g->init_err && nodemask)) { numa_bitmask_clearall(&nodemask_bm); for (cpu = 0; cpu < g->num_cpu; ++cpu) { numa_bitmask_setbit(&nodemask_bm, g->closest_numanode[cpu]); } } return g->init_err; }
int memkind_hbw_get_mbind_nodemask(struct memkind *kind, unsigned long *nodemask, unsigned long maxnode) { int cpu; struct bitmask nodemask_bm = {maxnode, nodemask}; struct memkind_hbw_closest_numanode_t *g = &memkind_hbw_closest_numanode_g; pthread_once(&memkind_hbw_closest_numanode_once_g, memkind_hbw_closest_numanode_init); if (!g->init_err && nodemask) { numa_bitmask_clearall(&nodemask_bm); cpu = sched_getcpu(); if (cpu < g->num_cpu) { numa_bitmask_setbit(&nodemask_bm, g->closest_numanode[cpu]); } else { return MEMKIND_ERROR_GETCPU; } } return g->init_err; }