我有一段代碼,其讀取由線文件線,然後將其存儲兩個相應的二進制表示中的兩個向量。但矢量的大小和處理的總行數是零。OpenMP的文件中讀取在C++
int numLines = 319426908; // calculated before for loop
char temp[100];
vector<long long int> p1, p2;
long long int c = 0;
#pragma omp parallel for schedule(dynamic) shared(c, p1, p2, fp) private(temp)
for(int i=0; i<numLines; i++){
if(fgets(temp, 100, fp) != NULL){
temp[strlen(temp)-1] = '\0';
long long int *A = toLongLong(temp);
p1.push_back(A[0]);
p2.push_back(A[1]);
c++;
}
}
cout << "Completed ...c = " << c << endl;
cout << "p1.size: " << p1.size() << " p2.size: " << p2.size() << endl;
這是輸出
Completed ...c = 0
p1.size: 0 p2.size: 0
我在哪裏在上面這段代碼的問題呢?
你有一個競賽條件。 'push_back'操作以及'C++'(它應該是'++ c')是至關重要的,並且必須進入關鍵部分。但是並行讀取文件通常不是一個好主意(有些文件格式可以並行編寫和讀取,如[HDF5](https://en.wikipedia.org/wiki/Hierarchical_Data_Format))。 –
沒有「共享」條款照顧?我應該使用'#pragma omp critical'作爲更新'p1','p2'和'c'的塊嗎? – viz12
不,「共享」只是明確指出一個變量在線程之間共享。同步必須由用戶來處理。是的,你必須使用一個關鍵部分,但這會殺死你期望得到的所有加速。 –