Question

J'ai une partie d'un programme Fortran90 qui devrait être parallélisée avec 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

Ce que je ne suis pas sûr est de savoir si les structures de données complexes peuvent être privés à chaque thread (et comment cela doit être fait - est firstprivate correct). Dans l'exemple de code ci-dessus, targets est d'un type défini par l'utilisateur quelque peu compliquée, avec des sous-domaines tout aussi complexes. Par exemple, targets(s)%ham%op(1)%pulse est un pointeur sur un élément d'un pulses de tableau. En outre, targets(s)%work contient l'espace alloué à utiliser sous forme de tableaux de travail dans Fourier rapide Transforms.

De toute évidence, chaque thread a besoin de maintenir une copie indépendante les deux targets et de pulses, et maintenir les pointeurs entre les deux indépendamment. Il me semble que cela pourrait être demander un peu trop de la gestion automatique de la mémoire de OpenMP. Est-ce exact, ou si ce travail hors de la boîte?

L'alternative est bien sûr de créer des copies des données originales dans chaque fil (stocké dans un tableau), et d'utiliser ces données copiées privées dans l'appel à prop.

Était-ce utile?

La solution

De ma lecture du OpenMP 2.5 standard, vous ne pouvez pas utiliser les cibles des pointeurs Fortran dans les clauses private (ou firstprivate ou threadprivate), qui semble exclure votre code. Cela dit, ce n'est pas quelque chose que j'ai jamais essayé OpenMP donc si vous obtenez bash avant et partout, faites le nous savoir.

Et firstprivate est correct si vos variables privées doivent être initialisées, l'entrée dans la région parallèle, la valeur des variables du même nom à l'entrée de la région parallèle.

Je suppose que vous aurez probablement à mettre en œuvre votre plan B.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top