Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <stdio.h>
- #include "mpi.h";
- #include <ctime>
- using namespace std;
- void msg_show(int* msg, int dim) {
- int rank;
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- cout << "rank: " << rank << ", msg = ";
- for (int i = 0; i < dim; i++) {
- cout << msg[i] << ' ';
- }
- cout << endl;
- }
- // создаем сообщение
- int* create_msg(int dim) {
- int* msg;
- int rank;
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- if (rank == 0) {
- msg = (int*)malloc(dim * sizeof(int));
- for (int i = 0; i < dim; i++) {
- msg[i] = 1;
- }
- return msg;
- }
- if (rank == 1) {
- msg = (int*)malloc(dim * sizeof(int));
- for (int i = 0; i < dim; i++) {
- msg[i] = 5;
- }
- return msg;
- }
- }
- int main(int* argc, char** argv) {
- int rank, size, n = 4 * 8;
- int dim_msg = n / 4;
- int* msg;
- int msg_tag_from_zero = 27;
- int msg_tag_from_first = 20;
- int rank_zero_proc = 0;
- int rank_first_proc = 1;
- int buf_elems;
- double time_start_1, time_start_0, time_stop_1, time_stop_0;
- MPI_Request request_from_0_to_1, request_from_1_to_0;
- MPI_Status status_from_0_to_1, status_from_1_to_0;
- MPI_Init(argc, &argv);
- MPI_Comm_rank(MPI_COMM_WORLD, &rank);
- MPI_Comm_size(MPI_COMM_WORLD, &size);
- if (rank == 0) {
- msg = create_msg(dim_msg);
- msg_show(msg, dim_msg);
- time_start_0 = MPI_Wtime();
- //отправляем сообщение
- MPI_Isend(msg, dim_msg, MPI_INT, rank_first_proc, msg_tag_from_zero, MPI_COMM_WORLD, &request_from_0_to_1);
- //выделяем память сообщению
- int* msg_recv;
- msg_recv = (int*)malloc(dim_msg * sizeof(int));
- //принимаем сообщение
- MPI_Irecv(msg_recv, dim_msg, MPI_INT, rank_first_proc, msg_tag_from_first, MPI_COMM_WORLD, &request_from_1_to_0);
- //ждем, пока не примем сообщение до конца
- MPI_Wait(&request_from_1_to_0, &status_from_1_to_0);
- time_stop_1 = MPI_Wtime();
- msg_show(msg_recv, dim_msg);
- MPI_Status status;
- MPI_Send(&time_stop_1, 1, MPI_DOUBLE, 1, 200, MPI_COMM_WORLD);
- MPI_Recv(&time_stop_0, 1, MPI_DOUBLE, 1, 100, MPI_COMM_WORLD, &status);
- cout << "time_0 = " << time_stop_0 - time_start_0 << endl;
- }
- if (rank == 1) {
- msg = create_msg(dim_msg);
- msg_show(msg, dim_msg);
- time_start_1 = MPI_Wtime();
- // отправляем сообщение
- MPI_Isend(msg, dim_msg, MPI_INT, rank_zero_proc, msg_tag_from_first, MPI_COMM_WORLD, &request_from_1_to_0);
- int* msg_recv;
- msg_recv = (int*)malloc(dim_msg * sizeof(int));
- //принимаем его
- MPI_Irecv(msg_recv, dim_msg, MPI_INT, rank_zero_proc, msg_tag_from_zero, MPI_COMM_WORLD, &request_from_0_to_1);
- MPI_Wait(&request_from_0_to_1, &status_from_0_to_1);
- time_stop_0 = MPI_Wtime();
- msg_show(msg_recv, dim_msg);
- MPI_Status status;
- MPI_Send(&time_stop_0, 1, MPI_DOUBLE, 0, 100, MPI_COMM_WORLD);
- MPI_Recv(&time_stop_1, 1, MPI_DOUBLE, 0, 200, MPI_COMM_WORLD, &status);
- cout << "time_1 = " << time_stop_1 - time_start_1 << endl;
- }
- MPI_Finalize();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment