这是我在4个GPU上运行cublas DGEMM的结果,每个GPU使用2个流(Tesla M2050):
我测试了我的结果,他们没事;与使用默认流的版本相比,我担心我获得的Gflops值很高。我正在使用以下公式计算Gflops:
Gflops = {2.0*10^-9*(N^3+N^2)}/elapsed_time_in_s
对于使用多个流的版本,我是否需要以任何方式修改此公式?
HtoD-ker-DtoH
是主机到设备数据传输,内核执行和设备在几秒钟内主机数据传输所花费的时间(这是上面公式的分母)。
Crosspost到Nvidia论坛 - http://forums.nvidia.com/index.php?showtopic=219910&st=0#entry1350908
编辑:在@talonmies的评论之后,我在计算时间之前添加了cudaStreamSynchronize
,结果如下:
谢谢,
萨扬
答案 0 :(得分:3)
单个C2050可提供大约550 GFLOP / s峰值,或大约2200 GFLOP / s(4个峰值,双精度),而DGEMM远低于峰值),所以我猜你的时序在流情况下是错误的(可能在默认流情况下同步的东西现在是异步的。无论你如何进行计算,FLOP / s计算都不应该改变。
我会检查您的代码,以确保您使用的任何计时机制都与您启动的所有流同步,或者通过所有流中的cudaStreamWaitEvent
机制,或者每个流cudaStreamSynchronize
。在GPU完成CUBLAS操作之前,您可能会尝试计算时间的时间偏差。