普通的CUDA和CuBLAS有什么区别?

7

仅出于好奇,CuBLAS是一个基本矩阵计算库。但通常情况下,这些计算也可以轻松地使用普通的Cuda代码编写,而不必使用CuBLAS。那么,CuBLAS库和您自己编写的矩阵计算Cuda程序之间的主要区别是什么?


这是否类似于普通C代码与CPU上的BLAS库之间的关系,后者可以进行编译器级别的优化?但GPU本质上是多线程的,所以情况可能并不像在CPU上那样。比如矩阵加法。 - Fontaine007
2个回答

32
我们强烈推荐开发人员在适当的情况下使用cuBLAS(或cuFFT、cuRAND、cuSPARSE、thrust、NPP),原因如下:
  • 我们验证了每个支持的硬件平台上的正确性,包括那些我们知道即将推出但可能尚未发布的平台。对于复杂的例程来说,可能会出现在一种结构(甚至一个芯片)上出现的错误却在其他结构上没有出现的情况。这甚至可能发生在编译器、运行时等方面的更改中。
  • 我们测试我们的库在同样广泛的平台上进行性能回归测试。
  • 如果您发现代码中的错误,我们可以修复我们代码中的问题。但是我们很难帮您修复您的代码中的问题 :)
  • 我们始终在寻找可重用和有用的功能块,并将其提取到库中-这可以节省大量开发时间,并通过编码到更高级别的API使您的代码更易读。

老实说,在这一点上,我可能只能数出实际上实现自己的密集线性代数例程而不是调用cuBLAS的开发人员的数量。当您学习CUDA时,这是一个好的练习,但对于生产代码而言,最好使用一个库。

(披露:我领导CUDA Library团队)


26
那么请提供源代码,否则如果由于cuBLAS中的错误而出现问题,将非常耗费时间。 - psihodelia
2
此外,从cuda 10.0开始,cuBLAS函数不再能够从内核中启动。这使得它的实用性大大降低了。论坛帖子链接 - Kari
根据GTC Spring 2021上的一次演讲 https://www.nvidia.com/en-us/on-demand/session/gtcspring21-s31754/(免费访问,但需要注册账户),未来将推出可与自定义内核融合的cuBLASDx版本。目前,cuFFT和cuSOLVER已经有了相应的发布版本。 - Sebastian
你害怕什么?开源代码并保留版权。这是推动使用的正确方式。任何严肃的竞争对手都可以轻松地进行反向工程,那么为什么不采取适当的步骤,提供开放而不是封闭的代码呢? - John
@John,那不是开源,那只是源代码可用,这两者完全不同。 - somebody

12

有几个原因可以选择使用库而不是编写自己的实现。以下是我能想到的三个:

  1. 你不需要亲自编写代码。当别人已经为你完成了这项工作时,何必费力呢?
  2. 它会被优化。像cuBLAS这样的受NVIDIA支持的库很可能会被优化以适用于所有当前的GPU生成,并且后续版本将被优化以适用于后续的生成。虽然大多数BLAS运算似乎非常简单易懂,但为了获得最佳性能,你必须对硬件进行优化(这不仅仅适用于GPU)。例如,SGEMM的简单实现可能比优化版本慢几倍。
  3. 它们往往有效。在使用库时,出错的几率可能小于你自己实现时出错的几率,因为你可能会在将来更改某些参数时出现错误。

以上内容不仅与cuBLAS相关:如果你在一个受到良好支持的库中有一个方法,相对于使用自己的实现,你可能会节省很多时间并获得更好的性能。


1
+1,但是对于第三点,在库中追踪错误可能会变得非常丑陋,这种情况偶尔会发生。另外值得一提的是,如果出现某些特定问题,您可以编写一些“定制”的代码,在您的情况下表现更好。 - Michal Hosala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接