发送数组以按顺序排列

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() 函数都期望作为参数指向包含您的数据的区域的指针:

你给他们指针本身的地址(即&amp;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

以上是关于发送数组以按顺序排列的主要内容,如果未能解决你的问题,请参考以下文章

如何比较包含非英文字符的 unicode 字符串以按字母顺序排序?

java 数组顺序排列

更改全局环境以按数字顺序读取

如何将 axlsx 文件分组以按 org 字母顺序排序

以最快的方式重新排序字母以按字典顺序排在第一位

寻找正确的 mule 组件以按 fifo 顺序解复用消息