【问题标题】:How large should matrices be if I use BLAS/cuBLAS for it to perform better than plain C/CUDA?如果我使用 BLAS/cuBLAS 使其性能优于普通 C/CUDA,矩阵应该有多大?
【发布时间】:2016-05-15 16:10:56
【问题描述】:

我目前正在使用 CUDA、Thrust 和 cuBLAS 在 GPU 上实现随机梯度下降。

在我最初的实现中,我使用普通的 CUDA 来执行矩阵向量运算,现在我试图通过使用 cuBLAS 来优化这一点。

我目前观察到的是,对于大小为行 x 列的矩阵,对于少量列,普通 CUDA 始终优于 cuBLAS,显然与行数无关。 然而,对于大量的列,cuBLAS 实现胜出。

所以我想知道:关于矩阵/向量的最小维度应该是多少,是否有任何经验法则/指南,之后使用 BLAS 或 cuBLAS 将比普通 C/CUDA 表现更好,或者这完全取决于应用程序/BLAS 函数?

【问题讨论】:

  • 请注意,BLAS2(矩阵向量)操作往往受到内存吞吐量的限制。如果可能,您会希望使用 BLAS3 操作。有许多不同的 BLAS2 操作,每个操作都有自己的性能特征(可能会因 GPU 架构而进一步不同),所以你的问题似乎太宽泛了。检查任何批处理操作是否适用于您的用例,因为它们为小型矩阵提供了更好的性能,否则只使用部分机器资源。
  • 您所做的正是您链接到的问题 - 为您的问题规模域和硬件进行基准测试,并使用该数据来驱动您的启发式方法。我非常很想把它作为那个问题的重复来结束。
  • @talonmies 我想知道是否有人已经有这方面的经验。我已经运行了基准测试并作为答案发布,我希望没问题。

标签: c++ cuda blas cublas


【解决方案1】:

我已经运行了一些基准测试,我将在此处发布: 结果是在 10000 行数据集上运行 10 次 SGD 迭代的线性回归任务。此处提供了实现和更多结果:https://github.com/thvasilo/cuda-sgd-sese-project

10-100 个功能/列的运行时:

所以对于我的实现来说,普通 CUDA 变慢的变化点是 50 列。 cuBLAS 的 100 个功能在运行时有一个跳跃,但这可能是一个人工制品,这些实验只运行了一次,而且差异并没有那么大。

当使用更多列 BLAS Lvl 运行时。 2 始终表现更好:

【讨论】:

    猜你喜欢
    • 2014-11-08
    • 2013-09-02
    • 1970-01-01
    • 2012-11-26
    • 2021-12-03
    • 1970-01-01
    • 2015-11-24
    • 2013-01-22
    相关资源
    最近更新 更多