【问题标题】:Normal Cuda Vs CuBLAS?普通 Cuda 与 CuBLAS?
【发布时间】:2014-11-08 06:27:03
【问题描述】:

只是出于好奇。 CuBLAS 是一个用于基本矩阵计算的库。但是,这些计算通常也可以很容易地用普通的 Cuda 代码编写,而无需使用 CuBLAS。那么,CuBLAS 库和您自己的 Cuda 程序用于矩阵计算的主要区别是什么?

【问题讨论】:

  • 是不是和普通的C代码和CPU上的BLAS库的关系类似,编译器级别的优化呢?但 GPU 本质上是多线程的,所以情况可能与 CPU 上的情况不太一样。说一个矩阵加法。

标签: cuda cublas


【解决方案1】:

出于多种原因,我们强烈建议开发人员在合适的时候使用 cuBLAS(或 cuFFT、cuRAND、cuSPARSE、thrust、NPP):

  • 我们在每个受支持的硬件平台上验证正确性,包括我们知道即将推出但可能尚未发布的平台。对于复杂的例程,完全有可能在一种架构(甚至一个芯片)上出现错误,而在其他架构上却没有。这甚至可能发生在编译器、运行时等的更改中。
  • 我们测试我们的库在相同广泛的平台上的性能回归。
  • 如果您发现它们,我们可以修复我们代码中的错误。我们很难用你的代码做到这一点:)
  • 我们一直在寻找可以将哪些可重用且有用的功能位提取到库中 - 这可以为您节省大量的开发时间,并通过编写更高级别的 API 使您的代码更易于阅读。

老实说,在这一点上,我一方面可以指望实际实现自己的密集线性代数例程而不是调用 cuBLAS 的开发人员的数量。在学习 CUDA 时这是一个很好的练习,但对于生产代码,通常最好使用库。

(披露:我负责管理 CUDA 库团队)

【讨论】:

  • 那么请提供源代码,否则如果由于cuBLAS中的错误而出现问题非常耗时
  • 另外,cuBLAS 函数不再可以从内核启动(从 cuda 10.0 开始)?那么它的用处就少了很多。 link to forum post
  • 根据 GTC Spring 2021 nvidia.com/en-us/on-demand/session/gtcspring21-s31754 上的谈话(免费访问,但需要注册帐户),cuBLASdx,一个可以与自定义内核融合的 cuBLAS 版本即将推出。 cuFFT 和 cuSOLVER 已经有各​​自的版本。
【解决方案2】:

您选择使用库而不是编写自己的实现有几个原因。三,在我的头顶:

  1. 您不必编写它。别人替你做事,为什么还要工作?
  2. 它将被优化。 NVIDIA 支持的库(例如 cuBLAS)可能会针对当前所有的 GPU 代进行优化,而后续版本将针对后续代进行优化。虽然大多数 BLAS 操作看起来很容易实现,但要获得最佳性能,您必须针对硬件进行优化(这不是 GPU 独有的)。例如,SGEMM 的简单实现可能比优化版本慢很多倍。
  3. 他们倾向于工作。您在库中遇到错误的机会可能更少,然后您会在自己的实现中创建错误,当您将来更改某些参数或其他参数时会咬您。

以上内容不仅仅与 cuBLAS 相关:如果您有一个方法在受良好支持的库中,那么与使用您自己的实现相比,使用它可能会节省大量时间并获得大量性能。

【讨论】:

  • +1,但至于第 3 点,在库中寻找错误可能会变得非常丑陋,而且会发生……偶尔。还可能值得一提的是,如果出现某种特定问题,您始终可以编写一些“定制”代码,这些代码在您的情况下会表现得更好。
猜你喜欢
  • 2010-12-13
  • 2013-06-25
  • 2012-05-30
  • 2014-04-11
  • 2019-06-18
  • 2016-05-15
  • 2013-09-02
  • 2012-02-27
  • 2012-11-26
相关资源
最近更新 更多