我有一个用C#编写的项目,需要在矩阵上执行各种线性代数运算(比如LU分解)。
由于该程序主要是为了验证一个理论而创建的原型,因此使用C#实现就足够了(相对于可能更快的C++实现),但我仍然希望有一个好的BLAS或LAPACK库可用,以节省一些编码时间。
长话短说,有人能推荐一个适用于.net的免费/开源BLAS或LAPACK库吗?
祝好,Egil。
更新:今天找到了Math.NET Numerics,看起来很有意思,有没有使用过的人分享一下经验?
我有一个用C#编写的项目,需要在矩阵上执行各种线性代数运算(比如LU分解)。
由于该程序主要是为了验证一个理论而创建的原型,因此使用C#实现就足够了(相对于可能更快的C++实现),但我仍然希望有一个好的BLAS或LAPACK库可用,以节省一些编码时间。
长话短说,有人能推荐一个适用于.net的免费/开源BLAS或LAPACK库吗?
祝好,Egil。
更新:今天找到了Math.NET Numerics,看起来很有意思,有没有使用过的人分享一下经验?
AMD的ACML是一个免费下载的库,但它只提供二进制文件,不是开源的,而且是本地代码,不支持.NET。
性能通常比Netlib.org的代码要好,并且通常与英特尔的MKL差不多,但我记得MKL不是免费的。
下载包括一个示例,演示如何将其绑定到C#。这与从C#调用任何其他C或C++库没有区别。
该库实现了BLAS、LAPACK、FFT和RNG功能。
http://developer.amd.com/cpu/Libraries/acml/downloads/pages/default.aspx
编辑以回应评论:
在Intel CPU上,AMD的ACML将表现得与Intel的MKL大致相同,但这取决于算法、矩阵大小、核心数、内存拓扑和速度等等。你的结果可能会有所不同。想要确定性能差异,唯一的方法就是运行自己的基准测试。在某些情况下,ACML甚至在Itel硬件上也比MKL快。
无论哪个都比对于<强>大型矩阵的任何“天真”实现都要快得多。两者都被设计为在多核处理器上使用多个线程,并且具有针对不同机器的缓存行为进行手动调整的汇编语言内核和大量调优。
对于<强>小型矩阵,性能通常不需要太过关注,因为任何现代CPU都可以在几毫秒内解决一个小矩阵,即使使用最简单的代码。在这种情况下,你只需使用库来避免编写和调试已经被写过成百上千次的代码。
数学库DotNumerics是一个免费/开源项目,用C#编写,并将Lapack、Blas和Eispack转换成C#。