我必须将一个非常小的矩阵( size - 10x10 )与一个向量乘以 50000 到 100000 倍(甚至可能更多)。这发生在 1000 个不同的矩阵中(可能更多)。在 CUDA 上执行此操作是否会显着提高性能。
3 回答
是的,这是 GPU 的理想任务。
如果要将单个矩阵与向量相乘 50K 次,并且每次乘法都是前一次乘法的先决条件,则不要使用 CUDA。这是一个串行问题,CPU 的最佳套件。但是,如果每个乘法都是独立的,您可以在 CUDA 上同时将它们相乘。
您的程序将提供巨大加速的唯一情况是当每个向量乘法迭代独立于其他迭代的数据时。这样,您将能够通过启动相同数量的线程同时启动 50K 或更多迭代。
取决于您到底在做什么,是的,这可以在 GPU 上非常快速地完成,但您可能必须运行自己的内核才能从中获得良好的性能。
在不了解您的问题的情况下,我无法给您太多建议。但我可以推测一个解决方案:
如果你取一个向量并将它乘以同一个矩阵几千次,你会更好地找到矩阵的任意幂的封闭形式。您可以使用 Cayley-Hamilton 定理或 Jordan 规范形式来做到这一点。
我似乎无法通过快速谷歌搜索找到它的实现,但考虑到我在第一年的线性代数中做到了这一点,这还不算太糟糕。关于 Jordan 范式的一些信息,并将其提升到幂可以在http://en.wikipedia.org/wiki/Jordan_normal_form#Powers找到,它的变换矩阵只是特征向量的矩阵,而它的逆矩阵矩阵。
假设你有一个矩阵A,你找到Jordan范式J,以及变换矩阵P,P^-1,你会发现
A^n = PJ^n P^-1
我似乎找不到一个很好的链接来实现这个,但是计算一个 10x10 矩阵的封闭形式将比 50,000 个矩阵乘法消耗的时间要少得多。并且这种实现可能会在 CPU 上运行得更快。
如果这是你的问题,你应该调查一下。