У меня есть раздел программы Fortran90, который должен быть распараллелен OpenMP.Нетривиальные личные данные в 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
содержит выделенное пространство для использования в качестве рабочих массивов в Fast-Fourier-Transforms.
Очевидно, что каждая нить должна поддерживать независимую копию как targets
, так и pulses
и поддерживать указатели между ними независимо друг от друга. Мне кажется, что это может потребовать слишком многого от автоматического управления памятью OpenMP. Это правильно, или это должно работать из коробки?
Альтернативой, конечно же, является создание копий исходных данных в каждом потоке (хранится в массиве) и использование этих частных скопированных данных в вызове prop
.