2011-02-11 4 views
0

Je souhaite utiliser MPI pour paralléliser une fonction appelée plusieurs fois dans mon code. Ce que je voulais savoir, c'est que si j'utilise MPI_Init à l'intérieur de la fonction, va-t-il générer les processus à chaque fois que la fonction est appelée ou est-ce que la régénération aura lieu une seule fois? Existe-t-il un modèle de conception connu pour le faire de manière systématique?Utilisation de MPI pour paralléliser une fonction

+0

Retagged avec mpi, puisque cela est vraiment une question sur MPI en général et pas vraiment spécifique à MPICH2 –

+1

Basé sur votre description, vous voudrez probablement envisager d'utiliser OpenMP au lieu de MPI. –

Répondre

2

L'appel MPI_Init() vient d'initialiser l'environnement MPI, il ne fait aucune parallélisation en lui-même, le parallélisme vient de la façon dont vous écrivez le programme

Un parallèle "Bonjour, Monde", le printf() fait des choses différentes en fonction de quel rang (processeur) il fonctionne. Le nombre de processus est déterminé par la façon dont vous exécutez le programme (par exemple le nombre de processus est défini via le paramètre -n à mpiexec ou mpirun)

int main(int argc, char *argv[]) { 

     char name[BUFSIZ]; 
     int length=BUFSIZ; 
     int rank; 
     int numprocesses; 

     MPI_Init(&argc, &argv);  
     MPI_Comm_size(MPI_COMM_WORLD, &numprocesses); 
     MPI_Comm_rank(MPI_COMM_WORLD, &rank); 
     MPI_Get_processor_name(name, &length); 

     printf("%s, Rank %d of %d: hello world\n", name, rank, numprocesses); 

     MPI_Finalize(); 

     return 0; 
} 
2

Ce n'est pas vraiment la façon dont MPI (ou programmation de la mémoire distribuée) fonctionne; vous ne pouvez pas vraiment paralléliser une fonction comme vous le pouvez avec quelque chose comme OpenMP. À MPI, les processus ne sont pas générés au moment de MPI_Init(), mais au moment de l'exécution de l'exécutable (par exemple, avec mpiexec, cela est vrai même avec MPI_Comm_spawn().) En partie, la raison en est que dans l'informatique distribuée, les processus de lancement sur potentiellement un grand nombre de nœuds sans partage est une tâche très coûteuse.

vous pourrait bricoler quelque chose en ayant la fonction que vous appelez être dans un exécutable séparé, mais je ne suis pas sûr que ce que vous

Questions connexes