2014-01-09 4 views
0

저는 OpenMP를 처음 사용하기 때문에 구성을위한 병렬 프로그램을 사용하여 작은 프로그램을 작성하려고했습니다. 내 프로그램의 결과를 이해하는 데 어려움이 있습니다. 스레드 번호 3이 1과 2 전에 출력을 인쇄하는 이유를 이해할 수 없습니다. 누군가가 설명을 제공 할 수 있습니까?"for"루프 용 OpenMP 출력

따라서, 프로그램은 :

#pragma omp parallel for 
for (i = 0; i < 7; i++) { 
    printf("We are in thread number %d and are printing %d\n", 
     omp_get_thread_num(), i); 
} 

출력은 :

We are in thread number 0 and are printing 0 
We are in thread number 0 and are printing 1 
We are in thread number 3 and are printing 6 
We are in thread number 1 and are printing 2 
We are in thread number 1 and are printing 3 
We are in thread number 2 and are printing 4 
We are in thread number 2 and are printing 5 

내 프로세서 코어 4와 인텔 (R) 코어 (TM) i5-2410M CPU이다.

감사합니다.

답변

1

OpenMP는 다른 스레드에 의한 명령 문의 순서의 상대적인 순서를 보장하지 않습니다. OpenMP는 필요한 경우 이러한 순서를 지정하기 위해 프로그래머에게 남겨 둡니다. 일반적으로 OpenMP의 기본 동작이 그대로있는 이유는 바람직하지 않은 경우가 많습니다. 이러한 주문을 부과하는 데 드는 비용은 상당 할 것입니다.

큰 테스트를 여러 번 실행하는 것이 좋습니다. 이벤트의 크로스 스레드 시퀀싱은 기본적으로 무작위입니다.

1

당신이 순서로 인쇄 할 경우 사용할 수있는 ordered 나는 이것이이 성능에 영향을 미칠 수 있도록 낮은 반복으로 사람을 기다리는 큰 반복에서 스레드를 필요로 가정

#pragma omp parallel for ordered 
for (i = 0; i < 7; i++) { 
    #pragma omp ordered 
    printf("We are in thread number %d and are printing %d\n", 
     omp_get_thread_num(), i); 
} 

구성. 여기에 사용 된 것을 볼 수 있습니다 http://bisqwit.iki.fi/story/howto/openmp/#ExampleCalculatingTheMandelbrotFractalInParallel 그 결과 만트 브로트는 문자로 ordered을 사용하여 그립니다. ordered을 사용하는 것보다 훨씬 빠른 해결책은 문자를 병렬로 배열을 채운 다음 연속적으로 그리는 것입니다 (코드를 사용해보십시오). 성능을 위해 OpenMP를 사용하기 때문에 ordered을 사용하는 좋은 이유를 찾지 못했지만 어딘가에서 사용하는 것이 확실합니다.