2014-07-25 6 views
-1

이 프로그램의 성능을 시험해보기 전에 예를 들어 보았 기 때문에 오랫동안 서명하지 않았지만 이제는 병렬 처리하려고 할 때 카운터에 서명해야합니다.서명 된 long long을 OpenMP에서 반복 변수로 사용할 수 있습니까?

하지만 카운터의 데이터 유형이 long long이며 unsigned long long으로 서명 되었기 때문에 결과가 단지 1의 카운터를 리턴하는지 확신 할 수 없습니다. 또는 Xeon Phi가 포함 된 OpenMP와 관련이있는 경우

OpenMP tutorial website에서 "for의 반복 변수는 부호있는 정수 변수 유형이어야하며 OpenMP 3.0에서는 부호없는 정수 변수 유형, 포인터 유형 또는 상수 시간 일 수 있습니다 무작위 액세스 반복자 유형. " http://pastebin.com/ESU1yXYT

에서

[...] 
#include <sys/types.h> 
#include <omp.h> 

    [...]  
    size_t i, j; 
    signed long long counter = 0; 
    [...] 
    if((ch1^ch2) == 0) 
    { 
     counter = 1; 
    } 

    #pragma omp parallel for private(counter) 
    for(i = 1; i < smallest; i++) 
    { 
     ch1 = getc(fp1); 
     ch2 = getc(fp2); 

     if((ch1^ch2) == 0) 
     { 
      counter++; 
     } 
    } 
    [...] 

전체 코드는 내가 비율을 찾기 위해 몇 가지 데이터 형식을 캐스팅해야합니까? 아니면 아마도 OpenMP 문제일까요?

답변

1

omp parallel for 루프의 반복 변수가 counter이 아니며, 길이가 길지 않은 size_t 타입을 가진 i입니다. 문제는 counter을 루프에서 비공개로 선언한다는 것입니다. 이는 here에 따르면 새 카운터 개체가 각 스레드에 대해 만들어지고 원래 개체에 대한 모든 참조가 새로운 개체로 대체된다는 것을 의미합니다. for 루프를 빠져 나가면 정의 된 behaivor가 counter에 대해 정확히 무엇인지 확신 할 수 없지만 확실히 찾고있는 것은 아닙니다. 당신은 아마하지만, 그것은 루프에 들어가기 전이었다으로

#pragma omp parallel for reduction(+:counter) 
for(i = 1; i < smallest; i++) 
{ 
    ch1 = getc(fp1); 
    ch2 = getc(fp2); 

    if((ch1^ch2) == 0) 
    { 
     counter += 1; 
    } 
} 

편집

Microsoft에 따르면, 루프의 병렬 후 counter의 값이 동일해야 감소 같은 것을하고 싶어 이것이 일반적인 것인지 또는 구현 특정 동작인지는 알 수 없습니다.