c - 尝试读取大文件时 MPI_File_read_at_all 给出无效的计数参数

标签 c parallel-processing mpi hpc mpi-io

我编写了一个简单的 C 程序来尝试 MPI-IO;该程序读取一个文本文件,每个进程输出它读取的部分的第一个字符。该程序在不同大小(100KB、30MB、500MB、2.5GB)下运行良好,但当我尝试 7.5GB 文件时,出现此错误:

Invalid count, error stack:
MPI_FILE_IREAD_AT(104): Invalid count argument

我尝试了集体方法(MPI_File_read_at_all)和独立方法(MPI_File_read),但都无法读取7.5GB文件。这是负责读取的代码:

MPI_File fh;
MPI_Offset total_number_bytes, number_bytes;
long long nchars;
int errclass, resultlen;
char err_buffer[MPI_MAX_ERROR_STRING];    

MPI_File_open(MPI_COMM_WORLD, "bigfastq", MPI_MODE_RDONLY, MPI_INFO_NULL, &fh);
MPI_File_get_size(fh, &total_number_bytes);

number_bytes = total_number_bytes/size;
nchars = number_bytes/sizeof(char);
//char buf[nchars+1];
char *buf = (char*)malloc(sizeof(char)*nchars);
MPI_Offset offset = rank*number_bytes;

int err = MPI_File_read_at_all(fh, offset, buf, nchars, MPI_CHAR, &status);
if(err != MPI_SUCCESS){
    MPI_Error_class(err,&errclass);
    if (errclass== MPI_ERR_COUNT) {
        printf("Invalid count class!!\n");
    }
    MPI_Error_string(err,err_buffer,&resultlen);
    fprintf(stderr,err_buffer);

    MPI_File_close(&fh);
    MPI_Finalize();
    return 0;
}

MPI_File_close(&fh);

printf("rank: %d, buf[%lld]: %c, count: %lld\n", rank, offset, buf[offset], count);


MPI_Finalize();

您知道为什么在尝试 7.5GB 文件时会出现此错误吗?

提前致谢!

最佳答案

MPI_File_read_at_all()第四个参数(count)是一个int。因此,您的 long long 可能会被截断为负整数。

您可以创建一个大型派生数据类型,以便 count 适合有符号整数,或发出多个较短的读取。

关于c - 尝试读取大文件时 MPI_File_read_at_all 给出无效的计数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48642828/

相关文章:

c++ - 通过 MPI 传递 Armadillo C++ 矩阵

c - MPI C 中每个进程生成的随机数

c - 汇编消息 : Error: attempt to move . org 向后

c - while循环,当它运行 "string"数据时,如何用特定的单词或字母中止它?

multithreading - 并行化会减慢 MatLab 的执行速度

scala - cats-effect:如何获得隐式的 NonEmptyParallel

mpi - MPI_Gather 函数的困难

c - 如何使用 gcc 进行内联汇编来防止错误 "more than 30 operands in ' asm'"

c - Fortran `double precision` 与 C `double` 不同的任何平台?

linux - 如何在 sh 文件中并行运行 shell 脚本命令?