如果我使用 BLAS/cuBLAS 使其性能优于普通 C/CUDA,矩阵应该有多大?

Posted

技术标签:

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

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

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

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

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

【问题讨论】:

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

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

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

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

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

【讨论】:

以上是关于如果我使用 BLAS/cuBLAS 使其性能优于普通 C/CUDA,矩阵应该有多大?的主要内容,如果未能解决你的问题,请参考以下文章

Unity 容器性能优于直接数据访问 - 一个很大的不同

为啥 React 的性能优于使用 JQuery 的直接 DOM 操作?

为啥我的 Glassfish3.1.2.2/MyFaces2.1.9/JSF 管理的性能优于 TomEE1.5+/CDI 管理的性能?

OpenCL - 全局内存读取性能优于本地

Java ConcurrentHashMap 在性能方面优于 HashMap 吗?

如何进一步优化派生表查询,它的性能优于 JOINed 等效项?