转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~
按照网上的说法,计时使用了torch.cuda.Event(enable_timing=True)和torch.cuda.synchronize(),但跑出来的时间相差还是很大。
其实出现这个问题,是因为我们忽略了一个事实,而这个在网上相关的文章里都没有提:
torch.cuda.synchronize()
dist.barrier()
dist.broadcast
中的wait
那么就很明显了,对于GPU之间的通信而言,只使用synchronize实际上是不够的,因为他只能保证当前GPU完成了CUDA操作。所以要保证GPU间同步,我们还得加barrier。
把计时代码改成类似这种的即可。注意,由于网上对此的相关资料较少,如果是为了计时是可以这样搞,正常执行应该不需要加。我也不是很确定这样是否合理,请大家自行选择哈。
dist.barrier()
start_event.record()
# xxxxxxxx
dist.barrier()
end_event.record()
torch.cuda.synchronize()
这样的计时,两者就很接近了: