функция malloc / memcpy работает независимо от NUMA? - PullRequest
9 голосов
/ 29 марта 2011

Пытаясь увеличить скорость своих приложений на компьютерах, отличных от NUMA / Standard, я всегда обнаруживал, что узким местом является вызов malloc(), потому что даже на многоядерных компьютерах он используется совместно для всех ядер.

У меня есть компьютер с архитектурой NUMA, использующий Linux и C, и у меня есть два вопроса:

  1. В машине NUMA, поскольку каждое ядро ​​снабжено собственной памятью, malloc() будет работать независимо на каждом ядре / памяти, не блокируя другие ядра?
  2. В этих архитектурах как осуществляются вызовы memcpy()? Может ли это быть вызвано независимо на каждом ядре или, если оно будет вызвано сразу, ядро ​​заблокирует другие? Возможно, я ошибаюсь, но я помню, что memcpy() также сталкивался с такой же проблемой, что и malloc(), т. Е. Когда его использует одно ядро, другие должны ждать.

Ответы [ 2 ]

6 голосов
/ 29 марта 2011

Машина NUMA - это система с общей памятью, поэтому доступ к памяти с любого процессора может достигать памяти без блокировки. Если модель памяти основана на сообщениях, то для доступа к удаленной памяти потребуется, чтобы исполняющий процессор запросил, чтобы локальный процессор выполнил требуемую операцию. Однако в системе NUMA удаленный процессор может по-прежнему влиять на производительность процессора закрытия из-за использования ссылок на память, хотя это может зависеть от конкретной архитектурной конфигурации.

Что касается 1, это полностью зависит от ОС и библиотеки malloc. ОС отвечает за представление памяти на ядро ​​/ процессор как единое пространство или как NUMA. Malloc может знать или не знать NUMA. Но, по сути, реализация malloc может или не может выполняться одновременно с другими запросами. И ответ Ала (и связанное с ним обсуждение) рассматривает этот вопрос более подробно.

Что касается 2, так как memcpy состоит из ряда загрузок и хранилищ, единственным воздействием снова будут потенциальные архитектурные эффекты использования контроллеров памяти других процессоров и т. Д.

2 голосов
/ 29 марта 2011
  1. Вызовы malloc в отдельных процессах будут выполняться независимо от того, используете ли вы архитектуру NUMA.Вызовы malloc в разных потоках одного и того же процесса не могут выполняться независимо, поскольку возвращаемая память одинаково доступна для всех потоков внутри процесса.Если вы хотите, чтобы память была локальной для определенного потока, прочтите Локальное хранилище потоков.Мне не удалось найти какой-либо четкой документации о том, способны ли виртуальная машина Linux и планировщик оптимизировать соответствие между ядрами, потоками, локальной памятью и локальным хранилищем потоков.
...