web-dev-qa-db-ja.com

OpenMPでロックを使用するには?

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

OpenMPを使用してクラッシュがないことを確認する方法

24
MainID

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セマフォなどのほとんどのロックルーチンは、この種のロジックで機能します。

45
user257111

後に来る人のために、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つの方法のいずれかを選択する前に、これを理解することが重要です。

25
Chris A.
#pragma omp critical
{
    // write to file here
}
17
adamax