1

我目前必须执行 128 个独立的顺序矩阵向量 CUBLAS 操作。所有的矩阵和向量都是不同的。每个独立矩阵紧跟在下一个矩阵之后存储在内存中,并且向量同样连续存储在内存中(全部以行优先形式)。

更多上下文:矩阵为 (2048 X 8),向量长度为​​ 2048。输出都是独立的。因为我有超级矩阵,所以我有以下内容:

matrix[(2048*128)x8]
vector[(2048*128)x1]
output[(8*128)x1]

使用cublasSgemv我首先对每个迷你矩阵进行转置,然后将结果添加(而不是替换)到内存中:

cublasSgemv(*handle, CUBLAS_OP_T, Bdim, Adim, scale1, d_matrix + offset1, Bdim, d_vector + offset2, 1, scale2, out + offset3, 1);

我正在打 128 个这样的电话,我想在一个电话中进行。

分析器显示进行这些多次调用会显着降低性能。进行多个矩阵向量运算的最佳方法是什么?有没有办法将它们批量处理成一个快速调用?

流是最好的方法还是有一些方法可以用相关的偏移量进行调用(索引到我的矩阵和向量数组)?唯一其他有效的选择似乎是使用 CUSPASE 调用并将所有矩阵粘贴在对角线上。

注意:对于这个特定问题,我对在 gemv 调用中获得正确的转置或行/列主要排序不感兴趣。

4

2 回答 2

1

更新

事实上,如果你想在这种情况下加速你的代码,你必须特别注意 r/c 主要顺序。

如您修改后的问题所示,您使用行优先矩阵。那么你有一个超矩阵 A[(2048*128)x8] 和一个超向量 V[(2048*128)x1]。在这里我假设你想要一个 col-major 矩阵 output[8x128] (可以看作是一个超向量 [(8*128)x1]),其中每个 col 是转置的结果( miniA[2048x8] )*迷你V [2048x1]。

另一方面,CUBLAS 假设矩阵以列为主。所以它可能需要一些额外的矩阵转置例程来改变排序。

由于您需要 128 个独立的 [8x1] 结果,它应该能够在4 个cuda API 调用中计算结果,这应该比您原来的128个调用更有效。

1. Row-major A[(2048*128)x8] can be seen as colum-major AA[8x(2048*128)]
   B[8x(2048*128)] = AA[8x(2048*128)] * diag( V[[(2048*128)x1]] )  by 1 dgmm()

2. C[(2048*128)x8] = transpose( B[8x(2048*128)] )                  by 1 geam()

3. Col-major C[(2048*128)x8] can be seen as col-major CC[2048x(8*128)]
   O[1x(8*128)] = ones[1x2048] * CC[2048x(8*128)]                  by 1 gemv()

4. Row vector O[1x(8*128)] can be seen as col-major matrix OO[128x8]
   output[8x128] = transpose( OO[128x8] )                          by 1 geam()

这个 col-major 输出 [8x128] 是你想要的。

既然您需要adding,那么replacing您可能需要再调用一次来将原始值添加到output

于 2013-09-13T13:00:02.610 回答
1

我已经非常快速地启动了batchCUBLASSDK 示例。我已经考虑128过大小矩阵的独立运行2048x88x1. 以下是 NVIDIA GeForce GT 540M(计算能力 2.1)和 Kepler K20c(计算能力 3.5)上的结果。

对于 NVIDIA GeForce GT 540M 案例,“流式”和“批处理”版本相对于“非流式”cuBLAS 执行没有相关改进。

对于 NVIDIA Kepler K20c,我获得了

sgemm 1.87 GFlops(非流式传输);3.08 GFlops(流式传输);6.58 GFlops(批处理);

dgemm 1.00 GFlops(非流式传输);1.43 GFlops(流式传输);6.67 GFlops(批处理);

流式和批处理案例似乎相关地改进了单精度的非流式案例。

免责声明

  1. 我不像你那样考虑换位;
  2. SDK 示例考虑矩阵-矩阵乘法,而您需要矩阵-向量乘法;gemv 可以进行流式传输,但不能进行批处理。

我希望这些部分结果可以为您提供一些有用的信息。

于 2013-09-15T18:17:13.613 回答