我遇到的问题是两个尺寸为5000x1024的矩阵相乘。 我尝试以传统的方式通过循环来完成它,但它需要永远。 有没有实现和优化矩阵运算的好库,或者没有3循环的任何算法?
答案 0 :(得分:4)
您是否考虑过使用OpenCL? Cloo(C#OpenCL库)分布中的一个示例是大型2D矩阵乘法。
与CUDA不同,OpenCL内核将在您的GPU(如果可用和支持)或CPU上运行。在GPU上你会看到真正的,非常非常引人注目的速度提升。我的意思是,非常戏剧性,大约10x-100x,具体取决于内核的效率和GPU的核心数量。 (基于费米的NVidia显卡将介于384-512之间,而新款600显卡的价格将介于1500之间。)
如果你对这条路线不感兴趣 - 尽管任何正在进行数字密集,易于并行化的操作的人应该使用GPU - 确保你至少使用C#的内置并行化:
Parallel.For(
0
,5000
, (i) => {
for(var j=0;j<1024;j++)
{
result[i,j] = .....
}
);
另外,请查看GPU.NET和Brahma。 Brahma允许您使用LINQ在C#中构建OpenCL内核。绝对会降低学习曲线。
答案 1 :(得分:3)
看看Strassen algorithm,其运行时间约为。 O(n 2.8 )代替O(n 3 ),采用一种简单的矩阵乘法方法。一个问题是并不总是稳定,但对于非常高的尺寸工作正常。此外它非常复杂,所以我建议你重新考虑你的设计,可能会减小矩阵的大小或将你的问题分成更小的部分。
但请记住,没有特殊属性的矩阵乘法(如提到的Aidan)几乎不可能优化。这里有一个例子:Coppersmith-Winograd algorithm取O(n 2.3737 ),它是迄今为止最好的矩阵乘法算法之一!这里最好的选择是使用OpenCL和GPU(由David提及)或者使用包numpy
来查看其他优化的编程语言,如Python。
祝你好运!