Dans le problème spécifique que je traite, les processus disposés dans une topologie 3D doivent échanger des parties d'un tableau 3D A(:,:,:)
entre eux. En particulier, chacun doit envoyer un nombre donné de tranches de A
aux processus dans les six sens orientés (par exemple A(nx-1:nx,:,:)
au processus dans la 1ère dimension positive, A(1:3,:,:)
dans la négative, A(:,ny-3:ny,:)
dans la dimension y positive, et bientôt). Pour ce faire, je vais définir un ensemble de types de sous-réseau (au moyen de MPI_TYPE_CREATE_SUBARRAY
) à utiliser dans les communications (peut-être MPI_NEIGHBOR_ALLTOALL
, ou son extension V
ou W
). La question est de ce que le meilleur choix, en termes de performance, entre:MPI - communique 1 élément d'un gros type ou plus d'éléments d'un petit type?
- définissent 3 sous-zones (une pour chaque dimension), chacun étant en fait un tableau 2D, puis faire envoyer les communications le long de chaque une dimension différent nombre de ces types dans les deux directions, ou
- définir 6 sous-réseau (un pour chaque direction orientée), chacun étant toujours un tableau 3D, puis faire les communications envoyer le long de chaque dimension un élément des deux types dans le deux directions?
Enfin, pour être plus général, comme dans le titre, est-il préférable de définir plus MPI dérivée des types de données « de base » et l'utilisation counts
supérieur à 1 dans les communications, ou de définir des types « grandes » et et utiliser counts = 1
dans les communications?