[英]MPI_Send/Recv failed sending dynamically allocated int array
我试图了解如何发送数组。 我编写了一个简单的程序,但效果不佳,因为它通常会在分段错误时崩溃。 我的程序有一些参数:
mpirun -np 2 sendTest
这是代码:
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int cpuNum;
int myId;
MPI_Status mpiStatus;
MPI_Init(&argc,&argv);
MPI_Comm_size(MPI_COMM_WORLD,&cpuNum);
MPI_Comm_rank(MPI_COMM_WORLD,&myId);
int *myNumbs=(int*)malloc(2*(sizeof(int)));
int *neighNumbs=(int*)malloc(2*(sizeof(int)));
if(myId==0){
myNumbs[0]=0;
myNumbs[1]=0;
MPI_Send(&myNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD);
MPI_Recv(&neighNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD, &mpiStatus);
cout<<"this is cpu 0, neigh myNumbs=";
for (int i = 0; i < 2; ++i){
printf("%d,",neighNumbs[i]);
}
cout<<endl;
}
else{
myNumbs[0]=1;
myNumbs[1]=1;
MPI_Recv(&neighNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &mpiStatus);
MPI_Send(&myNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD);
cout<<"this is cpu 1, neigh myNumbs=";
for (int i = 0; i < 2; ++i){
printf("%d,",neighNumbs[i]);
}
cout<<endl;
}
MPI_Finalize();
return 0;
}
正如我所说的那样,它通常会因以下错误而崩溃: *** Process received signal *** Signal: Segmentation fault (11) Signal code: Address not mapped (1)
。 但是有时一个或另一个进程接收数据。
您必须传递分配的数组的地址,而不是指向分配的数组的指针的地址。
删除两个&
之前的指针变量:try
MPI_Send(myNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD);
MPI_Recv(neighNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD, &mpiStatus);
代替
MPI_Send(&myNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD);
MPI_Recv(&neighNumbs, 2, MPI_INT, 1, 0, MPI_COMM_WORLD, &mpiStatus);
和
MPI_Recv(neighNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &mpiStatus);
MPI_Send(myNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD);
代替
MPI_Recv(&neighNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD, &mpiStatus);
MPI_Send(&myNumbs, 2, MPI_INT, 0, 0, MPI_COMM_WORLD);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.