Код: Выделить всё
for (int i = 0; i < V.size() * sizeof(int) / page_size; i++) {
int numaidx = i / page_per_numa;
status = V[i];
addr = dptr + i * (page_size / sizeof(int));
addr = page_start(addr, page_size);
if (move_pages(0, 1, &addr, &numaidx, &status, 0) == -1) {
perror("move_pages");
return 1;
}
move_pages(0, 1, &addr, NULL, &status, 0);
arr1[status] += 1;
}
for (int i = 0; i < V.size() * sizeof(int) / page_size; i++) {
int numaidx = i / page_per_numa;
status = V[i];
addr = dptr + i * (page_size / sizeof(int));
addr = page_start(addr, page_size);
move_pages(0, 1, &addr, NULL, &status, 0);
arr2[status] += 1;
}
Код: Выделить всё
arr1Ожидаемое поведение - ARR1 и arr2 должно быть точно так же. ARR1 идеально подходит, каждая страница - это то, где я хочу, чтобы она была, но ARR2 является катастрофой. Похоже, что 3/4 страниц выделяется в область NUMA, где находится основной поток. Я также попытался использовать OpenMP для второго цикла, чтобы увидеть, является ли это запуск доступа, а с или без OpenMP это дает мне тот же результат. и get_mempolicy () дает тот же результат. В чем причина этого?
Подробнее здесь: https://stackoverflow.com/questions/797 ... arily-in-c
Мобильная версия