Сравнительное влияние процессора на сродство - PullRequest
4 голосов
/ 08 апреля 2011

Я работаю над архитектурой NUMA , где каждый вычислительный узел имеет 2 сокета и 4 ядра на сокет, всего 8 ядер на вычислительный узел и 24 ГБ ОЗУ на узел.Я должен доказать, что настройка привязка процессора может оказать существенное влияние на производительность.

У вас есть какая-либо программа, чтобы предложить, что я мог бы использовать в качестве эталона, чтобы показать разницу влияния между использованиемсродство процессора или нет?Я мог бы также написать простую C-тестовую программу, используя MPI, OpenMP или pthreads, но какая операция лучше всего подойдет для этого теста?Это должно быть то, что могло бы использовать преимущества локальности кэша, но также вызывало бы переключение контекста (операции блокировки), чтобы процесс мог потенциально мигрировать на другое ядро ​​или, что еще хуже, на другой сокет.Он должен работать на нескольких ядрах.

Ответы [ 3 ]

3 голосов
/ 02 сентября 2011

Я попытался написать программу, которая измеряет асимметрию задержки памяти в архитектуре NUMA, и с помощью сообщества StackOverflow мне это удалось. Вы можете получить программу из моего поста StackOverflow.

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

Когда я запускаю свою тестовую программу на оборудовании, очень похожем на ваше, я вижу около 30% снижения производительности, когда ядро ​​выполняет чтение / запись в память, которая не находится в узле NUMA ядра (область сродства). Программа должна читать и писать по шаблону, который преднамеренно побеждает кеширование и предварительную выборку, в противном случае отсутствует наблюдаемая асимметрия.

2 голосов
/ 12 октября 2011

Попробуйте ASC Sequoia. Эталон - CLOMP - предназначен для измерения накладных расходов на резьбу.

0 голосов
/ 08 апреля 2011

Вы можете просто использовать простой однопоточный процесс, который записывает, а затем многократно читает скромный набор данных. Процесс должен выполняться намного дольше, чем один временной интервал, очевидно, и достаточно долго, чтобы процессы могли мигрировать из одного ядра в другое, например, 100 секунд.

Затем вы можете запустить два теста:

  1. запустить 8 экземпляров процесса без привязки к процессору

    $ for p in 0 1 2 3 4 5 6 7 ; do time ./my_process & ; done

  2. запустить 8 экземпляров процесса с привязкой к процессору

    $ for p in 0 1 2 3 4 5 6 7 ; do time taskset -c $p ./my_process & ; done

...