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에서 작업 배열로 사용할 할당 된 공간이 포함되어 있습니다.
분명히 모든 스레드는 targets
과 pulses
의 독립 사본을 유지해야하며 두 스레드 사이의 포인터를 독립적으로 유지해야합니다. 이것은 OpenMP의 자동 메모리 관리에서 너무 많이 묻고있는 것 같습니다. 이것이 맞습니까? 아니면 상자에서 꺼내야합니까?
물론 각 스레드 (배열에 저장 됨) 내에 원래 데이터의 복사본을 만들고이 개인 복사 데이터를 prop
으로 호출하여 사용할 수 있습니다.