배열 (말하자면 '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
좋았어, 고마워, 필자는 누락 된 부분이 호스트와 장치를위한 별도의 결과 변수를 만들 수 있다는 사실이라고 생각한다. – AlexJWR