我有一些流程。每个进程都有一个数组“A”expect from rank 0,其中数组 A 的 expect 也有一个数组 B。
我需要每个进程将A数组发送到rank 0的B数组,我需要发送和接收按顺序进行,即先将rank 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。
最佳答案
函数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 &
关于c - 发送数组以按顺序排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28921795/