== Description ==
Partie du standard MPI-2, '''MPI-IO''' est une famille de routines [[MPI/fr|MPI]] qui permet l'enregistrement d'opérations parallèles de lecture et d'écriture. Le principal avantage de MPI-IO est de pouvoir, de manière simple et efficace, lire et écrire des données réparties sur plusieurs processus en un seul fichier commun à tous les processus. Ceci s'avère particulièrement utile lorsque les données manipulées sont des vecteurs ou des matrices découpés de manière structurée entre les différents processus. Vous trouverez ici quelques indications à propos de l'utilisation de MPI-IO et des références vers des documents plus complets
== Utilisation==
=== Opérations par déplacements ===
La manière la plus simple de faire des opérations de lecture et écriture en parallèle est d'utiliser des déplacements (''offsets''). Chaque processus peut ainsi lire ou écrire dans le fichier avec un déplacement défini. Cela peut se faire en deux opérations ([http://www.open-mpi.org/doc/current/man3/MPI_File_seek.3.php MPI_File_seek] suivie de [http://www.open-mpi.org/doc/current/man3/MPI_File_read.3.php MPI_File_read] ou de [http://www.open-mpi.org/doc/current/man3/MPI_File_write.3.php MPI_File_write]), ou bien en une seule opération ([http://www.open-mpi.org/doc/current/man3/MPI_File_read_at.3.php MPI_File_read_at] ou [http://www.open-mpi.org/doc/current/man3/MPI_File_write_at.3.php MPI_File_write_at]). On calcule habituellement le déplacement en fonction du rang du processus.
{{
File
|name=mpi_rw_at.c
|contents=
#include
#define BLOCKSIZE 80
#define NBRBLOCKS 32
int main(int argc, char** argv) {
MPI_File f;
char* filename = "testmpi.txt";
char buffer[TAILLEBLOC];
int rank, size;
int i;
/* MPI Initialization */
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
/* Buffer initialization */
memset(buffer, 'a'+rank, BLOCKSIZE);
buffer[BLOCKSIZE - 1] = '\n';
MPI_File_open(MPI_COMM_WORLD, filename, (MPI_MODE_WRONLY {{!}} MPI_MODE_CREATE), MPI_INFO_NULL, &f);
/* Write data alternating between the processes: aabbccddaabbccdd... */
MPI_File_seek(f, rank*BLOCKSIZE, MPI_SEEK_SET); /* Go to position rank * BLOCKSIZE */
for (i=0; i
#include
#define BLOCKSIZE 80
#define NBRBLOCKS 32
int main(int argc, char** argv) {
MPI_File f;
MPI_Datatype type_intercomp;
MPI_Datatype type_contiguous;
char* filename = "testmpi.txt";
char buffer[BLOCKSIZE];
int rank, size;
int i;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
/* Buffer initialization */
memset(buffer, 'a'+rank, BLOCKSIZE);
buffer[BLOCKSIZE - 1] = '\n';
MPI_File_open(MPI_COMM_WORLD,
filename,
(MPI_MODE_WRONLY {{!}} MPI_MODE_CREATE),
MPI_INFO_NULL,
&f);
/* Write data alternating between the processes: aabbccddaabbccdd... */
MPI_Type_contiguous(BLOCKSIZE, MPI_CHAR, &type_intercomp);
MPI_Type_commit(&type_intercomp);
for (i=0; i