Я работаю над простой программой на 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