Как вы уже видели, 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], и ни один не зависит от других. Но у меня складывается впечатление (а), что это не так, и (б) это фрагмент кода большего размера ...