我正在尝试在C中使用MPI-IO读入多个文件。我遵循下面的示例:http://users.abo.fi/Mats.Aspnas/PP2010/examples/MPI/readfile1.c
然而,我在一个矩阵中读取的是一个双精度数,而不是一串字符。下面是该实现:
/*
Simple MPI-IO program that demonstrate parallel reading from a file.
Compile the program with 'mpicc -O2 readfile1.c -o readfile1'
*/
#include <stdlib.h>
#include <stdio.h>
#include "mpi.h"
#define FILENAME "filename.dat"
double** ArrayAllocation() {
int i;
double** array2D;
array2D= (double**) malloc(num_procs*sizeof(double*));
for(i = 0; i < num_procs; i++) {
twoDarray[i] = (double*) malloc(column_size*sizeof(double));
}
return array2D;
}
int main(int argc, char* argv[]) {
int i, np, myid;
int bufsize, nrchar;
double *buf; /* Buffer for reading */
double **matrix = ArrayAllocation();
MPI_Offset filesize;
MPI_File myfile; /* Shared file */
MPI_Status status; /* Status returned from read */
/* Initialize MPI */
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
MPI_Comm_size(MPI_COMM_WORLD, &np);
/* Open the files */
MPI_File_open (MPI_COMM_WORLD, FILENAME, MPI_MODE_RDONLY,
MPI_INFO_NULL, &myfile);
/* Get the size of the file */
MPI_File_get_size(myfile, &filesize);
/* Calculate how many elements that is */
filesize = filesize/sizeof(double);
/* Calculate how many elements each processor gets */
bufsize = filesize/np;
/* Allocate the buffer to read to, one extra for terminating null char */
buf = (double *) malloc((bufsize)*sizeof(double));
/* Set the file view */
MPI_File_set_view(myfile, myid*bufsize*sizeof(double), MPI_DOUBLE,
MPI_DOUBLE,"native", MPI_INFO_NULL);
/* Read from the file */
MPI_File_read(myfile, buf, bufsize, MPI_DOUBLE, &status);
/* Find out how many elemyidnts were read */
MPI_Get_count(&status, MPI_DOUBLE, &nrchar);
/* Set terminating null char in the string */
//buf[nrchar] = (double)0;
printf("Process %2d read %d characters: ", myid, nrchar);
int j;
for (j = 0; j <bufsize;j++){
matrix[myid][j] = buf[j];
}
/* Close the file */
MPI_File_close(&myfile);
if (myid==0) {
printf("Done\n");
}
MPI_Finalize();
exit(0);
}然而,当我在关闭第一个文件之后尝试调用MPI_File_open时,我得到了一个错误。我是否需要多个通信器来执行此操作?任何建议都将不胜感激。
发布于 2012-04-22 18:28:13
上面ArrayAllocation中的代码与主程序的逻辑不太匹配。在MPI初始化之前,矩阵被分配为指向双精度向量的指针数组,因此不可能将行数设置为MPI进程的数量。
在确定文件大小之前,column_size也是未知的。
在C语言中,按行存储矩阵是一种通用约定。违反此约定可能会使您或代码的读者感到困惑。
总而言之,为了让这个程序正常工作,您需要声明
int num_procs, column_size;作为全局变量,并将对此函数的调用下移到计算ArrayAllocation的行下:
...
/* Calculate how many elements each processor gets */
bufsize = filesize/np;
num_procs = np;
column_size = bufsize;
double **matrix = ArrayAllocation();
...通过上面的修改,这个示例应该适用于任何支持MPI-IO的MPI实现。我已经用OpenMPI 1.2.8测试过了。
为了生成测试文件,您可以使用例如以下代码:
FILE* f = fopen(FILENAME,"w");
double x = 0;
for(i=0;i<100;i++){
fwrite(&x, 1,sizeof(double), f);
x +=0.1;
}
fclose(f);https://stackoverflow.com/questions/10256908
复制相似问题