1

我需要使用小矩阵和内核进行多次卷积,我希望利用 GPU 的许多处理器能够让我尽快完成它。

问题如下:我有很多矩阵(~1,000 到~10,000)或相对较小的尺寸(~15x15 到 1x1 - 如标量),以及一定数量的卷积掩码(~20 到 1)。我需要将所有矩阵与每个卷积掩码示例进行卷积:

A; %5,000 matrices of size 10x10, A(i) = a 10x10 matrix
B; 10 matrices of size 5x5, B(k) = a 5x5 matrix
res(j)=conv(A,B(1)); %res(j) is the result of convolving all 5,000
%matrices in A by the j'th kernel B(j)

目标是尽快计算 res(1),...,res(10)

我想听听有关如何实现最有效算法的建议。基于 FFT 的卷积可能会太慢。

到目前为止,我看到的每个实现都是用于 2d 卷积,意在对 2 个大矩阵进行卷积,而我需要对许多小矩阵进行卷积。

我现在对 CUDA 编程知之甚少,但我正在学习中。

我希望自己解决这个问题,但由于时间限制,我不得不向任何有经验的人寻求任何建议,同时我学习如何在 CUDA 中编码。

谢谢!

ps 任何指向适合我目的的实现的指针都非常感谢。我是一名大学生,这是一个小型研究项目,所以我不需要支付任何费用...

4

2 回答 2

2

我不会假装对你的问题给出最终答案,但我只想指出几点:

  1. 正如您所提到的,第一种可能性是使用 FFT 方法。这条线上的一个问题是(如果我错了,请纠正我)该cuFFT库主要是为处理大型矩阵而设计的,因此要从这种方法中富有成效地受益,将开发对小型矩阵有效的 FFT 例程。我只是想指出有一些此类算法,请参阅例如论文:GPU 上的小型离散傅里叶变换。我对 CUDA FFT 在指定类型的小矩阵上的性能没有直接经验,但也许这对您来说可能很有趣,因为掩码矩阵的数量很少(10),因此您可以“回收”它们的 FFT 大卷积数 ( 5000)。
  2. 如果你决定不使用 FFT 方法,那么,如果你有一个具有计算能力的 GPU 架构>=3.5,那么动态并行可能是计算卷积的一个很好的候选者。如果您将每个卷积矩阵元素的评估视为插值,那么您将遇到大小15x15和动态并行性的插值问题,请参阅帖子:拆分大 CUDA 内核和使用动态并行性的好处
于 2013-07-31T09:47:05.200 回答
0

一种方法是使用我正在研究的 ArrayFire 的GFOR 循环

只要不耗尽 GPU 内存,您就可以将任意数量的小卷积平铺到一个大内核启动中,如下所示:

array x = randu(5);      // the input
array y = randu(m,5);    // the output
array f = constant(1,3); // the kernel
gfor (array k, 0, m-1) {
    y(span,k) = convolve(x,f);
}

祝你好运!

于 2013-08-01T03:11:28.267 回答