减少CUDA中的矩阵行或列

时间:2013-01-10 15:07:33

标签: cuda cublas

我使用带cuBLAS的CUDA来执行矩阵运算。

我需要对矩阵的行(或列)求和。目前我通过将矩阵乘以一个向量来实现它,但这似乎并不那么有效。

还有更好的方法吗?无法在cuBLAS中找到任何内容。

感谢。

2 个答案:

答案 0 :(得分:5)

实际上使用cublas_gemv()将矩阵与一个向量相乘是一种非常有效的方法,除非您考虑手动编写自己的内核。

您可以轻松地分析cublas_gemv()的内存带宽。它非常接近于简单地读取整个矩阵数据一次,这可以看作是矩阵行/列求和的理论峰值性能。

额外的操作“x1.0”不会导致性能下降,因为:

  1. cublas_gemv()基本上是一个mem带宽绑定操作,额外的算术指令不会成为瓶颈;
  2. FMA指令进一步降低了指令吞吐量;
  3. 一个矢量的存储器通常比矩阵小得多,并且可以通过GPU轻松缓存以减少存储带宽。
  4. cublas_gemv()也可以帮助您处理矩阵布局问题。它适用于row / col-major和任意填充。

    我还问了a similar question这个问题。我的实验表明cublas_gemv()优于使用Thrust::reduce_by_key的分段缩减,这是矩阵行求和的另一种方法。

答案 1 :(得分:1)

提供与此相关的帖子,其中包含有关同一主题的有用答案

Reduce matrix rows with CUDA

Reduce matrix columns with CUDA

这里我只想指出如何通过相同矩阵乘以行来减少矩阵的列的方法可以推广到执行向量集合的线性组合 。换句话说,如果想要计算以下向量基础扩展

enter image description here

其中f(x_m)是函数f(x)的样本,而\psi_n是基函数,而c_n是扩展系数,那么{{1可以在\psi_n矩阵中组织系数N x M在行向量中,然后使用c_n计算向量x矩阵乘法。

下面,我报告了一个完整的例子:

cublas<t>gemv