How to use MPI_Irecv?

From OpenMPI docs: C ++ syntax

Request Comm::Irecv(void* buf, int count, const Datatype& datatype, int source, int tag) const 

So, I think I'm doing something like:

 MPI::Request req; req = MPI_Irecv(&ballChallenges[i], 2, MPI_INT, i, TAG_AT_BALL, MPI_COMM_WORLD); 

But he complains:

 error: too few arguments to function 'int MPI_Irecv(void*, int, MPI_Datatype, int, int, MPI_Comm, ompi_request_t**)' 

It seems that ompi_request_t** missing ompi_request_t** , but is it not documented? I tried

 MPI_Irecv(&ballChallenges[i], 2, MPI_INT, i, TAG_AT_BALL, MPI_COMM_WORLD, &req); 

But with an error

 error: cannot convert 'MPI::Request*' to 'ompi_request_t**' for argument '7' to 'int MPI_Irecv(void*, int, MPI_Datatype, int, int, MPI_Comm, ompi_request_t**)' 

So, what about the ompi_request_t part?

+4
source share
1 answer

This works (C):

 #include <stdio.h> #include <string.h> #include <mpi.h> int main(int argc, char **argv) { int rank; const char *msg="Hello!"; const int len=strlen(msg)+1; char buf[len]; MPI_Request isreq, irreq; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &rank); if (rank == 0) { MPI_Isend((void*)msg, len, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &isreq); MPI_Irecv(buf, len, MPI_CHAR, 0, 0, MPI_COMM_WORLD, &irreq); MPI_Cancel(&irreq); MPI_Cancel(&isreq); } MPI_Finalize(); return 0; } 

Or it works (C ++)

 #include <cstring> #include <mpi.h> using namespace MPI; int main(int argc, char **argv) { const char *msg="Hello!"; const int len=strlen(msg)+1; char *buf = new char[len]; Init(argc, argv); int rank = COMM_WORLD.Get_rank(); if (rank == 0) { Request isreq = COMM_WORLD.Isend(msg, len, MPI_CHAR, 0, 0); Request irreq = COMM_WORLD.Irecv(buf, len, MPI_CHAR, 0, 0); isreq.Cancel(); irreq.Cancel(); } Finalize(); return 0; } 
+4
source

Source: https://habr.com/ru/post/1445773/


All Articles