Я пытался измерить асимметричные эффекты доступа к памяти NUMA и не удалось.
выполнен на Intel Xeon X5570 @ 2,93 ГГц, 2 процессора, 8 ядер.
На потоке, прикрепленной к сердечнике 0, я выделяю массив x размером 10 000 000 байтов на узле Numa Core 0 с NUMA_ALLOC_LOCAL. Затем я повторяю массив x в 50 раз и читаю и пишу каждый байт в массиве. Измерить прошедшее время, чтобы сделать 50 итераций.
Затем, на каждом из других ядер на моем сервере, я приводит к новой теме и снова измерить прошедшее время, чтобы сделать 50 итераций чтения и письма каждому байту в массиве х .
Массив x большой, чтобы минимизировать эффекты кэша. Мы хотим измерить скорость, когда ЦП должен пройти весь путь к RAM, чтобы загрузить и хранить, а не при помощи кэши.
На моем сервере есть два узла Numa, поэтому я ожидаю, что ящики, которые имеют аффинность на одном и том же узле, в котором выделяется массив x Быстрее скорость чтения / записи. Я не вижу этого.
Почему?
Возможно, NUMA имеет отношение только на системах с> 8-12 ядрами, как я видел, предложил в другом месте?
http://lse.sourceforge.net/numa/faq/
#include
#include
#include
#include
#include
void pin_to_core(size_t core)
{
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(core, &cpuset);
pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
}
std::ostream& operator<<(std::ostream& os, const bitmask& bm)
{
for(size_t i=0;i
g++ -o numatest -pthread -lboost_thread -lnuma -O0 numatest.cpp
./numatest
numa_available() 0 <-- NUMA is available on this system
numa node 0 10101010 12884901888 <-- cores 0,2,4,6 are on NUMA node 0, which is about 12 Gb
numa node 1 01010101 12874584064 <-- cores 1,3,5,7 are on NUMA node 1, which is slightly smaller than node 0
Elapsed read/write by same thread that allocated on core 0: 00:00:01.767428
Elapsed read/write by thread on core 0: 00:00:01.760554
Elapsed read/write by thread on core 1: 00:00:01.719686
Elapsed read/write by thread on core 2: 00:00:01.708830
Elapsed read/write by thread on core 3: 00:00:01.691560
Elapsed read/write by thread on core 4: 00:00:01.686912
Elapsed read/write by thread on core 5: 00:00:01.691917
Elapsed read/write by thread on core 6: 00:00:01.686509
Elapsed read/write by thread on core 7: 00:00:01.689928
, выполняющий 50 чтений итераций и записи по сравнению с массивом x занимает около 1,7 секунды, независимо от того, какое ядро выполняет чтение и запись.
Размер кэша на моем процессоре составляет 8 МБ, поэтому, возможно, массив 10 МБ x недостаточно велико, чтобы исключить кеш EFFECS. Я пробовал 100 МБ Array x , и Я пытался выдать полный забор памяти с __sync_synchronize () внутри моих внутренних петель. Это все еще не раскрывает никакой асимметрии между узлами Numa.
Я пробовал читать и писать на массив x с __sync_fetch_and_add (). Еще ничего.