发送数组以按顺序排列
Posted
技术标签:
【中文标题】发送数组以按顺序排列【英文标题】:Send array to rank with order 【发布时间】:2015-05-09 09:59:22 【问题描述】:我有一些流程。每个进程都有一个从 rank 0 开始的数组“A”,其中数组 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。
【问题讨论】:
A 和 B 怎么样:它们是数组 (int A[xxx];
) 还是指针 (int *A
)?你能说明你是如何分配它们的吗?
嘿,是的,我现在会更新我的答案。
【参考方案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 &
【讨论】:
正确。现在这避免了运行时错误,但我仍然没有得到正确的顺序。0, rank
你确定不应该是 rank,0
吗?你检查过这些函数返回的错误码吗?
通过MPI_Send的定义:buf ,count ,datatype ,dest ,tag ,comm
所以看起来rank是0然后是tag。
好的! "not getting the correct order" 是什么意思?您能否解释一下是否将收到的每个 B 都移到其他地方,或者您是否希望 B 包含所有发送过程中收到的所有数据?
假设 P0 A = 1, 2, 3 和 P1 A = 4,5,6,7,9 我期望进入 P0 B = 1, 2, 3, 4, 5 , 6, 7, 9 但数字顺序不正确 有时整个范围不按顺序排列,或者 P2 先出现而不是第一个 P1以上是关于发送数组以按顺序排列的主要内容,如果未能解决你的问题,请参考以下文章