#include #include #include #include #include #include #define BITS_PER_LONG 64 #define MAX_THREADS 256 static void *p; static int maxnode; static size_t per_node_len; pthread_t threads[MAX_THREADS]; void *alloc_memory(void *arg) { size_t i; int v, r, ret; unsigned long nid = (unsigned long)arg; unsigned long nodemask[4]; void *q = (char *)p + per_node_len * nid; nodemask[0] = nodemask[1] = nodemask[2] = nodemask[3] = 0; v = nid / BITS_PER_LONG; r = nid % BITS_PER_LONG; nodemask[v] |= 1UL << r; printf("node=%d, nodemask=0x%llx 0x%llx 0x%llx 0x%llx\n", nid, nodemask[0], nodemask[1], nodemask[2], nodemask[3]); ret = mbind(q, per_node_len, MPOL_BIND, nodemask, maxnode, 0); if (ret == -1) { perror("mbind"); return (void *)-1; } for (i = 0; i < per_node_len; i += 0x1000) *((char *)q + i) = nid; return NULL; } int main(int argc, char *argv[]) { int ret, node_nr; struct timeval t1, t2; unsigned long i, deltaus; if (argc != 3) { fprintf(stderr, "usage: ./node_alloc node_nr per_node_len_in_MB\n"); return 0; } node_nr = atoi(argv[1]); per_node_len = atoi(argv[2]); printf("node_nr=%d, per_node_len=%dMB\n", node_nr, per_node_len); per_node_len <<= 20; printf("per_node_len=0x%lx\n", per_node_len); p = mmap(NULL, node_nr * per_node_len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (p == MAP_FAILED) { perror("mmap"); return -1; } maxnode = node_nr + 1; for (i = 0; i < node_nr; i++) pthread_create(&threads[i], NULL, alloc_memory, (void *)i); for (i = 0; i < node_nr; i++) pthread_join(threads[i], NULL); printf("allocation done, press enter to start free\n"); getchar(); gettimeofday(&t1, NULL); munmap(p, node_nr * per_node_len); gettimeofday(&t2, NULL); deltaus = (t2.tv_sec - t1.tv_sec) * 1000000 + t2.tv_usec - t1.tv_usec; printf("time spent: %fs\n", (float)deltaus / 1000000); return 0; }