2009-09-25 3 views
1

OpenMP와 병렬 처리해야하는 Fortran90 프로그램 섹션이 있습니다. (어떻게이 작업을 수행해야한다 - 올바른 firstprivate입니까?) 난에 대해 확실 해요 무엇Fortran90 OpenMP의 사소한 개인 데이터

!$omp parallel num_threads(8) & 
!$omp private(j, s, prop_states) & 
!$omp firstprivate(targets, pulses) 
    ! ... modify something in pulses. targets(s)%ham contains pointers to 
    ! elements of pulses ... 
    do s = 1, n_systems 
    prop_states(s) = targets(s)%psi_i 
    call prop(prop_states(s), targets(s)%grid, targets(s)%ham, & 
    &   targets(s)%work, para) 
    end do 
!$omp end parallel 

는 복잡한 데이터 구조는 각 스레드에 개인이 될 수 있는지 여부입니다. 위의 예제 코드에서, targets은 다소 복잡한 사용자 정의 유형이고, 똑같이 복잡한 서브 필드입니다. 예를 들어 targets(s)%ham%op(1)%pulse은 배열 pulses의 일부 요소에 대한 포인터입니다. 또한 targets(s)%work에는 Fast-Fourier-Transforms에서 작업 배열로 사용할 할당 된 공간이 포함되어 있습니다.

분명히 모든 스레드는 targetspulses의 독립 사본을 유지해야하며 두 스레드 사이의 포인터를 독립적으로 유지해야합니다. 이것은 OpenMP의 자동 메모리 관리에서 너무 많이 묻고있는 것 같습니다. 이것이 맞습니까? 아니면 상자에서 꺼내야합니까?

물론 각 스레드 (배열에 저장 됨) 내에 원래 데이터의 복사본을 만들고이 개인 복사 데이터를 prop으로 호출하여 사용할 수 있습니다.

답변

0

OpenMP 2.5 표준을 읽으면서 private (또는 firstprivate 또는 threadprivate) 절에 Fortran 포인터의 대상을 사용할 수 없으므로 코드가 제외됩니다. 그것이 OpenMP에서 시도해 본 것이 아닙니다. 그래서 앞으로 나아가서 어디서나 얻을 수 있다면, 저희에게 알려주십시오.

firstprivate은 병렬 영역에 진입 할 때 개인 변수가 병렬 영역에 대한 항목의 동일한 이름의 변수 값으로 초기화되는 경우 올 바릅니다.

플랜 B를 구현해야 할 것 같습니다.

관련 문제