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