Измерение Numa (неравномерный доступ памяти). Нет наблюдаемой асимметрии. Почему?

Я пытался измерить асимметричные эффекты доступа к памяти 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/

NumaTest.CPP

#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.

Обновление 2:

Я пробовал читать и писать на массив x с __sync_fetch_and_add (). Еще ничего.

33
задан Donald_W 25 April 2015 в 19:42
поделиться