我使用带cuBLAS
的CUDA来执行矩阵运算。
我需要对矩阵的行(或列)求和。目前我通过将矩阵乘以一个向量来实现它,但这似乎并不那么有效。
还有更好的方法吗?无法在cuBLAS
中找到任何内容。
感谢。
答案 0 :(得分:5)
实际上使用cublas_gemv()
将矩阵与一个向量相乘是一种非常有效的方法,除非您考虑手动编写自己的内核。
您可以轻松地分析cublas_gemv()
的内存带宽。它非常接近于简单地读取整个矩阵数据一次,这可以看作是矩阵行/列求和的理论峰值性能。
额外的操作“x1.0”不会导致性能下降,因为:
cublas_gemv()
基本上是一个mem带宽绑定操作,额外的算术指令不会成为瓶颈; cublas_gemv()
也可以帮助您处理矩阵布局问题。它适用于row / col-major和任意填充。
我还问了a similar question这个问题。我的实验表明cublas_gemv()
优于使用Thrust::reduce_by_key
的分段缩减,这是矩阵行求和的另一种方法。
答案 1 :(得分:1)
提供与此相关的帖子,其中包含有关同一主题的有用答案
和
Reduce matrix columns with CUDA
这里我只想指出如何通过相同矩阵乘以行来减少矩阵的列的方法可以推广到执行向量集合的线性组合 。换句话说,如果想要计算以下向量基础扩展
其中f(x_m)
是函数f(x)
的样本,而\psi_n
是基函数,而c_n
是扩展系数,那么{{1可以在\psi_n
矩阵中组织系数N x M
在行向量中,然后使用c_n
计算向量x矩阵乘法。
下面,我报告了一个完整的例子:
cublas<t>gemv