关于轻量级/无需安装C或C ++的密集线性代数求解器的建议


9

我的大部分编程都是用C语言编写的一次性研究代码供我自己使用。除了亲密合作者之外,我从未分发过任何代码。我已经开发了一种算法,可以在科学期刊上发表。我想在本文的在线补充中提供源代码,也许还提供可执行代码。一位同事要求我对该算法进行概括,该算法要求我用C ++编写(ack!),并且要求我求解小型密集线性系统。如果我成功获得了该算法的用户基础,则部分原因是使用该算法的输入栏很低(例如在地板上)。潜在的用户不会安装库等来使用代码。我希望代码完全独立,不受任何许可的约束。我可能只是简单地通过从Golub和van Loan中取出一些东西来编写自己的求解器,但是我更愿意使用别人已经写过的香草求解器(如果有的话)。建议表示赞赏。谢谢!



尊敬的jep,欢迎来到论坛。你提的问题是非常相似的一个位置:scicomp.stackexchange.com/questions/351/...
GertVdE

为了鲁棒性,效率和通用性,库求解器趋向于复杂且庞大。如果您的问题很小并且条件适当,我建议您编写自己的微型实现。
Stefano M

@GertVdE,感谢您对此问题的快速回复。我不愿意链接到“建议...”问题,因为问题和最佳答案太笼统,无法在此类情况下提供任何帮助。如果您想进一步讨论,建议您带到scicomp聊天室
阿隆·艾玛迪亚

@AronAhmadia:我认为解决这些争论的唯一方法是开始实施依赖于语言和库的计算科学编程方法。如果代码清晰明了,并且可以解决配置问题(使用Shell脚本,Chef或Puppet),则可以通过仅运行代码并在代码上计时来解决(或具体化)有关性能的辩论。参考机。通过查看代码,可以解决(至少是更具体的)关于清晰度的争论。否则,我们将保持相同的参数。
Geoff Oxberry 2012年

Answers:


7

我建议将Lapack接口与您需要的功能完全相同,很可能只是您需要的功能dgesv。这样一来,安装了Lapack的人们就可以直接链接到它,它就可以正常工作。对于未安装Lapack的用户,您可以提供此功能的自己简单的实现,或者可以像其他建议的那样使用Eigen或FLENS来实现。

在Fortran领域中,Lapack库就是这样一个标准,大多数人只是使用它而已,而不是提供自己的实现。


+1添加了一个事实,即大多数Linux发行版(至少基于Debian)在存储库中都有二进制软件包,并且所有供应商提供的数学库(MKL,SunPerf,ACML,ESSL等)都带有它。您应该始终尽可能多地使用标准库,尽管如果您使用的是Windows / Mac,则最好使用基于C的程序,因为在它们上安装免费的Fortran编译器(gfortran)会花费很多工作,所以我听说过。
stali 2012年

我已经使用过lapack多次,但是我目前不在fortran领域。我希望我的用户群所基于的平台的统计分布与世界范围的分布情况大致相同,主要是Windows,较小百分比的Mac和较小百分比的* nix。我对Windows的经验很少,我更喜欢保持这种状态。这就是我想要独立的C ++代码的原因。我认为我必须为一些用户提供帮助,以使代码得以编译和运行。我需要尽量减少这样做所需的工作。
2012年

如果您的用户群是Windows / Mac,那么最好使用简单的基于C的实现(也许甚至是您自己的实现)。一个难以安装或依赖于5个其他lib的软件包,特别是在没有可用的一流二进制软件包存储库(例如Debian)的情况下,很长一段时间会关闭您的用户。请记住,大多数Windows / Mac用户习惯于一键安装。易用性使其他一切都胜出。
stali 2012年

5

许多人在开始科学计算时犯的一个非常早期的错误是,假设您需要用相同的语言编写所有代码。我认为这主要是由于历史原因,当时尚不清楚如何使已编译程序在同一编译器的偶数版本之间相互通信。就是说,在这种情况下,如果您仍然要使用C ++,那么有几个非常好的C ++-only标头模板库可能会满足您的需求。

由于您出于学术原因而分发代码,并且希望在代码中嵌入密集的线性代数求解器,因此我强烈建议您考虑使用Eigen。Eigen已获得Mozilla Public License的许可,并且是仅标头的库。这意味着您可以将Eigen与源代码形式的代码一起分发(这不会对代码施加任何许可限制),并且您将可以使用其一般功能,包括非常高效的密集线性求解器。如GertVdE所述,您还有其他几种选择


我希望有一个文件。我已经做了很长时间的科学编程。我混合了很多语言,例如C和fortran,但是对于这个项目,我真的只想要一个包含所有源代码的文件。我想我可以在C ++代码中放入C解算器,这没什么大不了的。我主要想使代码尽可能简单。带枢轴的LU应该足够。我来看看Eigen。谢谢!
2012年

@jep,如果您根本不关心性能,也可以尝试从CLAPACK中挑选所需的例程。
阿隆·艾玛迪亚

有充分的理由以相同的语言编写所有从属代码,尤其是在HPC环境中,您会遇到奇怪的编译器/链接问题和32/64位接口问题。例如,如何知道内置库的整数宽度?我如何确定内置库使用的是哪个编译器,并且可以与此其他编译器链接?用一种语言提供所有内容可以简化许多此类问题。是的,应该有集群维护者提供的文档,但是大多数时候没有。
维克多·刘

@VictorLiu-您所指的问题与实现比与语言紧密相关。评论空间是进行认真讨论的好地方,但如果您希望我对此发表更多看法,我很乐意与您进行聊天或其他活动。
阿隆·艾玛迪亚

4

如果您想要一个可靠的线性方程组求解器,我建议使用FLENS。它包含LAPACK的完全重新实现(如果使用单线程BLAS实现,它甚至会产生与LAPACK相同的舍入错误)。对于所有FLENS-LAPACK函数(连同实用程序函数约100个例程)都是如此。

FLENS已获得BSD许可,因此可以合并到专有产品中。

FLENS仅是标题,如果您只需要FLENS的子集,我可以给您提供一个精简的版本,其中仅包含您需要的那些功能。FLENS带有自己的参考BLAS实施。但是,您的用户可以选择链接到优化的BLAS库,例如ATLAS,OpenBLAS或GotoBALS。对于大型矩阵,与本征相比,性能提高约40%。

是的,Eigen还使用LAPACK测试套件来检查其结果。他们为3个函数(对称矩阵的Lu,Cholesky和特征值/向量)执行此操作。但是,他们对非对称矩阵的特征值/向量的计算将无法通过LAPACK测试套件。

免责声明:是的,FLENS是我的宝贝!这意味着我编写了大约95%的代码,每一行代码都值得。


1
迈克尔(Michael)-请认为这是一个友好的警告,您需要遵循常见问题中有关披露隶属关系的规定
阿隆·艾玛迪亚

当然可以,但是您也可以将您的帖子从“我强烈建议您考虑本征”改写为“例如本征”。在这种情况下,我删除了关于Eigen的言论(尽管它们都被证明是正确的),包括这一句话。
Michael Lehn

1
您对本征的评论在这里不成问题(尽管对我而言似乎是题外话)。您是FLENS的主要开发人员,如果要在此处的答案中推荐它,则必须披露您作为该项目的开发人员的隶属关系。
阿隆·艾玛迪亚

啊,那好吧。我以为“ ...我可以给你...”含蓄地阐明了这一点。以这种形式公开可以吗?
Michael Lehn 2012年

2
我只想感谢您这样做;我有类似的计划,可以在C ++中重新实现Lapack的很大一部分。但是,对于大多数高级(特征值)例程来说,您似乎只是简单地调用Lapack,因此说您重新实现整个过程有点虚假的广告。另一方面,我实际上已将ZGEEV源移植到RNP中的 C ++ ,尽管某些部分仍在自动转换的基于1的索引中。
维克多·刘
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.