2017-01-09 1 views
0
내가 Absoft 프로 포트란 사용하고 다음과 같이 내가 코드 조각이

:자동 병렬화 - 너무 복잡 메모리 참조

program test1 

INTEGER :: q, CAPQ, ingrid(1:6), outgrid(1:10) 

ingrid = (/1,2,3,4,5,6/) 
outgrid = 0 
CAPQ = 6 

DO q=1,CAPQ 
     outgrid(q) = ingrid(q) 
ENDDO 

END 

을하지만, 나는 그것이 습관 자동 병렬화 IT 빌드 할 때 이유는

색인 변수 Q가있는 루프는 너무 복잡하여 간략하게 분석 할 수없는 간접 메모리 참조가 포함되어 있기 때문에 병렬 처리 할 수 ​​없습니다.

하지만 이것은 매우 간단한 메모리 액세스입니다. 배열에서 번호를 호출하여 다른 번호에 배치하기 만합니다. 어떤 순서로 발생하는지는 중요하지 않으므로 병렬화 될 수 있습니다.

+0

컴파일러는 잘못된 공유가 발생할 수 있으므로 서로 128 바이트 내에 저장되는 스레드와의 병렬 처리를 피해야합니다. – tim18

+0

병렬 처리를 금지하지 않기 위해이 문제를 해결할 수있는 방법이 있습니까? –

+0

OpenMP에 대한 참조를 삭제했습니다. OpenMP는 자동 병렬화를 다루지 않으며, absoft pro가 자동 병렬화를 위해 OpenMP를 사용한다는 참조를 찾을 수 없습니다. OpenMP와 정말로 관련이 있다고 생각하는지 명확히하십시오. – Zulan

답변

0

저는 Absoft Fortran에 익숙하지 않지만 자동 병렬화와 관련하여 훌륭한 작업을 수행하는 컴파일러를 아직 찾지 못했다고 말할 수 있습니다. 어쨌든 어려운 작업입니다. 코드를 병렬 처리 할 수있는 컴파일러를 기다리지 않아도됩니다. OpenMP (또는 선택할 수있는 병렬화 라이브러리)를 사용하여 코드를 병렬화하는 것이 좋습니다. 그것은 어렵지 않습니다. 특히 코드의 "병목 현상"을 평행선으로 처리하는 것이 좋습니다. 나는 print 문을 추가

program test1 
use omp_lib 
implicit none 

integer :: q, CAPQ, ingrid(1:6), outgrid(1:6) 

ingrid=(/1,2,3,4,5,6/) 
outgrid=0 
CAPQ=6 

!$omp parallel do private(q) 
do q=1,CAPQ 
    outgrid(q)=ingrid(q) 
    print "(2(a,i0))","q=",q," processed by thread ",omp_get_thread_num() 
end do 
!$omp end parallel do 

end program test1 

참고 실행 파일이 실제로 병렬 DO 루프를 실행되고 있는지 확인하기로이 특정 예에서 코드를 쉽게 paralellized 할 수 있습니다. 차이를 확인하려면 두 개의 !#omp 문을 사용하거나 포함하지 않은 예제를 컴파일하고 실행하십시오. 병렬 처리가 활성화 된 경우 병렬 처리가 비활성화 된 경우

q=6 processed by thread 5 
q=4 processed by thread 3 
q=5 processed by thread 4 
q=2 processed by thread 1 
q=3 processed by thread 2 
q=1 processed by thread 0 

과 같이 표시되어야하며 모든 스레드는 0이어야합니다.

위 예제는 gfortran에 있으며 -fopenmp 지시문을 사용하여 컴파일해야합니다. 사용하는 컴파일러에 따라 use omp_lib 문을 비슷한 것으로 대체해야 할 수도 있으며 컴파일러 지시어도 약간 다를 수 있습니다. 온라인에서 찾은 Absoft Pro Fortran User 's Guide에 따르면 컴파일러 지시어는 -openmp입니다. 또한 사용자 안내서에는 "적극적인 OpenMP"병렬화 옵션이 언급되어 있습니다.

+0

오해를 피하기 위해 테스트 루프 Laurence_jj가 게시 한 것처럼 do 루프를 병렬 처리하는 것이 항상 쉬운 것은 아닙니다. do 루프 안의 실제 코드는 단순한 할당 (do 루프를 제거하고 간단한'outgrid (1 : CAPQ) = ingrid (1 : CAPQ) '어쨌든). 루프 내부의 내용에 따라 다른 OpenMP 기능을 포함하여 특별한주의가 필요할 수 있습니다. 그리고 더 악화 될 수 있습니다. 어떤 경우에는 do-loop를 전혀 병렬 처리 할 수 ​​없습니다. – Pap