Вопрос

У меня есть раздел программы на 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.

Это было полезно?

Решение

Судя по моему прочтению стандарта OpenMP 2.5, вы не можете использовать цели указателей Фортрана в private (или firstprivate или threadprivate) предложений, что, похоже, исключает ваш код.Сказав это, я никогда не пробовал этого в OpenMP, поэтому, если вы двинетесь вперед и добьетесь чего-нибудь, дайте нам знать.

И firstprivate правильно, если ваши частные переменные должны быть инициализированы при входе в параллельный регион значениями одноименных переменных при входе в параллельный регион.

Я думаю, вам, вероятно, придется реализовать свой план Б.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top