OpenMPI MPI_Gather segfault或断言错误
OpenMPI MPI_Gather segfault or assertion error
我正试图使用OpenMPI为我的本科高年级项目构建一个多进程光线跟踪器,这样我就可以在学校的超级计算机上运行它。
我已经到了代码编译良好、运行良好的地步,直到我到达行
MPI_Gather(subscn,w*rows,MPI_BYTE,&scn,w*rows,MPI_BYTE,0,MPI_COMM_WORLD);
我的问题是这一行的问题是什么,因为它会导致我的程序出错,或者导致(到目前为止)多达5个不同断言错误中的一个,这取决于我运行的进程数量或我试图渲染的场景。
有问题的函数,删除了不必要的printf()语句。
int main(int argc, char **argv) {
init_MPI(argc, argv);
if (argc == 2) {
string arg1 = argv[1];
if (arg1 == "--help" || arg1 == "-?") print_help_message();
}
glutInit(&argc,argv);
bool OK = get_params(argc, argv);
Ray cam;
if (buildScene(scene, cam) == -1) {
MPI_Abort(MPI_COMM_WORLD,rc);
exit(1);
}
if (tid == MASTER) scn.initNewRGBApixmap(w,h); /* RGBA pixel map to display */
int rows = h / numprocs;
RGBA *subscn = new RGBA[w*rows];
samples = samples > 0 ? whitted ? 1 : samples : 1;
MPI_Barrier(MPI_COMM_WORLD); /* Synchronize all processes */
rtrace_time = 0.0 - MPI_Wtime(); /* Begin timer */
MPI_Scatter(&scn,w*rows,MPI_BYTE,subscn,w*rows,MPI_BYTE,0,MPI_COMM_WORLD);
raytrace(cam, rows, subscn);
MPI_Gather(subscn,w*rows,MPI_BYTE,&scn,w*rows,MPI_BYTE,0,MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD); /* Synchronize all processes */
rtrace_time += MPI_Wtime(); /* End timer */
if (tid == MASTER) {
initGlut(argc, argv);
glutMainLoop();
}
MPI_Finalize();
return 0;
}
函数init_MPI(argc,argv)如下所示:
void init_MPI(int argc, char **argv) {
MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD,&tid);
MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
if (numprocs < 2) {
printf("nError: At least two MPI tasks must be created. Exiting.n");
MPI_Abort(MPI_COMM_WORLD,rc);
exit(1);
} else if (numprocs > MAX_PROCS) {
printf("nError: More than %d MPI tasks started. Exiting.n",MAX_PROCS);
MPI_Abort(MPI_COMM_WORLD,rc);
exit(1);
}
}
感谢Hristo Iliev的评论。事实证明,我在调用MPI_Gather()
时使用了两种不同的数据类型。
修改后的代码如下:
int main(int argc, char **argv) {
init_MPI(argc, argv);
if (argc == 2) {
string arg1 = argv[1];
if (arg1 == "--help" || arg1 == "-?") print_help_message();
}
glutInit(&argc,argv);
bool OK = get_params(argc, argv);
Ray cam;
if (buildScene(scene, cam) == -1) {
MPI_Abort(MPI_COMM_WORLD,rc);
exit(1);
}
if (pid == MASTER) scn = new RGBApixmap[w*h];
int rows = h / numprocs;
RGBApixmap *subscn = new RGBApixmap[w*rows];
samples = samples > 0 ? whitted ? 1 : samples : 1;
MPI_Barrier(MPI_COMM_WORLD); /* Synchronize all processes */
rtrace_time = 0.0 - MPI_Wtime(); /* Begin timer */
raytrace(cam, rows, subscn);
MPI_Gather(subscn,w*rows,MPI_BYTE,scn,w*rows,MPI_BYTE,0,MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD); /* Synchronize all processes */
rtrace_time += MPI_Wtime(); /* End timer */
if (pid == MASTER) {
initGlut(argc, argv);
glutMainLoop();
}
MPI_Finalize();
return 0;
}
因此,这里的课程是始终检查数据类型,并确保在MPI Scatter和Gather中没有使用不同的类。
相关文章:
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- 我收到一个断言错误,但是当我编写 cout 语句时,它会消失
- 尝试删除指向派生对象的基指针时断言错误
- Sysmalloc:使用向量的断言错误
- OpenCV CV 查找单应断言错误计数器 = > 4
- Mat的convertTo函数在OpenCV中将灰度图像的类型转换为CV_32F时抱怨断言错误
- 是什么导致我的C 代码中的断言错误
- 迭代器取消引用断言错误
- boost::shared_ptr 断言错误与 boost::asio:io_service
- CDao数据库断言错误
- STL 迭代器:断言错误
- 断言错误,字符串下标超出范围
- 调试断言错误-OpenCV
- 向量push_back会导致断言错误,但列表push_back有效
- 如何在子进程中禁用断言错误对话框
- OpenCV.norm中的断言错误
- 将功能区添加到现有的非功能区 mfc 项目 - 在 VS2010 中断言错误
- 访问指向像素openCV的指针时发生断言错误
- 断言错误,即使在使用 new 初始化字符指针后也是如此
- 使用结构向量 c++ 的断言错误