Как использовать 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?


person Jiew Meng    schedule 13.11.2012    source источник
comment
MPI_Irecv взято из привязки C. Он не возвращает запрос, а передает его в последнем аргументе. Все функции в привязках C с очень небольшим набором исключений возвращают код состояния MPI. Обратите внимание, что привязки C++ были удалены из стандарта MPI-3.0 и ранее считались устаревшими в MPI-2.2. Вы должны использовать привязки C в приложениях C++.   -  person Hristo Iliev    schedule 13.11.2012
comment
@HristoIliev, кажется, последний параметр MPI_Request? Что такое просто int? Как я могу отменить это тогда?   -  person Jiew Meng    schedule 13.11.2012
comment
@JiewMeng, вы можете либо использовать синтаксис C++, Request Comm::Irecv(void* buf,... который возвращает MPI::Request, или вы можете использовать синтаксис C, MPI_Irecv(&ballChallenges[i], 2, MPI_INT, i, TAG_AT_BALL, MPI_COMM_WORLD, &req); который принимает переменную типа MPI_Request как последняя переменная. Вы используете запрос (каким бы образом вы его ни получили) для отмены либо через (синтаксис C++) Request::Cancel(), либо (синтаксис C) MPI_Cancel(&req);   -  person Jonathan Dursi    schedule 13.11.2012
comment
@JonathanDursi, в любом случае мне все равно нужно будет передать MPI_Request?   -  person Jiew Meng    schedule 14.11.2012


Ответы (1)


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

#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;
}
person Jonathan Dursi    schedule 14.11.2012
comment
Правда ли, что синтаксис C++ будет объявлен устаревшим? Из 1-го комментария к моему исходному вопросу: Обратите внимание, что привязки C++ были удалены из стандарта MPI-3.0 и ранее устарели в MPI-2.2. Вы должны использовать привязки C в приложениях C++ - person Jiew Meng; 14.11.2012
comment
Они были устарели в версии 2.2, фактически удалены в версии 3.0 -- blogs.cisco.com/performance/ - person Jonathan Dursi; 14.11.2012