Распределение потоков OpenMP между узлами NUMA - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть матрица, распределенная по четырем локальным ячейкам памяти NUMA Теперь я хочу открыть 4 потока, каждый на ЦП, соответствующий отдельному NUMA-узлу, чтобы каждый поток мог как можно быстрее получить доступ к своей части матрицы. OpenMP имеет опцию «proc_bind (spread)», но он размещает потоки на том же NUMA-узле, но на сильно разнесенных процессорах.

Как заставить потоки связываться с различными узлами NUMA?

Или, если это невозможно: когда я использую все ядра на всех узлах (всего 256 потоков), я знаю, как получить идентификатор узла NUMA, но я не могу контролировать, какой поток получает какие индексы, например. в цикле. Как я мог эффективно распределить свою рабочую нагрузку в соответствии с конфигурацией NUMA?

1 Ответ

0 голосов
/ 30 апреля 2018

Вот что я бы сделал:

  1. Проверьте, какие ядра подключены к какому узлу NUMA, используя numactl -H
  2. Предполагая, например, что ядра 0, 1, 2 и 3 находятся на одном из 4 узлов NUMA, которые вы хотите использовать, установите переменную среды OMP_PLACES, чтобы привязать потоки к этим ядрам: export OMP_PLACES="{0},{1},{2},{3}"
  3. Наконец, запускаем ваш двоичный файл OpenMP с политикой выделения локальной памяти для numactl: numactl -l myBinary

Насколько я понял по вашему вопросу, это должно сработать.

...