OpenMp и определение общей памяти - PullRequest
2 голосов
/ 29 марта 2012

Согласно веб-сайту OpenMP OpenMp означает "де-факто стандарт для параллельного программирования в системах с общей памятью" Согласно Википедия" Использование памяти для связи внутри одной программы, например, между несколькими потоками, обычно не называется общей памятью."

Что здесь не так? Это «общий» термин? OpenMp на самом деле просто создает потоки, «разделяющие память» через одно и то же пространство виртуальных адресов, не так ли?

Более того, я полагаю, что OpenMP может работать на архитектурах NUMA, где вся память может быть адресована всем процессорам, но с некоторым увеличенным временем доступа к памяти, когда потоки, совместно использующие данные, назначаются ядрам, обращающимся к разной памяти с различным доступом время. Это правда?

Ответы [ 2 ]

3 голосов
/ 29 марта 2012

Я редактирую здесь полноценный ответ, чтобы попытаться ответить на дополнительные вопросы, заданные в качестве комментариев к ответу lucas1024.

О значении «разделяемая память»

С одной стороны, у вас есть программно-ориентированное (т. Е. Ориентированное на ОС) значение разделяемой памяти: способ, позволяющий различным процессам получать доступ к одному и тому же куску памяти (т.е. ослаблять обычное ограничение ОС, которое задано процесс не должен вмешиваться в память других процессов). Как указано на странице википедии, API разделяемой памяти POSIX является одной из реализаций такого средства. В этом случае не имеет особого смысла говорить о потоках (ОС вполне может предоставлять общую память, даже не предоставляя потоки).

С другой стороны, у вас есть аппаратно-ориентированное значение «разделяемая память»: аппаратная конфигурация, при которой все процессоры имеют доступ к одному и тому же фрагменту ОЗУ.

О значении "нить"

Теперь мы должны устранить неоднозначность другого термина: «нить». ОС может обеспечить способ иметь несколько параллельных потоков выполнения в процессе. Потоки POSIX являются реализацией такой функции.

Однако в спецификации OpenMP есть свои определения:

поток: Объект выполнения со стеком и связанной статической памятью, называемый Приватная память.

Поток OpenMP: Поток, управляемый системой времени выполнения OpenMP.

Такие определения хорошо согласуются с определением, например, Потоки POSIX и большинство реализаций OpenMP действительно используют потоки POSIX для создания потоков OpenMP. Но вы можете представить реализации OpenMP поверх ОС, которые не предоставляют потоки POSIX или эквивалентные функции. Такие реализации OpenMP должны были бы внутренне управлять потоками выполнения, что достаточно сложно, но вполне выполнимо. В качестве альтернативы они могут отображать потоки OpenMP на процессы ОС и использовать какую-то функцию «разделяемой памяти» (в смысле ОС), чтобы позволить им совместно использовать память (хотя я не знаю, чтобы это делала любая реализация OpenMP).

В конце концов, единственное ограничение, которое у вас есть для реализации OpenMP, - это то, что все процессоры должны иметь возможность совместно использовать доступ к одной и той же центральной памяти. То есть программы OpenMP должны работать в системах с «общей памятью» в аппаратном смысле. Однако потоки OpenMP не обязательно должны быть потоками POSIX одного и того же процесса ОС.

2 голосов
/ 29 марта 2012

«Система с общей памятью» - это просто система, в которой несколько ядер или процессоров обращаются к одному пулу памяти через локальную шину. Так что сайт OpenMP правильный. Связь между потоками в программе не осуществляется с использованием «разделяемой памяти» - вместо этого термин обычно относится к связи между процессами на одном компьютере через память. Таким образом, статья в Википедии не противоречит и фактически указывает на разницу в терминологии между аппаратным и программным обеспечением.

...