使用共享内存和全局内存之间的有效带宽

问题描述

我希望您的帮助可以使我澄清这个问题。 我正在尝试通过公式获得有效带宽

如何在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=11P=3Blocks = 6348Sh= 22N=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 (将#修改为@)