Компилятор gcc, icc или Microsoft C/С++ поддерживает или знает что-либо о NUMA?

Если у меня есть многопроцессорная плата с кеш-связная неравномерный доступ к памяти (NUMA), т.е. отдельный "северные мосты" с отдельной ОЗУ для каждого процессора, какой-либо компилятор знать, как автоматически распространять данные в разных системах памяти, так что процессы, работающие с локальными потоками, в основном извлекают свои данные из ОЗУ, связанные с процессором, на котором работает поток?

У меня есть настройка, в которой 1 ГБ подключен к процессору 0, 1 ГБ подключен к процессору 1 и т.д. до 4 процессоров. В когерентной памяти физическая память для ОЗУ на первом процессоре имеет адреса от 0 до 1 ГБ-1. Для второго процессора это 1GB до 2GB-1 и т.д.

Будут ли какие-либо компиляторы, или, возможно, malloc специфически связывать новую память alloc'd процессом на конкретном ядре с физической памятью, связанной с этим ядром?

Ответ 2

Распределение памяти с поддержкой NUMA не выполняется во время компиляции. Подобные предположения были бы плохими для переносимости.

В Linux это функция ядра, хотя вы можете управлять ею во время выполнения с помощью numactl или set_mempolicy или libnuma.

Ответ 3

Для платформ MS компилятор не знает NUMA. Тем не менее, система имеет NUMA и пытается выделить память в том же node.

См. http://code.msdn.microsoft.com/64plusLP для получения более подробной информации о том, как последние версии Windows обрабатывают NUMA.