2つの異なるコアで実行されている2つのC++コードがあります。どちらも同じファイルに書き込みます。
OpenMPを使用して、クラッシュがないことを確認するにはどうすればよいですか?
2つの異なるコアで実行されている2つのC++コードがあります。どちらも同じファイルに書き込みます。
OpenMPを使用して、クラッシュがないことを確認するにはどうすればよいですか?
OMP_SET_LOCK
/OMP_UNSET_LOCK
関数
が必要です: https://hpc.llnl.gov/tuts/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
}
}
}
編集: Victor Eijkhout によって開始されたコメントに素晴らしいスレッドがあります。要約と言い換え: 要するにcritical
、コード セグメントをロックします。特定のデータ項目をロックすることだけが必要な、より複雑な例では、これはやり過ぎになる可能性があります。2 つの方法のどちらかを選択する前に、このことを理解しておくことが重要です。
#pragma omp critical
{
// write to file here
}