파일을 한 줄씩 읽은 다음 두 벡터에 두 개의 해당 이진 표현을 저장하는 코드 조각이 있습니다. 그러나 벡터의 크기와 처리 된 총 라인 수는 0입니다.C에서 OpenMP 파일 읽기
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)와 같이 병렬로 작성하고 읽도록 설계된 파일 형식이 있습니다. –
'shared' 절이 그것을 처리하지 않습니까? 'p1','p2','c'를 갱신하고있는 블록에'#pragma omp critical '을 사용해야합니까? – viz12
아니요, '공유'는 변수가 스레드간에 공유된다는 것을 명시 적으로 나타냅니다. 동기화는 사용자가 처리해야합니다. 그렇습니다. 중요한 섹션을 사용해야하지만, 예상되는 모든 속도가 빠져 나갈 것입니다. –