Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用MPI在超立方体中广播_C++_Parallel Processing_Mpi - Fatal编程技术网

C++ 使用MPI在超立方体中广播

C++ 使用MPI在超立方体中广播,c++,parallel-processing,mpi,C++,Parallel Processing,Mpi,我试图在超立方体中从进程0广播一个充满1的向量 为什么最后一个进程没有收到向量?错误必须来自发送和接收,但我不知道应该使用哪个函数(Isend、Irecv、send、Recv)。 谢谢在访问任何参与数据之前,您必须明确完成所有非阻塞通信(在您的情况下是MPI\u Irecv)。这意味着您既不能转发数据,也不能打印出来,因为已完成。使用MPI\u Wait,MPI\u Test或其任何any/部分/所有变体(视情况而定) 如果您不需要非阻塞通信,如您的示例所示,请使用阻塞通信(即MPI\u Rec

我试图在超立方体中从进程0广播一个充满1的向量

为什么最后一个进程没有收到向量?错误必须来自发送接收,但我不知道应该使用哪个函数(Isend、Irecv、send、Recv)。
谢谢

在访问任何参与数据之前,您必须明确完成所有非阻塞通信(在您的情况下是
MPI\u Irecv
)。这意味着您既不能转发数据,也不能打印出来,因为已完成。使用
MPI\u Wait
MPI\u Test
或其任何
any
/
部分
/
所有
变体(视情况而定)

如果您不需要非阻塞通信,如您的示例所示,请使用阻塞通信(即
MPI\u Recv

实际上,尽可能使用集体而不是点对点,在您的情况下
MPI\u Bcast
。实现自己的广播不是一个好主意,除非您想学习或真正知道自己在做什么。

因为您使用了
MPI\u-Irecv()
所以在访问接收缓冲区之前必须
MPI\u Wait()
。或者您可以简单地
MPI\u Recv()
。注意:应改用
MPI\u Bcast()
int main(int argc, char **argv) {
  int myRank, nProc;

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
  MPI_Comm_size(MPI_COMM_WORLD, &nProc);
  MPI_Request request;
  MPI_Status status; 

  MPI_Barrier(MPI_COMM_WORLD);
  double start = MPI_Wtime();

  std::vector<int> vector(100, 0);
  if (myRank == 0) {vector = std::vector<int>(100, 1);}

  //Broadcast in a hypercube
  int dimension = log2(nProc);

  for (int step = 0 ; step < dimension ; step++) {
    std::bitset<6> tmpRank(myRank);
    if (tmpRank >> step == 0) { //source
      int neighbor = static_cast<int>(tmpRank.flip(step).to_ulong()); //The neighbor of a source at the step i is the i_th bit flipped, re-converted to int in order to send
      MPI_Send(vector.data(), vector.size(), MPI_INT, neighbor, 0, MPI_COMM_WORLD);
    }
    else { //destination ( if(rank >> step == 1) )
      //MPI_Status status;
      MPI_Irecv(vector.data(), vector.size(), MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &request);
    }
  }
  //

  MPI_Barrier(MPI_COMM_WORLD);
  double end = MPI_Wtime();

  std::cout << "I am process " << myRank << " last element of my vector after broadcast is " << vector.back() << std::endl;

  if (myRank==0) std::cout << " operation time : " << end-start << "[s]" << std::endl;

  MPI_Finalize();
}
 I am process 0 last element of my vector after broadcast is 1
 operation time : 3.40939e-05[s]
 I am process 1 last element of my vector after broadcast is 1
 I am process 2 last element of my vector after broadcast is 1
 I am process 3 last element of my vector after broadcast is 0