У меня есть подпрограмма с именем Transfer (Int) , которая вызывает подпрограммы MPI.В моей основной программе Transfer () вызывается дважды.
... // do some work
transfer(1); // first transfer
... // do some work again
transfer(2); // second transfer
Функция Transfer (Int) выглядит следующим образом
... // do some work
MPI_Barrier(MPI_COMM_WORLD);
t0 = clock();
for(int k=0; k<mpisize; k++) {
MPI_Irecv( (void*)rbuffer[k], rsize[k], MPI_BYTE, k, 0, MPI_COMM_WORLD, reqs+2*k );
MPI_Isend( (void*)sbuffer[k], ssize[k], MPI_BYTE, k, 0, MPI_COMM_WORLD, reqs+2*k+1);
}
MPI_Waitall(2*mpisize, reqs, status);
MPI_Barrier(MPI_COMM_WORLD);
if (mpirank==0) cerr << "Transfer took "<< (double)(clock()-t0)/CLOCKS_PER_SEC << " secs" << endl;
Обратите внимание, чтоЯ только измеряю время связи, исключая предварительную обработку.
Для передачи (1) все буферы отправки и приема имеют размер 0 для каждого k .Так что, по сути, связь не происходит.Тем не менее, передача заняла 1,95 секунды.
Для передачи (2) каждый процессор должен отправлять / получать около 20 КБ от каждого другого процессора.Тем не менее, весь перенос занял всего 0,07 секунды.
Я много раз проводил эксперимент с 1024 процессорами, и измерения были последовательными.Можете ли вы объяснить это явление или что может быть не так?
Спасибо.