OpenMPを使用しており、フェッチアンドアッド操作を使用する必要があります。ただし、OpenMPは適切なディレクティブ/呼び出しを提供しません。最大限の移植性を維持したいので、コンパイラの組み込み関数に依存したくありません。
むしろ、OpenMPのアトミック操作を利用してこれを実装する方法を探していますが、行き止まりになっています。これもできますか?NB、次のコードはほとんど私が望むことをします:
#pragma omp atomic
x += a
ほとんど–ですが、完全ではありません。古い値の。が本当に必要だからですx
。fetch_and_add
次と同じ結果を生成するように定義する必要があります(非ロックのみ)。
template <typename T>
T fetch_and_add(volatile T& value, T increment) {
T old;
#pragma omp critical
{
old = value;
value += increment;
}
return old;
}
(コンペア・アンド・スワップについても同等の質問をすることができますが、私が間違っていなければ、一方を他方の観点から実装することができます。)