2013-05-06 1 views
0

Préambule:Comment mettre en œuvre une tâche parallèle embarrassante (boucle FOR) SANS MPI-IO?

J'ai un très grand tableau (une faible) et la nécessité de résoudre l'équation d'évolution (éq ondulatoire). II a besoin de calculer intégrale à chaque valeur de ce tableau, de stocker le tableau résultant d'intégrale et d'appliquer de nouveau l'intégration à ce tableau, et ainsi de suite (en termes simples, j'applique intégrale sur grille de valeurs, stocke cette nouvelle grille, applique l'intégration encore et encore). J'ai utilisé MPI-IO pour répartir sur tous les noeuds: il y a un fichier .dat partagé sur mon disque, chaque copie MPI lit ce fichier (comme source d'intégration), effectue l'intégration et réécrit dans ce fichier partagé. Cette procédure se répète encore et encore. Ça fonctionne bien. La partie qui prenait le plus de temps était l'intégration et la lecture des fichiers était négligeable.

problème actuel:

Maintenant, je me suis déplacé à (CPU 16x64) cluster HPC et maintenant je suis face à un problème inverse: un temps de calcul est NEGLIGIBLE en lecture-écriture processus !!!

J'ai essayé de réduire un certain nombre de processus MPI: je n'utilise que 16 process MPI (pour répartir sur les nœuds) + 64 threads avec OpenMP pour paralléliser mon calcul à l'intérieur de chaque nœud.

Encore une fois, la lecture et les processus d'écriture est la plus longue partie maintenant.

Question

Comment dois-je modifier mon programme, afin d'utiliser la pleine puissance de 1024 processeurs avec une perte minimale?

Le point important, est que je ne peux pas passer à l'étape suivante sans terminer l'ensemble du tableau 1D.

Mes pensées:

Au lieu de lire l'écriture, je peux demander à mon rang = 0 (rang maître) pour envoyer-recevoir l'ensemble du réseau à tous les nœuds (MPI_Bcast). Ainsi, au lieu de chaque E/S de nœud, un seul nœud le fera.

Merci d'avance !!!

+0

Je pense que je suis confus. Il semble que vous lisiez et écriviez sur le disque après chaque itération, et que vous utilisiez les lectures et les écritures pour partager vos données entre tous les processeurs. Mais avec MPI (même sans MPI-IO), il existe des moyens beaucoup plus efficaces de partager les données. Ai-je mal compris votre question? –

+0

Oui, vous avez raison! Après une itération (la matrice complète) est terminée, j'écris (chaque processus MPI écrit sa partie) sur le disque (le fichier partagé). La deuxième itération commence par la lecture de ce fichier (cette matrice est utilisée comme valeur initiale pour l'itération suivante), stocke dans array (qui est local à chaque procs MPI), effectue le calcul et réécrit dans le nouveau fichier partagé sur le disque. Etc. –

+0

Il y a aussi une autre raison pour utiliser la lecture/écriture sur disque (les calculs peuvent être terminés de manière inattendue pour certaines raisons) et je préfère stocker la dernière étape (en évolution) sur mon disque local pour recommencer l'évolution de ce disque étape. –

Répondre

2

je regarderais here et here. Le code FORTRAN pour le second site est here et le code C est here.

L'idée est que vous ne pas donner le tableau entier à chaque processeur. Vous donnez à chaque processeur uniquement la pièce sur laquelle il travaille, avec un certain chevauchement entre les processeurs afin qu'ils puissent gérer leurs limites mutuelles.

En outre, vous avez raison pour enregistrer votre calcul sur le disque tous si souvent. Et j'aime MPI-IO pour ça. Je pense que c'est le chemin à parcourir. Mais les codes dans les liens vous permettront de courir sans lire à chaque fois. Et, pour mon argent, écrivant les données chaque fois est surpuissant.

+0

Super! Merci! Je vais étudier ça! –

+0

Pas de problème. Un upvote ou accepter serait apprécié. Merci! –

+0

Encore une chose: je suis vraiment impressionné que vous ayez pu vous attaquer à MPI-IO sans connaître certaines des choses les plus basiques de MPI. Je dirais que vous allez probablement bien faire avec ce projet. –

Questions connexes