私は利用可能なコンパイラ(xlCとgcc)で動作するが、完全に準拠しているかどうかわからない(明示的に許可しないOpenMP 3.0仕様で何も見つからなかった):firstprivate変数の構築で許可されたOpenMPコールとディレクティブ?
#include <iostream>
#include <vector>
#include <omp.h>
struct A {
int tid;
A() : tid(-1) { }
A(const A&) { tid = omp_get_thread_num(); }
};
int main() {
A a;
std::vector<int> v(10);
std::vector<int>::iterator it;
#pragma omp parallel for firstprivate(a)
for (it=v.begin(); it<v.end(); ++it)
*it += a.tid;
for (it=v.begin(); it<v.end(); ++it)
std::cout << *it << ' ';
std::cout << std::endl;
return 0;
}
私の動機はどのように多くのスレッドと セクション(私も処理されている各要素のためにそれを呼び出すしたくない)のためのOMP並列に各スレッドのIDを把握することです。私が未定義の動作を引き起こしている可能性はありますか?
コードが壊れています。 (1) 'it!= v.end()'、(2) 'it + = a.tid':これはデータ競合を引き起こします。あなたは正確に何をしたいですか? – minjang
データ競争は正確にどちらですか?私はベクトルのすべての値を繰り返し処理していますが、インデックスとv.size()を使うことと変わりはありません – ipapadop