有哪些适用于.NET(C#)的好的免费(开源)BLAS/LAPACK库?

16

我有一个用C#编写的项目,需要在矩阵上执行各种线性代数运算(比如LU分解)。

由于该程序主要是为了验证一个理论而创建的原型,因此使用C#实现就足够了(相对于可能更快的C++实现),但我仍然希望有一个好的BLAS或LAPACK库可用,以节省一些编码时间。

长话短说,有人能推荐一个适用于.net的免费/开源BLAS或LAPACK库吗?

祝好,Egil。

更新:今天找到了Math.NET Numerics,看起来很有意思,有没有使用过的人分享一下经验?


5
这正是我讨厌stackoverflow.com的原因。这种狂热的监管阻止了有用的问题被提出。你知道吗,我搜寻了这个完全相同的问题,结果发现它已经被标记了。顺便说一下,这不是第一次。 - Tarik
4个回答

12

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都可以在几毫秒内解决一个小矩阵,即使使用最简单的代码。在这种情况下,你只需使用库来避免编写和调试已经被写过成百上千次的代码。


那么如果我的目标是英特尔CPU,那么AMDS ACML性能不如英特尔的MLK,但仍然比天真的C#实现要好得多,对吗? - Egil Hansen
嗯,你的编辑与这里的答案相矛盾(https://dev59.com/LXI-5IYBdhLWcg3w18Z3)。他们还引用了好的来源(http://www.advancedclustering.com/company-blog/high-performance-linpack-on-xeon-5500-v-opteron-2400.html)……不确定这个编辑是否是正确的答案……但你是对的,至少ACML是免费的…… - reverse_engineer

5

数学库DotNumerics是一个免费/开源项目,用C#编写,并将Lapack、Blas和Eispack转换成C#。


Lapack和Blas基本上是接口规范。如果DotNumerics翻译了错误的实现,也就是netlib参考标准,那么这就没有什么价值了。请澄清他们是否使用了优化的实现,如果是的话,基于什么进行优化。 - Victor Eijkhout

5
BLIS类库实例化软件(BLIS)是当前开源BLAS库的黄金标准。https://github.com/flame/blis虽然不如MKL快,但在几乎所有CPU上都比传说中的GotoBLAS分支OpenBLAS快(最新架构包括Intel、AMD和ARM上速度更快)。它得到了很好的维护。
ACML在另一个回答中提到,但已经不存在了。现在,AMD使用开源软件作为其ACL(AMD计算库)软件堆栈的一部分。BLIS是该软件堆栈的一部分:https://developer.amd.com/amd-cpu-libraries/blas-library/
警告:发帖人是BLIS项目的一部分。以上声明是有充分文献证明的。
(稍后添加的评论:没有注意到".NET"。不幸的是,BLIS在Windows上尚未得到良好的支持。)

2

Lutz Roeder开发了一个优秀的开源端口Mapack.Net

过去在各种项目中使用过,发现它易于使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接