我必须乘以一个非常小的矩阵(大小 - 10x10)与一个向量几次50000到100000次(甚至可能会超过)。这发生在1000个不同的矩阵中(可能更多)。通过在CUDA上执行此操作会有什么显着的性能提升。我应该在这里使用CUDA吗?
回答
是的,这是GPU的理想任务。
如果要将单个矩阵乘以一个向量50K次,并且每个乘法都是先前的先决条件,则不要使用CUDA。这是一个序列问题,是CPU的最佳套件。但是,如果每个乘法都是独立的,您可以在CUDA上同时乘它们。
只有当你的程序能提供巨大的加速时,每个向量乘法迭代都独立于其他迭代的数据。这样你就可以通过启动相同数量的线程同时启动50K或更多的迭代。
矩阵乘法是关联的。 – 2012-04-08 06:59:19
这不值得赞扬IMO。杰瓦德确实说过,“如果”。在我的回答中,我确实假设了这个问题是关于标准BLAS类型的向量 - 矩阵乘法。当然,在不太可能的情况下,你实际上需要乘以一个具有相同向量50k次的矩阵,你可以得到向量的指数并进行一次乘法运算。 – 2012-04-08 18:59:56
根据你在做什么,是的,这可以在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上运行得更快。
如果这是你的问题,你应该看看这个。
- 1. 我应该在这里使用eval()吗?
- 2. 我应该在这里实施IDisposable吗?
- 3. 我应该在这里合并吗?
- 4. 我应该在这里使用工厂
- 5. 我应该在这里使用枚举吗?
- 6. 我应该在这里使用参考光标吗?
- 7. 我应该在这里使用唯一索引吗?为什么?
- 8. 我应该在这里使用例外吗?
- 9. 我应该在这里使用元类吗?
- 10. 我应该在这里使用朋友课吗?
- 11. 我应该在这里使用ref或out关键字吗?
- 12. UML依赖关系 - 我应该在这里使用它吗?
- 13. 我应该在这里使用主键吗?
- 14. 我应该在这里使用擦除 - 删除成语吗?
- 15. 告诉,不要问原则 - 我应该在这里应用吗?
- 16. 我应该使用这种方法吗?
- 17. 使用Lucene.Net,我应该在这里使用什么索引stategy?
- 18. 我应该在哪里放这个JavaScript?
- 19. 我可以在这里使用“is_expected”吗?
- 20. 我应该在这里使用协程或其他调度对象吗?
- 21. 我应该使用Nautilus GIR吗?如果是这样,文档在哪里?
- 22. 我应该穿这个吗?
- 23. 我应该在这里使用awakeFromNib还是initWithCoder?
- 24. 我应该在这里使用哪种设计模式
- 25. 我应该在这里使用什么控件?
- 26. 我应该在这里使用哪种数据结构?
- 27. 工厂类 - 我应该在这里用数据填充我的对象吗?
- 28. 我应该在哪里使用OnActivityResult?
- 29. 我应该在哪里使用angular.bind?
- 30. 我应该在哪里使用protobuf
可以同时完成多少个gemv操作?这是了解GPU是否有益的关键。 – talonmies 2012-04-07 07:47:51