2010-12-20 3 views
1

는 그냥 작은 OMP 테스트를 작성하고 정확하게 모든 시간을 작동하지 않습니다소형의 OpenMP programm에 동결 때때로 (GCC, C, 리눅스는)

#include <omp.h> 
int main() { 
    int i,j=0; 
#pragma omp parallel 
    for(i=0;i<1000;i++) 
    { 
#pragma omp barrier 
    j+= j^i; 
    } 
    return j; 
} 

모든 스레드에서 쓰기에 대한 j의 사용이 잘못 이 예에서,하지만

  • 내가 동결을

  • J

    의 결정적 값이 있어야합니다.

4 코어 x86_Core2 리눅스 서버에 gcc-4.3.1 -fopenmp a.c -o gcc -static

실행과 컴파일 : $ ./gcc 및 동결있어 (때로는, 4-5 빠른 실행을위한 1 정지와 같은).

strace를 :

[pid 13118] futex(0x80d3014, FUTEX_WAKE, 1) = 1 
[pid 13119] <... futex resumed>)  = 0 
[pid 13118] futex(0x80d3020, FUTEX_WAIT, 251, NULL <unfinished ...> 
[pid 13119] futex(0x80d3014, FUTEX_WAKE, 1) = 0 
[pid 13119] futex(0x80d3020, FUTEX_WAIT, 251, NULL      
         <freeze> 

가 왜 동결 (교착 상태)이 있습니까?

답변

3

각 루프마다 개인 복사본이 있으므로 비공개로 설정하십시오.

나는 이제 더 많은 시간을 갖기 위해 노력하고 설명 할 것입니다. 기본적으로 OpenMP의 변수는 공유됩니다. 변수를 비공개로 만드는 기본값이있는 몇 가지 경우가 있습니다. 병렬 영역은 그 중 하나가 아닙니다 (따라서 High Performance Mark의 응답이 잘못되었습니다). 원래 프로그램에는 i와 j 중 하나에 두 개의 경쟁 조건이 있습니다. 문제는 내가 가진 문제입니다. 각 스레드는 루프를 몇 번 실행하지만, 각 스레드에 의해 변경되고 있기 때문에 스레드가 루프를 실행하는 횟수는 불확정합니다. 모든 스레드는 장벽을 만족시키기 위해 장벽을 실행해야하기 때문에 모든 스레드가이 스레드를 동일한 횟수만큼 실행하지는 않으므로 장벽이 끊어지지 않는 경우가 발생합니다.

OpenMP 사양에서는 "작업 공유 영역 및 장벽 영역의 순서가 팀 내의 모든 스레드에 대해 동일해야합니다 (OMP spec V3.0, 섹션 2.8.3 장벽 구조) 정책을 준수하지 않아서 불확정 동작을 일으킬 수 있습니다.

+0

흠 ... 고마워! 나는 그것을 테스트 할 것이다 – osgx

+0

-1 : 나는 개인적이다. OpenMP 표준은 각 스레드가 반복의 자신의 몫을 통제하도록 이것을 명령한다. –

+1

-1 : 루프 색인 변수는 private입니다. –

1

여러 스레드에서 같은 위치에 추가하려고합니다. 당신은 당신이하려고하는 것을 병렬로 할 수 없습니다. 합계를 병렬로 처리하려면 작은 조각으로 나눠서 나중에 수집해야합니다.

a5b에 의한 업데이트 : 올바른 생각이지만 코드의 잘못된 부분이 발견되었습니다. i 변수는 두 스레드에 의해 변경됩니다.

+0

ARSEN M, 모든 질문을 읽으십시오. SUM이 잘못되었지만 프로그램이 중단되어야합니다! 그리고 그렇지 않습니다. 변수의 병렬 변경이 교착 상태가 아닙니다. – osgx

+0

여기에있는 내용은 근본적으로 올바르지 않습니다. 당신이 그 주위를 감싸고있는 것처럼 보이는데, 그것은 또한 틀렸지 만, 당신은 또한 그렇게 잘못하고 있습니다. 이것이 교착 상태가 아니길 기대할 수는 없습니다. 당신은 모든 스레드가 합계 이전에 아무 일도 일어나지 않을 때까지 기다리고 있습니다. – arsenm

+0

좋아요, 만약'j + = j^i;'줄을 지우면 행동은 동일합니다 – osgx

0

@ejd, 내가 개인으로 표시하면 내 프로그램이 규정을 준수합니까?

죄송합니다. 방금이 질문을 보았습니다. 기술적으로 변수 "i"를 개인용으로 표시하면 프로그램이 OpenMP와 호환됩니다. 그러나 "j"에 대한 경쟁 조건이 여전히 있으며 경쟁 프로그램이 준수하는 동안 (경쟁 조건이있는 유효한 경우가 있기 때문에) "j"값은 지정되지 않습니다 (OpenMP 사양에 따라).

이전 답변 중 하나에서 장벽 구현의 속도를 측정하려고한다고 말했습니다.다양한 OpenMP 구문에 대한 결과를 게시 한 여러 벤치 마크가 있습니다. 하나는 Mark Bull (에딘버러 대학 EPCC)이, 다른 하나는 Lawrence Livermore National Labs (LLNL)에서, 세 번째 (Parkbench)는 일본 Computing Partnership에서 출간 ​​한 것입니다. 그들은 당신에게 약간의 지침을 제공 할 수 있습니다.

+0

왜 사용자 ID를 변경합니까 ("ejd"라는 이름의 여러 stackoverflow 로그인을 사용하지만 각각 http://stackoverflow.com/users/578711/ejd 및 http : // stackoverflow 링크에 다른 번호가 있음). com/users/551576/ejd) – osgx

+1

처음 등록하지 않았습니다. 두 번째로 제가 등록했지만 어떤 이유 때문에 웹 사이트는 모든 ID를 결합하지 않았습니다. 불행히도 나는 그것을 고치는 방법을 모른다. – ejd

+0

중재자 또는 meta.stack에 문의해야 할 수도 있습니다 ...? – osgx