单GPU线程执行向量加法为何比CPU快约370倍?
单GPU线程执行向量加法为何比CPU快约370倍?
嘿,这个问题的核心原因其实很简单——你的计时方式完全错了!
你可能没意识到,CUDA kernel是异步执行的:当你在CPU代码里调用vector_add_cuda<<<1, 1>>>(...)时,CPU只是把启动kernel的指令发给GPU,然后立刻继续执行后面的代码,根本不会等GPU完成整个向量加法的计算。所以你测出来的51300ns,其实只是GPU启动这个单线程kernel的开销时间,完全不是实际计算1000万次加法的耗时!
要得到真实的GPU计算时间,你需要在kernel启动后、结束计时前,加上一句cudaDeviceSynchronize(),强制CPU等待GPU完成所有任务:
auto start = std::chrono::high_resolution_clock::now(); vector_add_cuda<<<1, 1>>>(d_out, d_a, d_b, COUNT); cudaDeviceSynchronize(); // 关键:等待GPU完成计算 auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(std::chrono::high_resolution_clock::now() - start).count();
加上这行之后,你再测就会发现,单GPU线程的耗时会和你预期的一样——比CPU单线程慢不少。
另外补充一点:即使修正计时后,GPU单线程的内存访问效率也可能和CPU有差异,但绝对不会出现370倍的差距,这个离谱的结果完全是异步执行导致的计时误差。
下次做CUDA性能测试时,一定要记得同步设备,不然测出来的时间毫无参考价值哦!
备注:内容来源于stack exchange,提问作者RD4
相关产品推荐
相关产品推荐

