减少CUDA中的矩阵行或列

Ran*_*Ran 5 cuda cublas

我正在使用CUDA cuBLAS来执行矩阵运算.

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

有没有更好的方法?找不到任何东西cuBLAS.

谢谢.

kan*_*yin 5

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

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

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

  1. cublas_gemv() 基本上是一个mem带宽绑定操作,额外的算术指令不会成为瓶颈;
  2. FMA指令进一步降低了指令吞吐量;
  3. 一个矢量的mem通常比矩阵小得多,并且可以通过GPU轻松缓存以减少mem带宽.

cublas_gemv()还可以帮助您处理矩阵布局问题.它适用于row/col-major和任意填充.

我也问了一个类似的问题.我的实验表明,cublas_gemv()比分段减少使用更好Thrust::reduce_by_key,这是矩阵行求和的另一种方法.