# include <iostream>
# include <cstdlib>
# include <omp.h>
#define SIZE 10
#define NUM_THREADS SIZE
using namespace std;
main() {
omp_lock_t lock;
//omp_init_lock(&lock);
srand(time(NULL));
int arr[SIZE], max = -1;
omp_set_num_threads(NUM_THREADS);
for(int i = 0; i < SIZE; i++)
arr[i] = rand()%100;
#pragma omp parallel for
for(int i = 0; i < SIZE; i++) {
omp_set_lock(&lock);
if(arr[i] > max)
max = arr[i];
omp_unset_lock(&lock);
}
cout << "Max: " << max << endl;
}omp_init_lock(omp_lock_t *) - この関数は正確に何をしますか?
これはコードですが、私はOpenMPのロック機能を使用して、配列内の最大の要素を見つけるために書きました。その関数omp_init_lock
をスキップすると、私のコードは実行されません。それでもコンパイルは成功しますが、アレイのSIZEが小さい場合(10または20のような)の場合は、すべてのスレッドがforループに入った後に終了します。それ以外のときは問題なく実行されます(配列のサイズが100のように大きい場合)。
しかし、omp_init_lock()
はすべての問題を解決します。どうやって?私は検索しましたが、それについてはあまり見つけられませんでした。ロックされていない状態にロックを初期化するということだけが言及されました。ロックを初期化しないのに配列のサイズが100のときにコードが実行されるのはなぜですか?
omp_init_lock()
は具体的にどのような処理をしていますか?
ありがとうございます。 :)少なくとも、ロックの状態が初期化されていないことを人々に知らせるために、警告またはエラーをスローする必要があります。しかたがない。 –
ロック操作はできるだけ速いと考えられているので、毎回ロック変数をチェックするだけでは実用的ではありません。スレッドアナライザ(Oracle Solaris Studioの一部、元Sun Studio)のような、コード内のそのような問題を検出する正しさチェックツールがあります。 –