Как использовать MPI_Irecv?

Из документов OpenMPI: синтаксис C ++

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

Так что я представляю, что я делаю что-то вроде:

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

Но это жалуется

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

Похоже, я скучаю ompi_request_t**, но это не задокументировано? Пытался

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

Но терпит неудачу с

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**)’

Так что с ompi_request_t часть?

5

Решение

Это работает (с):

#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;
}

Или же это работает (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;
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]