2012-04-07 114 views
3

我必须乘以一个非常小的矩阵(大小 - 10x10)与一个向量几次50000到100000次(甚至可能会超过)。这发生在1000个不同的矩阵中(可能更多)。通过在CUDA上执行此操作会有什么显着的性能提升。我应该在这里使用CUDA吗?

+1

可以同时完成多少个gemv操作?这是了解GPU是否有益的关键。 – talonmies 2012-04-07 07:47:51

回答

4

是的,这是GPU的理想任务。

1

如果要将单个矩阵乘以一个向量50K次,并且每个乘法都是先前的先决条件,则不要使用CUDA。这是一个序列问题,是CPU的最佳套件。但是,如果每个乘法都是独立的,您可以在CUDA上同时乘它们。

只有当你的程序能提供巨大的加速时,每个向量乘法迭代都独立于其他迭代的数据。这样你就可以通过启动相同数量的线程同时启动50K或更多的迭代。

+0

矩阵乘法是关联的。 – 2012-04-08 06:59:19

+2

这不值得赞扬IMO。杰瓦德确实说过,“如果”。在我的回答中,我确实假设了这个问题是关于标准BLAS类型的向量 - 矩阵乘法。当然,在不太可能的情况下,你实际上需要乘以一个具有相同向量50k次的矩阵,你可以得到向量的指数并进行一次乘法运算。 – 2012-04-08 18:59:56

1

根据你在做什么,是的,这可以在GPU上很快完成,但你可能需要运行你自己的内核来获得一些好的性能。

不知道更多关于你的问题,我不能给你太多的建议。但我可以推测一个解决方案:

如果你正在一个向量乘以相同的矩阵几千次,你会更好地发现矩阵的闭合形式为任意功率。您可以使用Cayley-Hamilton定理或约旦规范形式来做到这一点。

我似乎无法从一个快速的谷歌搜索中找到这个实现,但考虑到我在一年级线性代数中做了这个,这并不算太坏。关于Jordan正常形式的一些信息可以在http://en.wikipedia.org/wiki/Jordan_normal_form#Powers找到,它的变换矩阵只是特征向量的矩阵,以及矩阵的逆矩阵。

假设你有一个矩阵A,并且找到约旦正常形式J和所述变换矩阵P,P^-1,则找到

甲^ N = PJ^N P 1 -1

我似乎无法找到实现这一点的良好链接,但计算10x10矩阵的封闭形式将比50,000矩阵乘法耗时更少。而且这个实现可能会在CPU上运行得更快。

如果这是你的问题,你应该看看这个。