Моя цель состояла в том, чтобы отправить вектор из процесса 0 в процесс 1. Затем отправить его обратно из процесса 1 в процесс 0.
У меня есть два вопроса из моей реализации,
1- Почему отправка обратно из процесса 1 в процесс 0 занимает больше времени, чем наоборот? Первый send-recv занимает в общей сложности ~ 1e-4 секунды, а второй send-recv занимает ~ 1 секунду.
2- Когда я увеличиваю размер вектора, я получаю следующую ошибку. В чем причина этой проблемы?
mpirun заметил, что процесс ранга 0 с PID 11248 на узле server1 завершился по сигналу 11 (ошибка сегментации).
Мой обновленный код C++ выглядит следующим образом
#include <mpi.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <boost/timer/timer.hpp>
#include <math.h>
using namespace std;
int main(int argc, char** argv) {
// Initialize the MPI environment
MPI_Init(NULL, NULL);
MPI_Request request, request2,request3,request4;
MPI_Status status;
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
srand( world_rank );
int n = 1e3;
double *myvector = new double[n];
if (world_rank==0){
myvector[n-1] = 1;
}
MPI_Barrier (MPI_COMM_WORLD);
if (world_rank==0){
boost::timer::cpu_timer timer;
MPI_Isend(myvector, n, MPI_DOUBLE , 1, 0, MPI_COMM_WORLD, &request);
boost::timer::cpu_times elapsedTime1 = timer.elapsed();
cout << " Wallclock time on Process 1:"
<< elapsedTime1.wall / 1e9 << " (sec)" << endl;
MPI_Irecv(myvector, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD, &request4);
MPI_Wait(&request4, &status);
printf("Test if data is recieved from node 1: %1.0f\n",myvector[n-1]);
boost::timer::cpu_times elapsedTime2 = timer.elapsed();
cout <<" Wallclock time on Process 1:"
<< elapsedTime2.wall / 1e9 << " (sec)" << endl;
}else{
boost::timer::cpu_timer timer;
MPI_Irecv(myvector, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &request2);
MPI_Wait(&request2, &status);
boost::timer::cpu_times elapsedTime1 = timer.elapsed();
cout << " Wallclock time on Process 2:"
<< elapsedTime1.wall / 1e9 << " (sec)" << endl;
printf("Test if data is recieved from node 0: %1.0f\n",myvector[n-1]);
myvector[n-1] = 2;
MPI_Isend(myvector, n, MPI_DOUBLE , 0, 0, MPI_COMM_WORLD, &request3);
boost::timer::cpu_times elapsedTime2 = timer.elapsed();
cout<< " Wallclock time on Process 2:"
<< elapsedTime1.wall / 1e9 << " (sec)" << endl;
}
MPI_Finalize();
}
Выходные данные: Время настенных часов в процессе 1:2.484e-05 (сек)
Время настенных часов в процессе 2:0,000125325 (сек)
Проверить, получены ли данные с узла 0: 1
Время настенных часов в процессе 2:0,000125325 (сек)
Проверить, получены ли данные с узла 1: 2
Время настенных часов в процессе 1:1,00133 (сек)
auto_cpu_timer
, а неcpu_timer
. - person Hristo Iliev   schedule 09.12.2016Isend
в ранге 0 работает, потому что ожиданиеrequest4
также продвигает отправку. НоIsend
в ранге 1 не прогрессирует, потому что в запросе нет ожидания. - person Hristo Iliev   schedule 09.12.2016