Если вы уже используете MPI и столкнетесь с проблемой поиска по разделу файла, вместо того, чтобы использовать POSIX, я бы предложил использовать MPI-IO (стандарт как часть MPI2, c. 1996 или около того): Хорошие ссылки:
и в нашем центре у нас есть первая часть этого, что я думаю, довольно хорошо:
Версия вашего кода с MPI-IO:
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>
int main(int argc, char** argv) {
int rank, np;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &np);
const int filesize = 48*1048576; //input filesize 48MB
const int ndoubles = filesize/(sizeof(double)*np);
double *localdata = malloc(ndoubles*sizeof(double));
/* create a type which describes our view of the file --
* in particular, just our subarray of the global array
*/
int globalsizes[1] = {filesize};
int localsizes[1] = {ndoubles};
int starts[1] = {ndoubles*rank};
MPI_Datatype fileview;
MPI_Type_create_subarray(1, globalsizes, localsizes, starts, MPI_ORDER_C, MPI_DOUBLE, &fileview);
MPI_Type_commit(&fileview);
/* read in only our data */
MPI_File fpa;
MPI_Status status;
MPI_File_open(MPI_COMM_WORLD, "512_featurevec.out", MPI_MODE_RDONLY, MPI_INFO_NULL, &fpa);
/* note could use MPI_File_seek instead of file set view */
MPI_File_set_view(fpa, (MPI_Offset)0, MPI_DOUBLE, fileview, "native", MPI_INFO_NULL);
MPI_File_read_all(fpa, localdata, ndoubles, MPI_DOUBLE, &status);
MPI_File_close(&fpa);
/* write out data - it will have same layout, we're just writing instead of erading*/
MPI_File_open(MPI_COMM_WORLD, "output.dat", MPI_MODE_WRONLY|MPI_MODE_CREATE, MPI_INFO_NULL, &fpa);
/* note could use MPI_File_seek instead of file set view */
MPI_File_set_view(fpa, (MPI_Offset)0, MPI_DOUBLE, fileview, "native", MPI_INFO_NULL);
MPI_File_write_all(fpa, localdata, ndoubles, MPI_DOUBLE, &status);
MPI_File_close(&fpa);
free(localdata);
MPI_Type_free(&fileview);
MPI_Finalize();
return 0;
}