2015-10-23 2 views

ответ

2

Как написано в OpenMP specification версии 4.0, Раздел 2.14.3:

Элемент списка, который определяет данную переменную не может появиться в более чем одном пункте на одной и той же директиве, за исключением того, что переменная может быть указанных в статьях firstprivate и lastprivate.

Это на самом деле имеет большой смысл для этого. firstprivate влияет на значение переменных списка при входе в параллельную область, а lastprivate влияет на них при выходе из региона. Оба они не противоречат друг другу, и их совместное использование позволяет некоторым переменным «распространяться» по региону и получать их значения, модифицированные параллельным кодом, таким же образом, как и в последовательном случае. В основном это имеет смысл с параллельными петлями.

+0

Что мне непонятно, так это когда вы можете использовать 'lastprivate'. Согласно этому [link] (http://bisqwit.iki.fi/story/howto/openmp/#LastprivateClause) он работает только для итераторов, поэтому в примере OPs я думаю, что он будет работать только для 'i', а не' a '. Это было бы бесполезно в примере OP, но если бы это было что-то вроде 'for (i = 0; i <(N/8) * 8; i ++), он мог бы использовать, чтобы определить, что последняя итерация была кратной 8 и N не был кратным 8, если вам понадобится цикл очистки 'for (; i

+0

@Zboson, 'lastprivate' работает в сочетании с конструкциями совместной работы, чтобы вывести значение перечисленных переменных (переменных), назначенных во время последнего логического цикла итерации/лексически последнего раздела, независимо от того, какой поток выполняет его. Если 'bla bla bla' в примере OPs будет что-то вроде' a = 2 * i; ', тогда значение' a' после параллельной области будет '16'. Страница, с которой вы ссылались, показывает, что невозможно использовать 'lastprivate' для извлечения значений, назначенных во время итераций до последнего; он не говорит, что предложение работает только для итераторов. –

+0

Спасибо, я понимаю сейчас. Если в этой ссылке он использовал firstprivate, а не получал полностью фиктивные значения, он бы получил начальные значения (done = 4 и done = 5), но это действительно не то, что было необходимо. Я вижу, что частное значение должно определяться потоком, выполняющим последнюю итерацию, иначе возвращаемое значение не определено или значение firstprivate. –

Смежные вопросы