избегать гонки в OpenMP (параллельно для цикла) - PullRequest
3 голосов
/ 17 октября 2010

Я пишу программу OpenMP на C. У меня есть этот общий массив "data", который обновляется всеми потоками. Я хочу убедиться, что каждый поток завершил чтение части и сохранил значение в temp перед выполнением следующего оператора data [j] = temp.

Я пытался установить барьер #pragma omp между двумя операторами, но компилятор выдает ошибку. Пожалуйста помоги.

#pragma omp parallel for shared(data)

for (j = 0; j < numints; j++){

     if (j >= max_j)

     {

              temp = data[j] + data[j - max_j];
             data[j] = temp; 
     }

}

Ответы [ 2 ]

2 голосов
/ 18 октября 2010

Как вы уже видели, barrier не будет работать; critical достаточно тяжелый для этой конкретной операции. Атомный вес легче, чем критический; Вы всегда можете сделать

if (j >= max_j)
{
    #pragma omp atomic
    data[j] += data[j-max_j]; 
}

но вы всегда должны опасаться иметь такую ​​конструкцию (атомарную, критическую) внутри цикла - это убивает производительность, потому что убивает параллелизм (то есть, в конце концов, всю их цель).

Было бы полезно узнать, чего вы пытаетесь достичь с помощью этого фрагмента кода, потому что даже после устранения скачек данных в обновлениях конечный результат, скажем, в data [maxints-1] будет зависеть от данные заказа [maxints-1-max_j], данные [maxints-1-2 * max_j] .. были обновлены в, что явно не гарантируется параллельными OpenMP для. (Вы можете использовать упорядоченную конструкцию, но это чуть лучше, чем вообще не использовать параллель).

Если maxints < 2*max_j, то это легко; Вы можете просто сделать

#pragma omp parallel for shared(data)
for (j = max_j; j < numints; j++){
    data[j] += data[j-max_j];
}

и вам вообще не нужна синхронизация, потому что каждый поток обновляет только одни данные [j], и ни один не зависит от других. Но у меня складывается впечатление (а), что это не так, и (б) это фрагмент кода большего размера ...

1 голос
/ 17 октября 2010

барьер для синхронизации. Вы хотите использовать критическую секцию: http://msdn.microsoft.com/en-us/library/b38674ky%28VS.80%29.aspx.

...