Я выполняю параллельные вычисления с большим объемом памяти в MATLAB на 64-ядерном компьютере NUMA под Windows 7, по 8 ядер на сокет. Я использую параллельные вычисления для этого. Я заметил очень странную схему загрузки процессора: при запуске, скажем, 36 параллельных MATLAB, ядра 1-го сокета полностью загружены, 2-й сокет почти полностью загружен, третий сокет составляет около 50% и так далее. Последний сокет обычно почти полностью свободен и ничего не делает. Запуск более 12 параллельных работников одновременно, по-видимому, очень негативно влияет на производительность всех работников.
Я пытался поэкспериментировать со сродством процессора, привязывая разных рабочих к разным ядрам. Хотя он помогает в простых тестах (т. Е. Схема загрузки процессора становится одинаковой для всех ядер), он не помогает в наших реальных вычислениях с интенсивным использованием памяти.
Я подозреваю, что проблема связана с локальностью памяти. То есть вся память расположена на 1-м и 2-м сокетах. Это объясняет странную загрузку ЦП: ОС устает запускать вычислительные потоки ближе к данным. Но я не знаю ни как подтвердить это подозрение напрямую, ни как исправить это, если это правда.
Я использую maxNumCompThreads (4) во всех моих параллельных рабочих, если это важно. Гиперпоточность отключена.