2つの異なるコアで2つのC++コードを実行しています。どちらも同じファイルに書き込みます。
OpenMPを使用してクラッシュがないことを確認する方法
OMP_SET_LOCK
/OMP_UNSET_LOCK
関数: https://computing.llnl.gov/tutorials/openMP/#OMP_SET_LOCK 。基本的に:
omp_lock_t writelock;
omp_init_lock(&writelock);
#pragma omp parallel for
for ( i = 0; i < x; i++ )
{
// some stuff
omp_set_lock(&writelock);
// one thread at a time stuff
omp_unset_lock(&writelock);
// some stuff
}
omp_destroy_lock(&writelock);
特定のAPI呼び出しは異なりますが、pthreadsセマフォやsysvセマフォなどのほとんどのロックルーチンは、この種のロジックで機能します。
後に来る人のために、critical
を使用することもできます。名前付きのクリティカルセクションを作成することもできます。
例えば:
#include <omp.h>
void myParallelFunction()
{
#pragma omp parallel for
for(int i=0;i<1000;++i)
{
// some expensive work
#pragma omp critical LogUpdate
{
// critical section where you update file
}
// other work
#pragma omp critical LogUpdate
{
// critical section where you update file
}
}
}
編集:ビクター・アイクハウトが開始したコメントには素晴らしいスレッドがあります。要約と言い換え:要するにcritical
はコードセグメントをロックします。これは、特定のデータ項目をロックするだけで済む、より複雑な例ではやり過ぎになる可能性があります。 2つの方法のいずれかを選択する前に、これを理解することが重要です。
#pragma omp critical
{
// write to file here
}