Ответ 1
Ядро Linux знает о NUMA и будет пытаться предоставить ваши страницы процесса из локальной памяти в текущий процессор (источник: U. Drepper, "What Every Programmer Должен знать о памяти" .)
Если у меня есть многопроцессорная плата с кеш-связная неравномерный доступ к памяти (NUMA), т.е. отдельный "северные мосты" с отдельной ОЗУ для каждого процессора, какой-либо компилятор знать, как автоматически распространять данные в разных системах памяти, так что процессы, работающие с локальными потоками, в основном извлекают свои данные из ОЗУ, связанные с процессором, на котором работает поток?
У меня есть настройка, в которой 1 ГБ подключен к процессору 0, 1 ГБ подключен к процессору 1 и т.д. до 4 процессоров. В когерентной памяти физическая память для ОЗУ на первом процессоре имеет адреса от 0 до 1 ГБ-1. Для второго процессора это 1GB до 2GB-1 и т.д.
Будут ли какие-либо компиляторы, или, возможно, malloc
специфически связывать новую память alloc'd процессом на конкретном ядре с физической памятью, связанной с этим ядром?
Ядро Linux знает о NUMA и будет пытаться предоставить ваши страницы процесса из локальной памяти в текущий процессор (источник: U. Drepper, "What Every Programmer Должен знать о памяти" .)
Распределение памяти с поддержкой NUMA не выполняется во время компиляции. Подобные предположения были бы плохими для переносимости.
В Linux это функция ядра, хотя вы можете управлять ею во время выполнения с помощью numactl
или set_mempolicy
или libnuma
.
Для платформ MS компилятор не знает NUMA. Тем не менее, система имеет NUMA и пытается выделить память в том же node.
См. http://code.msdn.microsoft.com/64plusLP для получения более подробной информации о том, как последние версии Windows обрабатывают NUMA.