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

标签 c++ cuda blas cublas

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

在我最初的实现中,我使用纯 CUDA 来执行矩阵 vector 运算,现在我试图通过使用 cuBLAS 来优化它。

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

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

最佳答案

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

10-100 个特征/列的运行时间:

enter image description here

因此,对于我的实现,普通 CUDA 变慢的变化点是在 50 列处。 cuBLAS 的 100 个特征在运行时间上有一个跳跃,但这可能是一个人为因素,这些实验只运行了一次,无论如何差异并不大。

当运行更多列时 BLAS Lvl。 2 一贯表现更好:

enter image description here

关于c++ - 如果我使用 BLAS/cuBLAS 以使其性能优于普通 C/CUDA,矩阵应该有多大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35228284/

相关文章:

c++ - Qt - 我有一个 QPushButton QVector,按下了哪个?

c++ - PathFileExistsA 对 UTF-8 失败?

c++ - 为 CUDA 应用程序在自定义类 int2_、float2_ 和 double2_ 之间重载 operator=

c - 无法将 c 代码链接到 lapack/blas : undefined reference

CBLAS mac OS X 架构 x86_64 错误的 undefined symbol

C++ MFC SDI 创建子窗口

java - 在 Java 和 C++ 中可视化二叉树

c++ - CUDA:如何创建二维纹理对象?

cuda - 1 个 CUDA 内核能否在每个时钟(麦克斯韦)处理超过 1 个浮点指令?

cblas_dgemm - 仅在 (beta) 为二次幂时有效