MPI分段故障
MPI Segmentation fault
我正在使用MPI并行运行程序并测量执行时间。我目前通过在"voxelise"函数中给出起始和结束索引作为参数来分割每个进程之间的计算。这将处理数据集的不同部分,并将结果存储在"p_voxel_data"中。
然后我想使用"MPI_Gather"将所有这些子数组发送到根进程,以便数据可以写入文件并停止计时器。
程序执行良好,当我有"MPI_Gather"行注释掉,我得到类似于这样的输出:
Computing time: NODE 3 = 1.07 seconds.
Computing time: NODE 2 = 1.12 seconds.
但是当包含这一行时,我得到
"APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
并且根节点0的计算时间显示为一个负数"-1.40737e+08"谁能建议任何问题在我的电话MPI_Gather?
int main(int argc, char** argv)
//-----------------------------
{
int rank;
int nprocs;
MPI_Comm comm;
MPI::Init(argc, argv);
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
/* Set up data for voxelise function */
. . . . . .
clock_t start(clock());
// Generate the density field
voxelise(density_function,
a,
b,
p_control_point_set,
p_voxel_data,
p_number_of_voxel,
p_voxel_size,
p_centre,
begin,
endInd );
std::vector<float> completeData(512);
std::vector<float> cpData(toProcess);
std::copy(p_voxel_data.begin() + begin, p_voxel_data.begin() + endInd, cpData.begin());
MPI_Gather(&cpData, toProcess, MPI::FLOAT, &completeData, toProcess, MPI::FLOAT, 0, MPI_COMM_WORLD);
// Stop the timer
clock_t end(clock());
float number_of_seconds(float(end - start) / CLOCKS_PER_SEC);
std::cout << "Computing time:t" << "NODE " << rank << " = " << number_of_seconds << " seconds." <<std::endl;
if(rank == 0) {
MPI::Finalize();
return (EXIT_SUCCESS);
}
您正在给MPI_Gather地址向量对象,而不是地址向量数据。你必须这样做:
MPI_Gather(&cpData[0], toProcess, MPI::FLOAT, &completeData[0], ...
当然你也要确保尺寸是正确的
相关文章:
- 分段故障(堆芯转储)矢量
- 数组的指针从不分段故障
- Windows 10-使用gtkmm-3.0库和g++[包括再现]的分段故障
- 分段故障 运行C++代码时出现 SIGSEGV
- 分段故障背包问题
- 分段故障 11,从类函数显示动态 C 字符串
- 面临分段故障 使用 ffmpeg 读取视频时,因为"pFormatCtx-> streams [i]-> codecpar"的地址0x00
- 在C++中,当指向删除和指向不同对象时,分段故障指针
- 对程序故障进行分段
- 分段故障说明
- 分段故障(核心转储)-不知道为什么
- 分段故障线程
- hiredis SET遇到分段故障
- 分段故障,合并排序算法
- 多线程程序中的分段故障和gdb回溯上的不完整信息
- 到达主C++之前分段故障
- 分段故障核心使用 IF流转储
- 使用向量的移动键盘排列(分段故障)
- 在二进制树插入和遍历期间,我得到了分段故障
- 分段故障在类之间返回整数