OpenMP のマルチスレッド ループについて質問があります。private
-clause は、そのリスト内の変数が各スレッドに対してプライベートであることを宣言します。ここまでは順調ですね。しかし、マルチスレッド ループ内で関数を呼び出すとどうなるでしょうか。この最小限の例を参照してください。
#include <iostream>
#include <vector>
#include "omp.h"
using namespace std;
int second(int num)
{
int ret2 = 2*num;
return ret2;
}
int first(int num)
{
int ret1 = num;
return second(ret1);
}
int main()
{
int i;
#pragma omp parallel
{
vector<int> test_vec;
#pragma omp for
for(i=0; i<100; i++)
{
test_vec.push_back(first(omp_get_thread_num()));
}
#pragma omp critical
cout << test_vec[0] << endl;
}
return 0;
}
各スレッドは独自のバージョンの関数first
を取得しsecond
、スレッドが互いに独立して呼び出すことができるようになりますか? または、スレッドを同時に呼び出さないようにするために、スレッドを「キューに入れる」必要がありますか?
何が起こっても、変数が各スレッドに対してプライベートであるret1
ことが期待されますret2