我应该在这里使用CUDA吗?

时间:2012-04-07 02:18:24

标签: cuda

我必须将一个非常小的矩阵(大小 - 10x10)与向量相乘50000到100000倍(甚至可能超过这个数)。这种情况发生在1000种不同的矩阵中(可能更多)。通过在CUDA上执行此操作可以获得任何显着的性能提升。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

您的程序将提供巨大加速的唯一情况是每个向量乘法迭代独立于其他迭代的数据。这样,通过启动相同数量的线程,您将能够同时启动50K或更多次迭代。

答案 2 :(得分:1)

取决于你正在做什么,然后是的,这可以在GPU上很快完成,但你可能必须运行自己的内核才能从中获得一些好的性能。

在不了解您的问题的情况下,我不能给您太多建议。但我可以推测一个解决方案:

如果您使用一个向量并将其乘以相同的矩阵数千次,那么您可以更好地找到矩阵的闭合形式到任意幂。你可以使用Cayley-Hamilton定理或Jordan规范形式来做到这一点。

我似乎无法通过快速谷歌搜索找到这方面的实现,但考虑到我在第一年线性代数中做到这一点,它并不太糟糕。关于Jordan正规形式的一些信息,并将它提升到幂可以在http://en.wikipedia.org/wiki/Jordan_normal_form#Powers找到,它的变换矩阵只是一个特征向量矩阵,以及该矩阵的逆矩阵。

假设您有一个矩阵A,并且您找到了Jordan正规形式J,并且找到了转换矩阵P,P ^ -1,您找到了

A ^ n = P J ^ n P ^ -1

我似乎无法找到与此实现的良好链接,但计算10x10矩阵的封闭形式将比50,000个矩阵乘法显着减少耗时。并且在CPU上执行此操作可能会更快。

如果这是你的问题,你应该研究一下。