【问题标题】:Measuring effective bandwidth on CUDA在 CUDA 上测量有效带宽
【发布时间】:2013-02-03 14:10:10
【问题描述】:

所以我想知道如何计算总内存有效带宽:

cublasSdot(handle, M, devPtrA, 1, devPtrB, 1, &curesult);

该函数低于cublas_v2.h

该函数运行时间为 0.46 毫秒,向量为 10000 * sizeof(float)

我有((10000 * 4) / 10^9 )/0.00046 = 0.086 GB/s吗?

我对此感到疑惑,因为我不知道 cublasSdot 函数内部是什么,也不知道是否有必要。

【问题讨论】:

  • 你如何测量时间? 10000 对于基准测试来说太小了。试试 1,000,000+。
  • 时间不是真实的,我想知道这种方式是否可以,假设是“真实时间”......我只想知道输入的大小和输出的大小?,或者我需要了解函数内部的代码?

标签: performance cuda cublas


【解决方案1】:

如果内核时间以毫秒为单位,则需要乘以 1000。 结果为 86 GB/s。

作为示例,请参阅 NVIDIA 为 Matrix Transpose 提供的示例 在http://docs.nvidia.com/cuda/samples/6_Advanced/transpose/doc/MatrixTranspose.pdf

在最后一页上存在整个代码。有效带宽的计算方式是 2.*1000*mem_size/(1024*1024*1024)/(Time in ms)

【讨论】:

    【解决方案2】:

    在您的情况下,输入数据的大小为 10000 * 4 * 2,因为您有 2 个输入向量,输出数据的大小为 4。有效带宽应约为 0.172 GB/s。

    基本上cublasSdot() 只做计算。 分析结果显示cublasSdot() 调用 2 个内核来计算结果。如果指针模式为 CUBLAS_POINTER_MODE_HOST(这是 cublas lib 的默认模式),也会调用额外的 4 字节设备到主机内存传输。

    【讨论】:

    • 假设我有一个函数“foo(param1, param2, param3)”,其中 param1 和 param2 是向量,param3 是浮点数...现在在函数内部我有很多调用不同的 cublas 函数使用我提到的那个参数......总有效带宽是所有cublas调用的总和?或者我只需要计算函数 foo 所花费的时间并考虑函数 foo 下面的输入和输出?
    • @facunvd:如果您只想向其他人展示您的函数foo() 的有效BW,则应该使用后者。当您优化函数 foo() 以获得更高性能时,您可能需要深入研究函数并测量每个 cublas 调用。
    • 让我看看,我会更准确。我正在开发一个包含不同数值方法的库,每个方法都使用许多 cublas 调用,我想展示每个方法的有效带宽。所以你说我必须测量函数“congujate gradient()”的时间,并使用矩阵 A 和向量 B 的大小并考虑向量 X 的输出来计算有效带宽,对吧?
    • @facunvd 是的,衡量一个函数的有效 BW 不需要了解该函数的实现细节。
    猜你喜欢
    • 2011-07-20
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-28
    • 1970-01-01
    • 2021-12-30
    • 2018-11-17
    相关资源
    最近更新 更多