Stratégie « First Touch »
Les aspects NUMA sont à considérer plus particulièrement lorsqu’on utilise un parallélisme en mémoire partagée (OpenMP).
Sur les architectures multi-sockets, le temps nécessaire pour acheminer les données de la mémoire vers les cœurs de calcul dépend de leur localité.
Dans ce cas, on préférera optimiser les temps d’accès mémoire en s’assurant que les données accédées par chaque thread se trouvent sur le socket sur lequel il s’exécute.
Prenons l’exemple suivant :
program vect implicit none use omp_lib integer :: i integer, parameter :: n=655360000 real(kind=8), allocatable,dimension(:) :: a, b, c allocate(a(n), b(n), c(n)) !$omp parallel!$omp do schedule (static)
do i=1,n a(i)=0. b(i)=sin(2.*i) c(i)=cos(2.*i) enddo !$omp end do !$omp barrier!$omp do schedule (static)
do i=1,n a(i)=b(i)*c(i) enddo !$omp end do !$omp end parallel end program vect
Chaque thread va initialiser les portions des tableaux a
, b
et c
qui lui correspondent. Si l’espace mémoire disponible le permet, les données seront alors écrites dans la RAM du socket sur lequel s’exécute chaque thread (boucle 1).
Lors du traitement parallèle de la seconde boucle, la lecture et l’écriture des données par chaque thread sera alors directe (pas d’échange de données inter-sockets) (boucle 2).
On parle de stratégie « First Touch », elle permet d’allouer les données avec une localité optimale.