【问题标题】:CUDA - Simple matrix addition/sum operationCUDA - 简单的矩阵加法/求和运算
【发布时间】:2011-07-22 06:43:51
【问题描述】:

这应该很简单,但我找不到详尽的答案:

我需要用矩阵执行 A+B = C,其中 A 和 B 是两个未知大小的矩阵(它们可以是 2x2 或 20.000x20.000 作为最大值)

我应该使用带有Sgemm函数的CUBLAS来计算吗?

我需要可以达到的最大速度,所以我想到了应该优化的 CUBLAS 库

【问题讨论】:

    标签: matrix cuda sum cublas


    【解决方案1】:

    从 CUBLAS5.0 开始,可以使用 cublasgeam。它计算 2 个可选转置矩阵的加权和。

    【讨论】:

      【解决方案2】:

      对于任何类型的技术计算,您应该始终在可用时使用优化的库。现有的库,被数百人使用,将比你自己做的任何事情都得到更好的测试和更好的优化,而且你不花时间编写(以及调试和优化)功能自己可以更好地花在工作上您想要解决的实际高级问题,而不是重新发现其他人已经实现的东西。这只是劳动力的基本专业化;专注于您想要解决的计算问题,并让那些花费大量时间专业编写 GPGPU 矩阵例程的人来为您解决这些问题。

      只有当您确定现有库不能满足您的需求时——也许它们解决了过于笼统的问题,或者做出了某些不适合您的假设——您才应该自己动手。

      我同意其他人的观点,在这种特殊情况下,操作非常简单,DIY 是可行的;但是,如果您在添加完这些矩阵后还要对这些矩阵做任何其他事情,那么最好为您所使用的任何平台使用优化的 BLAS 例程。

      【讨论】:

      • 好的,我将使用 CUBLAS。也回答 Eric:我也需要它们来进行矩阵乘法(但这不是问题的主题)
      • -1:DIY可行吗?这就是“你好世界!”申请CUDA。
      • 他也在使用 CUBLAS 进行矩阵乘法。他这样做是为了真正的 工作,而不是为了学习CUDA;他正在努力完成真正的事情。 Hello world 与否,仍然存在显着的速度差异,具体取决于块大小等。所以是的,他应该使用优化的库。
      • 快速 - 最快的方法是每个线程有一个输出,还是两个,或更多?单精度和双精度都是这样吗?这个答案和整体性能如何随块大小而变化?网格大小? 那些选择如何随输入大小而变化? OP 应该使用所有这些组合中的哪一种来获得最佳性能?对于生产代码,OP 可以通过所有这些组合,花几天时间学习很多关于 CUDA 和架构的知识,偶尔进行调试——或者他可以,你知道,使用他已经快速运行的库,并完成他的真正工作.
      • 你认为一个刚入门的 CUDA 程序员击败 CUBLAS saxpy 实现的几率是多少?还是他正在做的矩阵乘法?
      【解决方案3】:

      您想做的事情在 CUDA 中实现起来很简单,并且会受到带宽限制。

      【讨论】:

      • 这对我来说并不是那么微不足道。我的意思是:我可以编写代码来计算矩阵总和,但是如何选择网格维度?我知道块应该有多个半扭曲的线程数,但这还不够。我会结束有大量空闲线程。我不确定如何继续
      • 除非您的矩阵具有复杂的内存结构,否则这基本上可以归结为向量加法。编程指南中有一个将两个向量相加的示例。您需要考虑的唯一扩展是您的最后一个扭曲部分超出向量末端的情况,这也不难处理。
      • 所以你建议保持代码尽可能简单.. 即使这样 CUBLAS 也不会比我的更快,或者这完全是错误的?
      • CUBLAS 可能适合您想要做的事情,特别是如果您想最终包含其他矩阵运算。但是,如果您只想做矩阵加法,那就过分了;向量加法几乎是您可以编写的最简单的 CUDA 函数。
      • 我同意埃里克的观点。如果您想要做的只是上面显示的向量加法,那么您自己编写非常容易。请参阅我的帖子了解如何使用 CUDA 对数据进行切片和计算:codeyarns.com/2011/02/16/cuda-work-allocation-techniques
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 2016-08-03
      • 2016-11-17
      • 1970-01-01
      • 2011-03-17
      相关资源
      最近更新 更多