5

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部分はどうですか?

4

1 に答える 1

5

これは動作します(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;
}

またはこれは機能します(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;
}
于 2012-11-14T01:55:24.037 に答える