程序过早结束,可能已经崩溃了.退出代码0xc0000005
program ended prematurely and may have crashed. exit code 0xc0000005
这是我的代码,我想用向量数组乘以2D数组:
#include<iostream>
#include<mpi.h>
using namespace std;
int v_array[10] ;
int ch_size, start, close;
int res ;
int rows, cols;
int main(int argc, char *argv[])
{
int pro_id, tot_pros;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &pro_id);
MPI_Comm_size(MPI_COMM_WORLD, &tot_pros);
if (pro_id == 0) {
cout << "Enter rows and columns: ";
cin >> rows >> cols;
int **array = new int*[rows];
int size1 = rows * cols;
array[0] = new int[size1];
for (int j = 1; j < rows; j++) {
array[j] = &array[0][j*cols];
}
for (int i = 0; i < rows; i++) {
v_array[i] = 1;
for (int j = 0; j < cols; j++) {
array[i][j] = 1;
}
}
for (int i = 1; i < tot_pros; i++) {
ch_size = (rows / (tot_pros - 1));
start = (i - 1) * ch_size;
if (((i + 1) == tot_pros) && ((rows % (tot_pros - 1)) != 0)) {
close = rows;
}
else {
close = start + ch_size;
}
MPI_Send(&start, 1, MPI_INT, i, 1, MPI_COMM_WORLD);
MPI_Send(&close, 1, MPI_INT, i, 2, MPI_COMM_WORLD);
MPI_Send(&cols, 1, MPI_INT, i, 4, MPI_COMM_WORLD);
MPI_Send(&array[start][0], ch_size *cols, MPI_INT, i, 3, MPI_COMM_WORLD);
}
}
else
{
int cols;
MPI_Recv(&start, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
MPI_Recv(&close, 1, MPI_INT, 0, 2, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
MPI_Recv(&cols, 1, MPI_INT, 0, 4, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
int **array = new int*[(close - start)*cols];
MPI_Recv(array, (close - start) *cols , MPI_INT, 0, 3, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
for (int i = start; i < close; i++) {
for (int j = 0; j < cols; j++) {
cout << array[i]<<array[j];
res += array[i][j] * v_array[i];
cout << res;
}
}
}
MPI_Finalize();
return 0;
}
当我有静态数组时,同一程序正常工作,但是有动态我得到了这个错误。
e: ms(cs(第二学期 Parallel 编程 program arr_multi debug> mpiexec -n 4 arr_multi.exe Enter 行和列:3 2
作业中断:[排名]消息
[0-1]终止
[2]未拨打最终确定的过程
[3]终止
----错误分析------
[2]在ramisha-pc arr_multi.exe上过早结束,可能有 坠毁。退出代码0xc0000005
----错误分析------
我声明了一个具有连续位置的数组,我的行正确分配给了进程。我认为我的数据结构有问题,并且尝试了许多解决方案,但徒劳无功。
首先,是调试MPI应用程序的方法,这确实是您的首要任务。多过程应用程序的一种一般方法是在应用程序开始时暂停,例如使用getchar()
,然后用debugger附加到每个过程,如下所述在此处:
- 编译,链接并开始运行您的MPI程序(您可能希望在执行下一步时尽早放置
read
语句以保存该程序(- 附加到当前运行的MPI过程之一: debug - 附加到Process 提出一个列出可用过程的对话框。您应该看到可执行文件的
NUM
实例(其中N
来自mpiexec -n NUM
(。选择所有这些,然后单击附加。现在,您可以通过添加断点等进行调试。要在MPI进程之间移动,请使用代码列表上方的Process下拉菜单。
说,至少有一个问题是:int **array = new int*[(close - start)*cols];
(在申请的接收部分中(。您分配第一个维度,而不是第二个维度,因此第一个维度中的所有指示都不是原始化的。
将其更改为:
int *array = new int[(close - start) * cols];
MPI_Recv(array, (close - start) *cols, MPI_INT, 0, 3, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);
for (int i = start; i < close; i++) {
for (int j = 0; j < cols; j++) {
cout << array[(i - start) * cols];
res += array[(i - start) * cols] * v_array[i];
cout << res;
}
}
delete[] array;
或者如果您真的想使用2D数组,请从发送部分复制初始化代码:
int rows = close - start;
int **array = new int*[rows];
int size1 = rows * cols;
array[0] = new int[size1];
for (int j = 1; j < rows; j++) {
array[j] = &array[0][j*cols];
}
第二个问题是,在接收器过程中,v_array
是一个全局的初始化。请记住,在MPI中,每个过程都是一个独立的程序。因此,您应该始终初始化v_array
,即不论pro_id
。
for (int i = 0; i < rows; i++) {
v_array[i] = 1;
}
相关文章:
- 程序过早结束,可能已经崩溃了.退出代码0xc0000005
- C++程序在退出时崩溃
- 全局范围内的对象会导致程序退出时崩溃
- 为什么C Pthread自行退出而没有过程崩溃
- C 程序用退出代码崩溃:9(Sigkill)
- 为什么全局或静态对象会导致程序退出时崩溃
- Boost 测试在使用 Clang 4.1 (LLVM 3.1svn) 退出时崩溃
- 退出应用程序时崩溃
- DirectShow 代码在退出后崩溃(PushSourceDesktop 示例)
- 在DLL中提供的ZeroMQ上下文单例在程序退出时崩溃(VS2010 win7 x64 zmq 4.0x)
- 为什么我的安卓应用在线程退出时崩溃
- OpenCV程序在退出时崩溃linux(使用cvtColor)
- 可视C++程序在退出后崩溃
- 退出后代码崩溃
- 崩溃或被迫退出后,C++动态分配的内存返回
- 试图调试TensorFlow c++代码时,GDB退出/崩溃
- 我的win32程序是否有办法告诉它启动的子进程已经崩溃(而不仅仅是退出)?
- CallWindowProc退出时崩溃
- 应用程序退出时CEF崩溃(QT5+CEF3.2526)
- Exe在c++中退出该方法后崩溃