2013-12-22 7 views
1

다음 루프를 사용하여 OpenMP를 사용하여 병렬 처리를 시도했지만 아무런 성능 개선도 보이지 않습니다. 개선 방법을 제안하십시오.OpenMP에서이 루프를 병렬 처리하는 가장 좋은 방법

thread = omp_get_max_threads () 
chunk=jmaxm/thread 
c$omp parallel shared (zetun,zetvn) private (i, j) 
c$omp do schedule(DYNAMIC,chunk) ORDERED 
    do j=2,jmaxm 
     jm=j-1 
     jp=j+1 
      do i=2,imaxm 
       if (rmask(i,j).eq.1.0)then 
      im=i-1 
      ip=i+1 
      zetun(i,j)= 
      + (un(im,j,km)+un(ip,j,km)-2.*un(i,j,km))*recdx2 
      + + ((un(i,jp,km)-un(i,j,km))- 
      + (un(i,j,km)-un(i,jm,km)))*recdy2 

      zetvn(i,j)= 
      + ((vn(ip,j,km)-vn(i,j,km))- 
      + (vn(i,j,km)-vn(im,j,km)))*recdx2 
      + + (vn(i,jp,km)+vn(i,jm,km)-2.*vn(i,j,km))*recdy2 
       endif 

     end do 

    end do 
c$omp end do nowait 
c$omp end parallel 

나는 지금으로는 다음 수정 된 코드를 추가하고, 여전히 어떤 개선 수정 된 코드를 확인하지 않는 것 :

c$omp parallel shared (zetun,zetvn) private (i,j,jm,jp,im,ip,km) 

    c$omp do schedule(DYNAMIC,20) 
    do j=2,jmaxm 
     jm=j-1 
     jp=j+1 
      do i=2,imaxm 
       if (rmask(i,j).eq.1.0)then 
      im=i-1 
      ip=i+1 
      zetun(i,j)= 
      + (un(im,j,km)+un(ip,j,km)-2.*un(i,j,km))*recdx2 
      + + ((un(i,jp,km)-un(i,j,km))- 
      + (un(i,j,km)-un(i,jm,km)))*recdy2 

      zetvn(i,j)= 
      + ((vn(ip,j,km)-vn(i,j,km))- 
      + (vn(i,j,km)-vn(im,j,km)))*recdx2 
      + + (vn(i,jp,km)+vn(i,jm,km)-2.*vn(i,j,km))*recdy2 
       endif 

      end do 

    end do 
c$omp end do 
c$omp end parallel 

답변

2

코드는 유효하지 않습니다. jm, jp, imip은 최소한 비공개이어야합니다. 또한 ordered이 필요한 이유는 무엇입니까? 확실히 속도가 느려집니다. 또한, hhy schedule dynamic 같은 큰 덩어리? 그냥 static을 사용하십시오.

또한 코드를 작성할 때 줄 들여 쓰기를 사용하거나 적어도 코드를 다른 사람에게 제시 할 때 사용하십시오.

+0

나는 그랬지만 지금은 더 많은 시간을 보냈다. 필요한 것은 어떨까? –

+0

수정 된 코드를 표시하고 누가 이전 버전을 수정하려고합니까? –

+0

@HighPerformanceMark 예 위의 동일한 코드에서 jm, jp, im 및 ip를 개인용으로 추가했지만 여전히 느린 것도 변경되었습니다. 정적 인 청크 –

관련 문제