c - 使用 MPI_File_read_at 时出现段错误

标签 c segmentation-fault mpi file-read

我正在尝试编写一个简单的方法来并行读取文件,其中每个进程将从文件中读取多个整数,以便将数据拆分到每个进程,但出现段错误,我无法理解为什么或如何解决它。这是我写的代码:

#include <stdio.h>
#include <stdlib.h>

#include "mpi.h"

#define NUM_INTS 5

int main (int argc, char** argv) {

MPI_Init(&argc, &argv);

int i;
int rank,processes,name_len;
const int root=0;
int *buf;
char *filename = "file.txt";

MPI_File fh;
MPI_Status status;
MPI_Offset offset;

char processor_name[MPI_MAX_PROCESSOR_NAME];

MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &processes);
MPI_Get_processor_name(processor_name, &name_len);

MPI_File_open(MPI_COMM_WORLD, filename, MPI_MODE_RDONLY, MPI_INFO_NULL, &fh);

buf = malloc(NUM_INTS * sizeof(int));

MPI_File_set_view(fh, 0, MPI_INT, MPI_INT, (char *)NULL, MPI_INFO_NULL);

offset = rank * NUM_INTS;

MPI_File_read_at(fh, offset, buf, NUM_INTS, MPI_INT, &status);
MPI_Barrier(MPI_COMM_WORLD);

MPI_File_close(&fh);

for (i=0;i<NUM_INTS;i++)
    printf("rank %d data[%d] = %d\n", rank, i, buf[i]);

free(buf);

MPI_Finalize();
return 0;
}

该文件包含 10 个整数,我尝试将其拆分为 2 个进程。 我认为问题出在 MPI_File_read_at 中,因为所有打印都工作到该行

提前致谢

最佳答案

为什么要将“null”传递给数据类型表示? (事实上​​,你为什么要设置文件 View ?)

如果您遵循@Colin Cassidy 的建议,您的后台跟踪将直接指向问题:它不是 MPI_File_read_at,而是 MPI_File_set_view。

删除该行,或将 (char *)NULL 更改为“native”

此外,您应该检查返回值,但这对您没有帮助。看我对这个问题的回答:How to use and interpret MPI-IO Error codes?

MPICH(或者更确切地说 ROMIO)不应在垃圾输入上出现段错误。我有一个正在审查的补丁。它有一个有趣的副作用,即使您对 MPI_File_set_view 的调用返回一个错误,您可以忽略该错误,然后其余代码的行为就像您希望的那样。

关于c - 使用 MPI_File_read_at 时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26548398/

相关文章:

c++ - 在四核处理器上运行 MPICH 时出错

c - strcpy "address pointing at code space is taken"出现错误

c - 为什么并行和串行版本的执行时间几乎相同

c - 设置 env 后 scons 仍然失败

c++ - 段错误c++导致程序崩溃

c - 使用 GDB 在 "?? ()"中出现内存故障

C++基础程序段错误

c - MPI 上带有指针的结构

c - 后增量和预增量运算符

c - Rand() 似乎无法正常工作