我有一个用 C# 编写的项目,我需要对矩阵进行各种线性代数运算(如 LU 分解)。
由于该程序主要是为确认理论而创建的原型,因此 C# 实现就足够了(与可能更快的 C++ 相比),但我仍然希望有一个好的 BLAS 或 LAPACK 库可以为我节省一些编码。
长话短说,任何人都可以推荐一个免费/开源的 BLAS 或 LAPACK 库来与 .net 一起使用吗?
最好的问候埃吉尔。
更新:今天找到了Math.NET Numerics,看起来很有趣,有人有这方面的经验吗?
我有一个用 C# 编写的项目,我需要对矩阵进行各种线性代数运算(如 LU 分解)。
由于该程序主要是为确认理论而创建的原型,因此 C# 实现就足够了(与可能更快的 C++ 相比),但我仍然希望有一个好的 BLAS 或 LAPACK 库可以为我节省一些编码。
长话短说,任何人都可以推荐一个免费/开源的 BLAS 或 LAPACK 库来与 .net 一起使用吗?
最好的问候埃吉尔。
更新:今天找到了Math.NET Numerics,看起来很有趣,有人有这方面的经验吗?
AMD 的 ACML 是免费下载的,但它只是二进制的,不是开源的,是本地代码,不是 .NET。
性能通常优于 Netlib.org 代码,并且通常与英特尔的 MKL 大致相同——这不是免费的 IIRC。
下载包含一个示例,演示如何将其绑定到 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大致相同,但这取决于算法、矩阵大小、内核数量、内存拓扑和速度等。您的里程可能会有所不同。唯一可以确定的方法是运行您自己的基准测试。在某些情况下,即使在 Itel 硬件上,ACML 也比 MKL 快。
对于大型矩阵,任何一个都将比任何“天真的”实现快得多。两者的架构都是为了在多核处理器上使用多个线程,并且具有手动调整的汇编语言内核和对各种机器上的缓存行为进行大量调整。
对于小型矩阵,性能通常是无关紧要的,因为任何现代 cpu 都可以在几毫秒内解决小型矩阵,即使使用最简单的代码也是如此。在这种情况下,您只是使用库来避免编写和调试已经编写了数百次的代码。
数学库DotNumerics是用 C# 编写的免费/开源项目,包含从 Lapack、Blas 和 Eispack 到 C# 的翻译。
类似 BLIS 的库实例化软件 (BLIS) 是当前开源 BLAS 库的黄金标准。 https://github.com/flame/blis 它没有 MKL 快(虽然很接近),但比 OpenBLAS(传奇 GotoBLAS 的一个分支)快,基本上在所有 CPU 上(在包括 Intel、AMD 在内的最新架构上更快)和 ARM)。它维护得很好。
ACML,在另一个答案中提到,不再存在。AMD 现在使用开源软件作为其 ACL(AMD 计算库)软件堆栈的一部分。BLIS 是该软件堆栈的一部分:https ://developer.amd.com/amd-cpu-libraries/blas-library/ 。
Caviat:海报是 BLIS 项目的一部分。上述声明有据可查。
(后来添加的评论:没有注意到“.NET”。不幸的是,Windows 还没有很好地支持 BLIS。)
Lutz Roeder 有一个很好的开源端口Mappack.Net
过去用于各种项目,发现它很容易使用