Поддерживает ли компилятор gcc, icc или Microsoft C / C ++ или знает что-нибудь о NUMA? - PullRequest
11 голосов
/ 26 января 2010

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

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

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

Ответы [ 3 ]

7 голосов
/ 26 января 2010

Ядро Linux знает о NUMA и попытается передать страницы вашего процесса из локальной памяти в текущий процессор (источник: U. Drepper, «Что каждый программист должен знать о памяти» .)

5 голосов
/ 26 января 2010

Распределение памяти с учетом NUMA не выполняется во время компиляции. Делать такие предположения было бы плохо для переносимости.

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

4 голосов
/ 26 января 2010

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

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

...