我有以下代碼在我有的編譯器(xlC和gcc)上工作,但我不知道它是否完全兼容(我在OpenMP 3.0規範中沒有發現任何明確不允許的代碼):OpenMP調用和僞指令允許在firstprivate變量構造?
#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