用于衡量广播时间的我的MPI计划:
MPI_Barrier(MPI_COMM_WORLD);
total_mpi_bcast_time -= MPI_Wtime();
MPI_Bcast(data, num_elements, MPI_INT, 0, MPI_COMM_WORLD);
MPI_Barrier(MPI_COMM_WORLD);
total_mpi_bcast_time += MPI_Wtime();
我们需要MPI_Barrier等到所有进程完成其作业(同步)。但实际上,MPI_Barrier是一个集体通信(所有进程都报告给root进程继续程序)。所以我们测量的时间将是Barrier_time + Broadcast_time 。 那么如何正确测量广播时间呢? 这是Scalasca的结果:
Estimated aggregate size of event trace: 1165 bytes
Estimated requirements for largest trace buffer (max_buf): 292 bytes
Estimated memory requirements (SCOREP_TOTAL_MEMORY): 4097kB
(hint: When tracing set SCOREP_TOTAL_MEMORY=4097kB to avoid intermediate flushes
or reduce requirements using USR regions filters.)
flt type max_buf[B] visits time[s] time[%] time/visit[us] region
ALL 291 32 0.38 100.0 11930.30 ALL
MPI 267 28 0.38 100.0 13630.27 MPI
COM 24 4 0.00 0.0 30.54 COM
MPI 114 8 0.00 0.1 33.08 MPI_Barrier
MPI 57 4 0.00 0.0 26.53 MPI_Bcast
MPI 24 4 0.00 0.2 148.50 MPI_Finalize
MPI 24 4 0.00 0.0 0.57 MPI_Comm_size
MPI 24 4 0.00 0.0 1.61 MPI_Comm_rank
MPI 24 4 0.38 99.7 95168.50 MPI_Init
COM 24 4 0.00 0.0 30.54 main
但我不知道他们是如何衡量它的。即使我在一台机器上运行它,MPI_Broadcast的成本真的是0%???
答案 0 :(得分:0)
从你的例子看,你想知道的是“从第一个进程进入Bcast通话到最后一个进程离开Bcast通话的时间”。请注意,并非所有时间实际上都花在了MPI_Bcast中。实际上,完全有可能某些进程在其他人进入之前就离开了Bcast呼叫。
无论如何,最好的方法是测量每个过程中第一个屏障和Bcast出口之间的时间,并使用减少来找到最大值:
MPI_Barrier(MPI_COMM_WORLD);
local_mpi_bcast_time -= MPI_Wtime();
MPI_Bcast(data, num_elements, MPI_INT, 0, MPI_COMM_WORLD);
local_mpi_bcast_time += MPI_Wtime();
MPI_Reduce(&local_mpi_bcast_time, &total_mpi_bcast_time, 1, MPI_DOUBLE,
MPI_MAX, 0, MPI_COMM_WORLD);
这仍然不是100%准确,因为流程可能会在稍微不同的时间留下障碍,但是你可以通过MPI获得最佳效果。
我还建议您看一下Zulan建议的性能分析工具,因为它们可以处理所有多过程通信的特性。