我有一些流程。每个进程都有一个数组“A”,期望从秩0开始,其中数组A的期望也有一个数组B.
我需要每个进程将A数组发送到秩0的B数组。我需要按顺序完成发送和接收,即第一个等级0将数组A的内容发送到B,然后等级1,等级2等。
我的问题是,每个阵列A的大小不一样!以下是我的代码中尝试执行此操作的部分:
if(my_rank!=0)
{
MPI_Send(&A, Asize, MPI_INT, 0, rank, MPI_COMM_WORLD);
}
if(my_rank==0)
{
for(i=1; i<number_of_process; i++)
{
MPI_Recv(&B, n, MPI_INT, i, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
}
}
然后我需要将内容从rank0 A传输到B,因为这是唯一未传输的内容。不幸的是,这会产生运行时错误:
=====================================================================================
= BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
= EXIT CODE: 139
= CLEANING UP REMAINING PROCESSES
= YOU CAN IGNORE THE BELOW CLEANUP MESSAGES
=====================================================================================
APPLICATION TERMINATED WITH THE EXIT STRING: Segmentation fault (signal 11)
阵列声明:
int *A = (int*) malloc( sizeof(int)*n );
int *B = (int*) malloc( sizeof(int)*n );
但阵列A有时会小于n。
答案 0 :(得分:1)
函数MPI_Send()
and MPI_Recv()
都期望作为参数指向包含数据的区域的指针:
你给它们指针本身的地址(即&A
)而不是区域的地址(即由A
的值指示)。结果,指针将被覆盖,堆栈将被破坏,因此您的分段错误。
纠正如下:
MPI_Send(A, Asize, MPI_INT, 0, rank, MPI_COMM_WORLD); // no &
...
MPI_Recv(B, n, MPI_INT, i, i, MPI_COMM_WORLD, MPI_STATUS_IGNORE); // no &