Matrix CUDA-简单矩阵加法/求和运算

Matrix CUDA-简单矩阵加法/求和运算,matrix,cuda,sum,cublas,Matrix,Cuda,Sum,Cublas,这应该很简单,但我找不到详尽的答案: 我需要对矩阵执行A+B=C,其中A和B是两个大小未知的矩阵(它们可以是2x2或20.000x20.000作为最大值) 我应该使用CUBLAS和Sgemm函数来计算吗 我需要可以达到的最大速度,所以我想到了CUBLAS库,它应该得到很好的优化您想要在CUDA中实现的功能非常简单,并且带宽有限。对于任何类型的技术计算,您都应该在可用时使用优化的库。数百人使用的现有库将比您自己做的任何事情以及您不花在编写(调试和优化)上的时间得到更好的测试和优化这个功能可以更好地

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

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

我应该使用CUBLAS和Sgemm函数来计算吗


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

您想要在CUDA中实现的功能非常简单,并且带宽有限。

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

只有当您确信现有的库不能满足您的需要时——可能它们解决了太一般的问题,或者做出了某些假设,而这些假设在您的情况下并不成立——您才应该使用自己的库


我同意其他人的看法,在这种特殊情况下,操作非常简单,DIY是可行的;但是,一旦添加完这些矩阵,如果您打算对它们做任何其他事情,最好在您所使用的任何平台上使用优化的BLAS例程。

而且由于CUBLAS5.0,cublasgeam可以用于此。它计算2个可选转置矩阵的加权和。

但对我来说,这并不是那么简单。我的意思是:我可以编写代码来计算矩阵和,但是如何选择网格维度呢?我知道块应该有多个线程乘以半扭曲,但这还不够。。我最终将拥有大量空闲线程。我不知道如何处理,除非你的矩阵有一个复杂的内存结构,这基本上可以归结为向量加法。编程指南中有两个向量求和的示例。你需要考虑的唯一扩展是你的最后一个扭曲部分超出矢量的末端,这也不难处理。所以你建议尽可能地保持代码最简单。即使这样,CUBLAS也不会比我的更快,或者这完全是错误的?CUBLAS可能适合您想要做的事情,特别是如果您希望最终包含其他矩阵运算的话。然而,如果你只想做矩阵加法,那就太过分了;向量加法几乎是你能写的最简单的CUDA函数。我同意Eric的观点。如果你想做的只是上面展示的向量加法,那你自己写起来就太容易了。请参阅我的帖子,了解如何使用CUDA对数据进行切片和计算:好的,我将使用CUBLAS。也要回答Eric:矩阵乘法也需要它们(但这不是问题的主题)-1:DIY可行吗?这是CUDA的“Hello world!”应用程序。他还使用CUBLAS进行矩阵乘法。他这样做是为了真正的工作,不是为了学习CUDA;他想把真正的事情做完。不管是不是Hello world,根据块大小等因素,仍然存在显著的速度差异。因此,是的,他应该使用优化的库。快速-最快的方法是每个线程有一个或两个或更多输出吗?单精度和双精度都是这样吗?这个答案以及整体性能如何随区块大小而变化?网格大小?这些选择如何随输入大小而变化?OP应该使用这些组合中的哪一个来获得最佳性能?对于生产代码,OP可以经历所有这些组合,花上几天时间学习CUDA和体系结构,偶尔进行调试——或者,你知道,他可以使用已经运行得很快的库,你认为一个刚开始的CUDA程序员打败CUBLAS saxpy的可能性有多大?还是他在做的矩阵乘法?