2010-03-22 15 views
4

Quelle est la meilleure façon de disperser une matrice Fortran 90 par ses rangées plutôt que par des colonnes? C'est-à-dire, disons que j'ai une matrice a (4,50) et je veux MPI_SCATTER sur deux processus où chaque partie est alocal (2,50), où le rang 0 a les rangées 1 et 2, et le rang 1 a 3 et 4. Maintenant, en C, c'est simple puisque les tableaux sont des rangs majeurs, mais en Fortran 90, ils sont en colonne majeure. J'essaie d'éviter d'utiliser TRANSPOSE pour inverser une diffusion avant (c'est-à-dire doubler l'utilisation de la mémoire), et je pense qu'il doit y avoir un moyen de MPI pour le faire. Serait-ce MPI_TYPE_VECTOR? MPI_TYPE_CREATE_SUBARRAY?MPI_SCATTER Matrices Fortran par Rangées

De même, que se passe-t-il si j'ai un tableau 3d b (4,50,3) et que je veux deux matrices dispersées de bloc (2,50,3) réparties comme ci-dessus?

+0

Ha! Je n'ai pas remarqué ça. –

Répondre

1

Oui, MPI_TYPE_VECTOR et MPI_TYPE_CREATE_SUBARRAY sont ce que vous voulez. Le premier pour votre premier problème, le second pour votre second. Commentez si vous voulez que j'écrive les appels pour vous!

+0

J'aimerais connaître votre technique, car je n'arrive pas à travailler. Le VECTOR continue à envoyer des ordures et l'appel SUBARRAY ne semble pas vouloir fonctionner avec SCATTER. Il se disperse bien au rang 0, mais pas au rang 1. Ai-je besoin de diffuser mon grand tableau pour que tout le monde puisse le voir quand je fais le SUBARRAY? Si c'est le cas, il serait plus facile d'utiliser BCAST, puis d'utiliser simplement des tranches de tableau. Ou, peut-être, j'ai besoin d'utiliser SCATTERV avec? –

+0

Désolé @Fortran, est allé walkabout. Avez-vous réglé ce problème? Sinon, je vais essayer de répondre demain. –

0

La plupart des appels de transfert de données MPI n'ont-ils pas un argument stride? Réglez-le à la taille du type de données fois la hauteur de la matrice et là vous allez ...

J'ai jeté un coup d'oeil au MPI reference et il n'y avait pas un argument explicite à cela, mais si vous allez à l'exemple 5.12, ils montrent comment envoyer des données entrantes avec MPI_Scatterv et MPI_Gatherv.