Правильное использование MPI_Send и MPI_Recv - PullRequest
0 голосов
/ 12 октября 2019

Я работаю над простой программой на C ++, которая использует MPI для связи между двумя процессами. Если я хочу отправить массив другому процессу, функции MPI_Send и MPI_Recv ожидают указатель на указанный массив:

int MPI_Send(void *buf, int count, MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)
int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status);

В онлайн-учебнике я виделследующее использование MPI_Send и MPI_Recv:

int values[5] = {1, 2, 3, 4, 5};
MPI_Send(values, 5, MPI_INT, 1, 0, MPI_COMM_WORLD);

и

int values[10];
MPI_Recv(&values, 10, MPI_INT, 3, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);

Почему в одном учебном пособии используется только в одном случае values, а в другом случае также оператор адреса &values?

Я написал программу для отправки и получения массивов между двумя процессами, и кажется, что она работает с оператором адреса и без него. Почему это так? Я, конечно, ошибаюсь в своих мыслях. Можете ли вы помочь мне найти мою ошибку?

Вот мой код:

#include <iostream>
#include <mpi.h>

int main(int argc, char** argv) {
    MPI_Init(&argc, &argv);

    // Reading size and rank
    int size, rank;
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    // For every process create array 
    double array[2];
    if (rank == 0) {
        array[0] = 0.1;
        array[1] = 0.2;
    } else {
        if (rank == 1) {
            array[0] = 1.1;
            array[1] = 1.2;
        }
    }

    // Send and receive
    double other_array[2];
    if (rank == 0) {
        MPI_Send(&array, 2, MPI_DOUBLE, 1, 99, MPI_COMM_WORLD);
        MPI_Recv(&other_array, 2, MPI_DOUBLE, 1, 99, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        // OR
        // MPI_Send(array, 2, MPI_DOUBLE, 1, 99, MPI_COMM_WORLD);
        // MPI_Recv(other_array, 2, MPI_DOUBLE, 1, 99, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        std::cout << rank << " " << other_array[0] << " " << other_array[1] << std::endl;
    } else {
        MPI_Recv(&other_array, 2, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        MPI_Send(&array, 2, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD);
        // OR
        // MPI_Recv(other_array, 2, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        // MPI_Send(array, 2, MPI_DOUBLE, 0, 99, MPI_COMM_WORLD);
        std::cout << rank << " " << other_array[0] << " " << other_array[1] << std::endl;
    }

    // Finalisation
    int MPI_Finalize(); 

    return 0;
}

Я скомпилировал и запустил программу, используя

mpic++ -O -Wall main.cpp -o main mpirun -np 2 ./main

...