У меня есть часть программы 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
В чем я не уверен, так это в том, могут ли сложные структуры данных быть закрытыми для каждого потока (и как это должно быть сделано - правильно ли firstprivate
?). В приведенном выше примере кода targets
относится к довольно сложному определяемому пользователем типу с такими же сложными подполями. Например, targets(s)%ham%op(1)%pulse
— это указатель на какой-то элемент массива pulses
. Кроме того, targets(s)%work
содержит выделенное пространство для использования в качестве рабочих массивов в быстрых преобразованиях Фурье.
Очевидно, что каждый поток должен поддерживать независимую копию как targets
, так и pulses
, а также независимо поддерживать указатели между ними. Мне кажется, что это может быть слишком многого от автоматического управления памятью OpenMP. Это правильно, или это должно работать из коробки?
Альтернативой, конечно, является создание копий исходных данных в каждом потоке (хранящихся в массиве) и использование этих частных скопированных данных в вызове prop
.