Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |  

This web mail archive is frozen.

This page is part of a frozen web archive of this mailing list.

You can still navigate around this archive, but know that no new mails have been added to it since July of 2016.

Click here to be taken to the new web archives of this list; it includes all the mails that are in this frozen archive plus all new mails that have been sent to the list since it was migrated to the new archives.

Subject: Re: [OMPI users] Can't read values with MPI-IO
From: David O. Gunter (dog_at_[hidden])
Date: 2010-01-13 13:55:22


Hello Luís,

You opened the file with write-only mode which causes the subsequent read
to fail - although I do not know why the error checking fails to see that.

If you change MPI_MODE_WRONLY to MPI_MODE_RDWR then your code works fine.

-david

--
David Gunter
HPC-3: Parallel Tools Team
Los Alamos National Laboratory
| Hi, i have this program, that write the rank of a process  on a file.
| Every
| processes write the rank on the same file. Whe i try to read that value,
| is
| always zero.
|
|
| #include <stdio.h>  /*IO stuff lives here*/
| #include <stdlib.h> /*exit lives here*/
| #include <mpi.h>    /*MPI and MPI-IO live here*/
|
|
| //GLobal variables
| int rank;
|
| void mpi(int error_code){
|
|   if (error_code != MPI_SUCCESS) {
|
|     char error_string[BUFSIZ];
|     int length_of_error_string, error_class;
|
|     MPI_Error_class(error_code, &error_class);
|     MPI_Error_string(error_class, error_string, &length_of_error_string);
|     fprintf(stderr, "%3d: %s\n", rank, error_string);
|     MPI_Error_string(error_code, error_string, &length_of_error_string);
|     fprintf(stderr, "%3d: %s\n", rank, error_string);
|   //  send_error = TRUE;
|   }
| }
|
| int main(int argc, char *argv[]){
|
|   int size;
|
|   MPI_File fh;
|
|   MPI_Init(&argc, &argv);
|
|   MPI_Comm_rank(MPI_COMM_WORLD, &rank);
|   MPI_Comm_size(MPI_COMM_WORLD, &size);
|
|   MPI_Errhandler_set(MPI_COMM_WORLD, MPI_ERRORS_RETURN);
|
| /*
|   MPI_MODE_RDONLY --- read only,
|   MPI_MODE_RDWR --- reading and writing,
|   MPI_MODE_WRONLY --- write only,
|   MPI_MODE_CREATE --- create the file if it does not exist,
|   MPI_MODE_EXCL --- error if creating file that already exists,
|   MPI_MODE_DELETE_ON_CLOSE --- delete file on close,
|   MPI_MODE_UNIQUE_OPEN --- file will not be concurrently opened elsewhere,
|   MPI_MODE_SEQUENTIAL --- file will only be accessed sequentially,
|   MPI_MODE_APPEND --- set initial position of all file pointers to end of
| file.
|  */
|
|   MPI_Barrier(MPI_COMM_WORLD);
|
| //OPEN FILE
| // abertura do ficheiro
|   //printf("[%d] - A abrir ficheiro\n", rank);
|   mpi(MPI_File_open(MPI_COMM_WORLD, "buffer.io", MPI_MODE_CREATE |
| MPI_MODE_WRONLY, MPI_INFO_NULL, &fh));
|   MPI_Barrier(MPI_COMM_WORLD);
|
|
| //calcular quantidade de bytes a escrever no ficheiro
|   //MPI_Offset totalNumberOfIntegers
|
| //DEFINE OFFSET
| //definir o offset
|   MPI_Offset myOffset = (MPI_Offset)(rank * sizeof(int));
|   mpi(MPI_File_seek(fh, myOffset, MPI_SEEK_SET));
|   MPI_Barrier(MPI_COMM_WORLD);
|
| //CHECK OFFSET
| // verificar a posição no ficheiro
|   MPI_Offset myCurrentOffset;
|
|   MPI_File_get_position(fh, &myCurrentOffset);
|   printf ("[%d] - My current offset is %lld\n", rank, myCurrentOffset);
|   MPI_Barrier(MPI_COMM_WORLD);
|
| //WRITE RANK IN THE FILE
| // escrita do ficheiro
|   MPI_Status mpiStatus;
|   int write=9;
|
|   mpi(MPI_File_write(fh, &write, sizeof(int), MPI_BYTE, &mpiStatus));
|   printf("[%d] - Escreveu no ficheiro o valor '%d'\n", rank, rank );
|   MPI_Barrier(MPI_COMM_WORLD);
|
| //CALCULATE FILE SIZE
| //calcular quantidade de bytes a ler do ficheiro
|   int numberOfBytes;
|   MPI_Offset totalNumberOfBytes, numberOfBytesToRead;
|
|   MPI_File_get_size(fh, &totalNumberOfBytes);
|   numberOfBytesToRead = totalNumberOfBytes / size;
|   numberOfBytes = (int) numberOfBytesToRead;
|   printf("[%d] - A preparar para ler %d bytes\n", rank, numberOfBytes);
|   MPI_Barrier(MPI_COMM_WORLD);
|
| //RESET OFFSET
| //restaurar valor inicial do offset
|   myOffset = (MPI_Offset)(rank * sizeof(int));
|   mpi(MPI_File_seek(fh, myOffset, MPI_SEEK_SET));
|   MPI_Barrier(MPI_COMM_WORLD);
|
| //CHECK OFFSET
| // verificar a posição no ficheiro
|   MPI_File_get_position(fh, &myCurrentOffset);
|   printf ("[%d] - My current offset is %lld\n", rank, myCurrentOffset);
|   MPI_Barrier(MPI_COMM_WORLD);
|
| //READ FILE
| //leitura do ficheiro
|   int readBuffer=0;
|   // MPI_Status mpiStatus;
|   MPI_File_read(fh, &readBuffer, sizeof(int) , MPI_INT,
| MPI_STATUS_IGNORE);
|   MPI_Barrier(MPI_COMM_WORLD);
|   printf("[%d] - Leu do ficheiro o valor '%d'\n", rank, readBuffer );
|   MPI_Barrier(MPI_COMM_WORLD);
|
| //CLOSE FILE
| // fecho do ficheiro
|   MPI_File_close(&fh);
|   MPI_File_delete("buffer.io", MPI_INFO_NULL );
|
| //end program
|   MPI_Finalize();
|
|   return(0);
|
| }
|
| --
| Cumprimentos
|
| Luís Miranda
| _______________________________________________
| users mailing list
| users_at_[hidden]
| http://www.open-mpi.org/mailman/listinfo.cgi/users