Да, это именно так, пока вы не начнете работать над NUMA.
Итак, начнем с самого начала.Если у вас есть ядра, которые разделяют одно и то же пространство памяти, вы можете использовать потоки и библиотеки / инструменты, такие как OpenMP или TBB (если вы в C ++, используйте TBB, а не OpenMP).Вы также можете использовать MPI здесь.
Если у вас есть межсоединения, тогда единственный вариант - использовать библиотеку, подобную MPI.
Теперь есть промежуточный случай, неоднородныйАрхитектура памяти.Это происходит, если у вас есть, например, два сокета, то есть два пространства памяти, которые подключены к одному сокету каждый и все еще доступны из другого сокета, и если у вас есть одна программа с несколькими потоками, работающими на узле с несколькими сокетами, вы можете иметь памятьвыделяется на одном сокете, к которому обращается ядро на другом сокете, и это медленно.
Так что люди могут сделать в этих случаях:
- один процесс на сокет (ине на узел, из-за NUMA)
- закрепление потоков на ядре, память на сокетах
- на сокете, используйте TBB
- вне одного сокета, используйте MPI.
Я не говорю «часто», потому что многие научные коды все еще являются только MPI и могут изо всех сил пытаться ввести многопоточность, это совершенно другой подход из-за совместного использования памяти.