31

2つの異なるコアで実行されている2つのC++コードがあります。どちらも同じファイルに書き込みます。

OpenMPを使用して、クラッシュがないことを確認するにはどうすればよいですか?

4

3 に答える 3

61

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 セマフォなどのほとんどのロック ルーチンは、そのようなロジックで動作します。

于 2010-03-07T19:27:31.430 に答える
34

後で来る人のために、を使用すること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 つの方法のどちらかを選択する前に、このことを理解しておくことが重要です。

于 2012-11-05T17:30:49.203 に答える
20
#pragma omp critical
{
    // write to file here
}
于 2011-05-06T05:16:15.203 に答える