void show(void) { unsigned long prefnode; struct bitmask *membind, *interleave, *cpubind; unsigned long cur; int policy; int numa_num_nodes = numa_num_possible_nodes(); if (numa_available() < 0) { show_physcpubind(); printf("No NUMA support available on this system.\n"); exit(1); } cpubind = numa_get_run_node_mask(); prefnode = numa_preferred(); interleave = numa_get_interleave_mask(); membind = numa_get_membind(); cur = numa_get_interleave_node(); policy = 0; if (get_mempolicy(&policy, NULL, 0, 0, 0) < 0) perror("get_mempolicy"); printf("policy: %s\n", policy_name(policy)); printf("preferred node: "); switch (policy) { case MPOL_PREFERRED: if (prefnode != -1) { printf("%ld\n", prefnode); break; } /*FALL THROUGH*/ case MPOL_DEFAULT: printf("current\n"); break; case MPOL_INTERLEAVE: printf("%ld (interleave next)\n",cur); break; case MPOL_BIND: printf("%d\n", find_first_bit(&membind, numa_num_nodes)); break; } if (policy == MPOL_INTERLEAVE) { printmask("interleavemask", interleave); printf("interleavenode: %ld\n", cur); } show_physcpubind(); printmask("cpubind", cpubind); // for compatibility printmask("nodebind", cpubind); printmask("membind", membind); }
void INTERNAL qt_affinity_init(qthread_shepherd_id_t *nbshepherds, qthread_worker_id_t *nbworkers, size_t *hw_par) { /*{{{ */ mccoy_bitmask = MALLOC(sizeof(nodemask_t)); *mccoy_bitmask = numa_get_run_node_mask(); qthread_internal_cleanup(qt_affinity_internal_numa_teardown); if (*nbshepherds == 0) { *nbshepherds = guess_num_shepherds(); } if (*nbworkers == 0) { *nbworkers = guess_num_workers_per_shep(*nbshepherds); } } /*}}} */
int get_memset(nodemask_t *mask, slurmd_job_t *job) { int nummasks, maskid, i, threads; char *curstr, *selstr; char mstr[1 + NUMA_NUM_NODES / 4]; int local_id = job->envtp->localid; debug3("get_memset (%d) %s", job->mem_bind_type, job->mem_bind); if (job->mem_bind_type & MEM_BIND_LOCAL) { *mask = numa_get_run_node_mask(); return true; } nodemask_zero(mask); if (job->mem_bind_type & MEM_BIND_NONE) { return true; } if (job->mem_bind_type & MEM_BIND_RANK) { threads = MAX(conf->threads, 1); nodemask_set(mask, job->envtp->localid % (job->cpus*threads)); return true; } if (!job->mem_bind) return false; nummasks = 1; maskid = 0; selstr = NULL; /* get number of strings present in mem_bind */ curstr = job->mem_bind; while (*curstr) { if (nummasks == local_id+1) { selstr = curstr; maskid = local_id; break; } if (*curstr == ',') nummasks++; curstr++; } /* if we didn't already find the mask... */ if (!selstr) { /* ...select mask string by wrapping task ID into list */ maskid = local_id % nummasks; i = maskid; curstr = job->mem_bind; while (*curstr && i) { if (*curstr == ',') i--; curstr++; } if (!*curstr) { return false; } selstr = curstr; } /* extract the selected mask from the list */ i = 0; curstr = mstr; while (*selstr && *selstr != ',' && i++ < (NUMA_NUM_NODES/4)) *curstr++ = *selstr++; *curstr = '\0'; if (job->mem_bind_type & MEM_BIND_MASK) { /* convert mask string into nodemask_t mask */ if (_str_to_memset(mask, mstr) < 0) { error("_str_to_memset %s", mstr); return false; } return true; } if (job->mem_bind_type & MEM_BIND_MAP) { unsigned int my_node = 0; if (strncmp(mstr, "0x", 2) == 0) { my_node = strtoul (&(mstr[2]), NULL, 16); } else { my_node = strtoul (mstr, NULL, 10); } nodemask_set(mask, my_node); return true; } return false; }
static void _load_cpu_mask(MY_MASK *cpu_mask) { *cpu_mask = numa_get_run_node_mask(); }