Вложенный цикл OpenMP Распараллеливание, приватный или публичный индекс?
Представьте, что у вас есть вложенный цикл для параллельной области, что-то вроде:
#pragma omp parallel
{
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
или же
#pragma omp parallel
{
for (int i = 0, ...) {
for (int j = i, ...) { }}}
Если мы используем #pragma omp для автоматически, индекс i становится закрытым. Но... мы должны установить индекс j на частный или публичный? Каков эффект?
#pragma omp parallel
{
#pragma omp for shared(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
или же
#pragma omp parallel
{
#pragma omp for private(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}}
Заранее спасибо!
2 ответа
Приватный j не имеет никакого эффекта, так как по умолчанию j является приватным (поскольку он находится в пределах цикла i for, поэтому при создании нового потока j относится именно к этому потоку.
#pragma omp parallel for private(j)
for (int i = 0, ...) {
for (int j = 0, ...) { }}
Если вы используете shared j
это не должно иметь никакого эффекта, как указано выше, так как область действия j является локальной для каждого экземпляра i, если вы расширите область действия j до глобальной, вы столкнетесь с расой кодирования
Все, что объявлено внутри параллельной области, автоматически становится приватным. Это (по-видимому) поведение, которое вы хотите: каждая итерация i
должен пройти через все j
, j
все циклы независимы (таким образом, частные, а не публичные). Тем не менее, вам на самом деле не хватает важного parallel
часть: если не пишешь
#pragma omp parallel for
но только
#pragma omp for
тогда ничего не случится параллельно (если вы сначала не создали параллельную область с #pragma omp parallel
в огороженном объеме)!