我正在编写一个使用MPI的c ++程序。我的代码的简化版本是
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <mpi.h>
#define RNumber 3000000 //Number of loops to go
using namespace std;
class LObject {
/*Something here*/
public:
void FillArray(long * RawT){
/*Does something*/
for (int i = 0; i < RNumber; i++){
RawT[i] = i;
}
}
};
int main() {
int my_rank;
int comm_sz;
MPI_Init(NULL, NULL);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
LObject System;
long rawT[RNumber];
long * Times = NULL;
if (my_rank == 0) Times = (long*) malloc(comm_sz*RNumber*sizeof(long));
System.FillArray(rawT);
if (my_rank == 0) {
MPI_Gather(rawT, RNumber, MPI_LONG, Times, RNumber,
MPI_LONG, 0, MPI_COMM_WORLD);
}
else {
MPI_Gather(rawT, RNumber, MPI_LONG, Times, RNumber,
MPI_LONG, 0, MPI_COMM_WORLD);
}
MPI_Finalize();
return 0;
};
程序编译正常,但在执行时出现Segmentation fault错误。消息是
=================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 11
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=================================================================================
APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
当我减少RNumber
时,程序运行正常。也许有人可以解释究竟出了什么问题?我是否试图为阵列分配太多空间?如果是这种情况,是否可以通过将结果存储在文件而不是数组中来解决此问题?
如果有可能,请你就我做错的事情发表广泛的评论。
谢谢你的时间和精力!
答案 0 :(得分:2)
有几个可能的问题:
long rawT[RNumber];
这是一个放在堆栈上的大型数组。堆栈大小通常有限制(特别是在多线程程序中),典型大小为1或2兆字节。你最好在这里使用std::vector<long>
。
Times = (long*) malloc(comm_sz*RNumber*sizeof(long));
您应该检查内存分配是否成功。或者更好的是,在这里也使用std::vector<long>
(这也将修复你的内存泄漏)。
if (my_rank == 0) {
// do stuff
} else {
// do exactly the same stuff
}
我猜测else
块应该做些不同的事情;特别是,不涉及Times
的东西,因为除非my_rank == 0
,否则它为空。
更新:使用向量而不是原始数组,只需用你想要的大小初始化它,然后使用指向你将使用(指向)数组的第一个元素的指针:
std::vector<long> rawT(RNumber);
System.FillArray(&rawT[0]);
std::vector<long> Times(comm_sz*RNumber);
MPI_Gather(&rawT[0], RNumber, MPI_LONG, &Times[0], RNumber,
MPI_LONG, 0, MPI_COMM_WORLD);
请注意,如果调整向量大小,指针将无效(尽管如果您只是将其用作数组的替代品,则不需要这样做)。
答案 1 :(得分:1)
您可能想查看从
返回的内容MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
e.g。 comm_sz==0
会导致此问题。
答案 2 :(得分:0)
您没有检查malloc
的返回值。考虑到你试图分配超过三百万的长期,malloc会失败是非常合理的。
这可能不是导致您出现问题的原因。