问题描述
我希望您的帮助可以使我澄清这个问题。 我正在尝试通过公式获得有效带宽
如何在CUDA C / C ++中实现性能指标| NVIDIA开发人员博客 https://developer.nvidia.com/blog/how-implement-performance-metrics-cuda-cc/
Bw_Effective= ( Rb + Wb ) / (t * 10^9)
我的设备是开普勒k40c,其理论带宽为288.38 GB / s。 CUDA SDK 9.0
- N 个要计算的元素数
- A 地图集数量
- K 邻里大小
- P 补丁的大小
- 块数=网格中的块数。就我而言,
(222)/10 * (222)/10 * (112)/10
- Sh 每个块22或20 o 18所需的共享内存大小取决于K
对于A=18
K=11
,P=3
,Blocks = 6348
,Sh= 22
和N=5038523
计算读取的全局内存版本
CUDA-GM
Wb= 4 * N^3
Rb= 4 * N^3 * A * ( K^3 + 2 * K^3 * P^3)
Rb = 20154092
Wb = 2.65568E+13
我们有Bw_Effective= ( 20154092+ 2.65568E+13) / (330.6 * 10^9) = 80.30 GB/s
CUDA-SM
我们具有相同的写入字节,但是减少了读取次数,因为我们在每个块中仅加载了一次所需的元素,然后从共享内存中进行了计算。
Wb= 4 * N^3
Rb= 4 * N^3 * A * K^3 + 4 * A * Blocks * Sh^3 + 4 * N^3 * P^3
Rb = 20154092
Wb = 4.83396E+11
我们有Bw_Effective= ( 20154092+ 4.83396E+11) / (139.58 * 10^9) = 3.46GB/s
我很困惑,因为时间更快但有效带宽更小。这不是我期望的,但是从公式中讲是有意义的,因为我们减少了对全局内存的读取。但是,这意味着即使使用SM,我也无法充分利用设备中资源的全部功能,它甚至可以更快地运行吗?如果是这样,怎么办?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)