2014-05-15 16 views
0

배열 (말하자면 'myresult')이 합계를 통해 계산되는 많은 반복 (~ 10^6-10^7)이있는 루프가 포함 된 코드를 작성하고 있습니다. 많은 기부금에. OpenMP를 가진 포트란 90,이 같은 것을 볼 것이다 :Intel MIC 오프로드를 사용하는 이기종 OpenMP 병렬 루프

!$omp parallel do 
!$omp& reduction(+:myresult) 
do i=1,N 
myresult[i] = myresult[i] + [contribution] 
enddo 
!$omp end parallel 

코드는 인텔 제온 코 프로세서가있는 시스템에서 실행됩니다, 그리고 물론 가능하다면, 자신의 존재의 혜택을드립니다. 나는 루프를 코 프로세서에서만 실행하도록 MIC 오프로드 문 (! dir $ offload target ...)을 사용하려고 시도했지만 코 프로세서가 끝날 때까지 기다리는 동안 호스트 CPU 시간을 낭비하고 있습니다. 이상적으로, 하나는 호스트와 장치 사이의 루프를 나눌 수 있으므로 다음과 같은 것이 가능한지 또는 더 나은 접근 방법이 있는지 알고 싶습니다. 루프는 (? 아마도 OMP_NUM_THREADS = 2하지만) 호스트에 하나 개의 코어에서 실행됩니다 :

!$omp parallel sections 
!$omp& reduction(+:myresult) 

!$omp section ! parallel calculation on device 
!dir$ offload target mic 
!$omp parallel do 
!$omp& reduction(+:myresult) 
(do i=N/2+1,N) 
!$omp end parallel do 

!$omp section ! serial calculation on host 
(do i=1,N/2) 

!$omp end parallel sections 

답변

0

일반적인 아이디어는 CPU가 계속 진행될 수 있도록 MIC에 비동기 오프로드를 사용하는 것입니다. 작업을 나누는 방법에 대한 자세한 내용은 다음과 같습니다.

module m 
!dir$ attributes offload:mic :: myresult, micresult 
integer :: myresult(10000) 
integer :: result 
integer :: micresult 
end module 

use m 
N = 10000 
result = 0 
micresult = 0 
myresult = 0 
!dir$ omp offload target(mic:0) signal(micresult) 
!$omp parallel do reduction(+:micresult) 
do i=N,N/2 
micresult = myresult(i) + 55 
enddo 
!$omp end parallel do 

!$omp parallel do reduction(+:result) 
do i=1,N/2 
result = myresult(i) + 55 
enddo 
!$omp end parallel do 

!dir$ offload_wait target(mic:0) wait(micresult) 
result = result + micresult 
end 
+0

좋았어, 고마워, 필자는 누락 된 부분이 호스트와 장치를위한 별도의 결과 변수를 만들 수 있다는 사실이라고 생각한다. – AlexJWR

0

는 MPI 대칭 모드 대신 오프로드의를 사용하여 생각 해 봤나? 그렇지 않은 경우 MPI는 방금 설명한대로 할 수 있습니다. 즉, 호스트와 코 프로세서 중 하나에서 두 개의 MPI 순위를 시작합니다. 각 등급은 OpenMP를 사용하여 병렬 루프를 수행합니다.

+0

감사합니다. 불행히도 제가 사용하고있는 코드의 OpenMP 병렬 처리가 필요합니다. 피하는 것을 강력히 선호합니다. – AlexJWR