2017-02-20 1 views
0

OpenMP에서는 다소 새로운 개념입니다. 나는 OpenMP 쓰레딩을 사용하여 큰 매트릭스의 모든 요소를 ​​벡터에 작성하여 속도를 높이고 싶다. 내 시리얼 코드에서OpenMP를 사용하여 벡터의 행렬 요소를 벡터로 작성

는 단순히 일을 오전 다음

!$OMP PARALLEL DO PRIVATE(k,i,p,j) 
    ! bla bla 
!$OMP END PARALLEL DO 
:

이제
m=1 
DO k=1,n_lorentz 
    DO i=1,n_channels 
    DO p=1,n_lorentz 
      DO j=1,n_channels 
      vector(m) = Omega(j,p,i,k) 
      m=m+1 
     END DO 
    END DO 
    END DO 
END DO 

내가 병렬 방식으로 벡터에 오메가의 요소를 기입하기위한 OMP 루프를 사용하고 싶습니다

문제는 현재 벡터 인덱스를 추적하는 방법입니다.이 경우 직렬 코드의 m 매개 변수가 다른 스레드에 의해 증가되어 전체 엉망이 발생하기 때문입니다.

답변

4

하나의 대답은 다음과 같습니다. m을 추적 할 필요가 없습니다. 대신 루프를 분석, 우리가 발견하는 :

  • 때마다 하나 하나 j 증가, m 증가;
  • p이 1 씩 증가 할 때마다 mn_channels만큼 증가합니다.
  • i이 1 씩 증가 할 때마다 mn_channels*n_lorentz만큼 증가합니다.
  • k이 1 씩 증가 할 때마다 mn_channels*n_lorentz*n_channels만큼 증가합니다. 이러한 관찰에서

, 당신은 m에 대한 명시 적 표현을 쓸 수 있습니다 :

m = j + n_channels*((p-1) + n_lorentz*((i-1) + n_channels*(k-1))) 

명시 적으로 문제를 :) 해결해야 인덱스를 산출 할 수 있다는.

+0

감사합니다. 이 일을 실제로 않습니다 :) – Cooliofan