大型的基于Fortran的数字处理代码库如何现代化?


21

一个学术界的朋友向我征求意见(我是C#业务应用程序开发人员)。

他拥有一个遗留代码库,他在Fortran中编写了医学成像领域的代码。它使用向量进行大量的数字运算。他使用一个集群(30个核心),现在已转向拥有500个GPU的单个工作站。

但是,代码库的下一步是什么:

  • 其他人可以在下一个10年周期内对其进行维护
  • 更快地调整软件
  • 可以在不同的基础架构上运行而无需重新编译

经过我的研究(这是一个非常有趣的领域),一些选择是:

您对此有何经验?我的朋友应该如何看待现代化的代码库?

更新:感谢@Mark和所有回答的人。我的朋友问这个问题的原因是,这是在项目生命周期中进行评估的最佳时机。在Fortran中提高研究助手的速度是需要时间的(我喜欢C#,尤其是工具,无法想象回到旧的语言!!)

我喜欢将纯数字格式保留在Fortran中的建议,但将其包装在较新的版本中。也许那样的Python似乎在学术界占有一席之地,这是一种相当容易掌握的通用编程语言。

请参阅Medical Imaging和为CUDA编写Fortran包装器的人,我可以将我的Fortran 90包装器合法发布到Nvidias的CUFFT库(来自CUDA SDK)吗?


我将OpenCL添加到列表中。
杰里·科芬

3
嗨,戴夫,有某种类型的“接下来我应该学习什么语言?” 我们在这里不允许的问题,因此我进行了较小的修改,以确保人们不会将此问题误认为是这个问题。但是,您能否扩展您的问题来解释为什么到目前为止您发现的选择不合适,因此可以指导答案提供更好的选择?

在“无需重新编译就可以在不同的基础结构上运行”下,您的具体含义是什么?
Rook

嗨@Idigas-不太确定具体细节。但是从本质上讲,故事发生了,当将代码库带到其他集群/机器上时,将所有正确版本的库一起编译成为一个噩梦。我相信代码库是从F77到F90或任何一个版本中来的。基本上,我正在尝试帮助他与合适的人交谈,以做出是否更改体系结构/语言的明智决定。我来自这样的背景,客户不喜欢一天的额外编码时间,因此我可以做的所有可以帮助我以最快的速度编写最好的代码的方法都是很理想的:-)
Dave Mateer

@DaveMateer-查看我的答案(此处不适合此框)。我现在要睡觉,所以以后的回复可能有点慢:)
Rook

Answers:


24

对于这样的问题,您实际上提出的要求使Fortran处于列表的顶部:

一)数字运算
B)paralellable
c)其是,现在仍然是事实上的 CS研究的语言教外(工程师谁不是专业的程序员)。
d)拥有令人难以置信的(!)行业支持,并且是许多行业级别的编译器明智的选择,而且没有一家供应商显示出放弃该分支的最少迹象。不久前英特尔的一位代表透露,他们的Fortran产品的销售量比其开发工具中的其他产品都要高。

这也是一种难以置信的语言。我不同意让研究助手尽快投入时间。我的第一本教科书上只有不超过30(?)页的稀疏印刷文本,哦,我不知道。它是一种语言,在学习了10个关键字之后,可以编写中等大小的程序。我敢说,用默认的Word文本编写的那30页对于大多数用户来说将构成一本更加全面的“ Fortran手册”。

如果你感兴趣的CUDA,你可能要检查波特兰集团的编译器它支持它。我对更好的细节并不熟悉,但人们通常赞扬它。

除此之外,对于并行程序,您还可以使用OpenMP,MPI以及现在即将推出(且期待已久)的协同阵列,英特尔的编译器最近实现了它们。为了不浪费言语,Fortran具有用于程序并行化的非常好的“库”伽马。

为此,首先开发了行业标准的数字库,其他语言则或多或少地出现在功能/例程组合中。

话虽这么说,但是我还是会建议(取决于最初编写的时间)是F77代码或更旧的代码,还是随着时间的流逝部分地将其重写为较新的方言-至少是F90,如果可能的话还可以使用F2003功能。一个有关该主题的论文/论文近日发表(中等大小的PDF文件前面)。如果做得正确,不仅可以确保跨多个平台的可移植性,还可以使将来的维护更加容易。

ps就“未来维护”而言,只是我有时会提到的一部轶事。在撰写论文时,我重用了我导师的一些代码,这些代码是从撰写本文开始的35年前编写的。它只编译出一个错误。由于复制粘贴错误,结尾处缺少声明:)


@DaveMateer(回复评论) -我将在下面发表评论,这可能有点不礼貌,但请不要以错误的方式对待,因为这是出于公平的意图。

在我看来,您正在以错误的方式解决此“问题”。我的意思是简短的几点(因为现在还很晚,而且我能够整理可读(更不用说易于理解)的句子的能力使我在晚上10点之后离开。)

一)你提到你想尽量减少额外的编码时间,但你正在考虑从专门用于数值计算,以一个语言重写的语言丰富多彩的选择,如果你会原谅我的表情

  • 其中一些不支持多维数组,除其他外
  • 它们中的大多数不适合进行繁重的数值工作(我承认Haskell和Hadoop的并行处理能力,我对此一无所知,但从未听说过它们在那些圈子中)
  • 它可能已经尝试过,但是我从未听说过将Fortran(一种离散问题的语言)重写为功能性语言的方法
  • 最近在comp.lang.fortran(尝试通过Google网上论坛进行搜索)上进行了有关“云端”科学计算方面的讨论
    (不想降低您的积极性,但是,公平地说,没有人真正确保这个词甚至代表什么,更不用说有成功应用的例子了。大多数人同意潜力的存在,但到目前为止,他们对目前的运作方式感到满意。许多问题也不适合这种并行化。

b)这样重写的费用是多少?人/小时。

c)-要编译的库的正确版本...-在任何语言中都是一个问题,无法避免,但是您可以看一下。

d)我听说过在某些场合并行应用程序中使用了Python(实际上是一种不错的语言),但是它在该市场的渗透率似乎并没有上升,而且它不断变化的性质使其成为一个非常差的选择。长期项目(请考虑向后兼容)。有些人非常喜欢它作为一种“胶水”语言。

gh,如果我有其他想法,请明天再添加。得睡一会...


@Idigas ..再次感谢。完全同意,一旦有事情在起作用,那就意味着很多。我们的行业乱七八糟,总的改写非常错误(Netscape!)。
戴夫·马特

1
Idigas在这里有正确的想法。您有一个已经运行了多年的可运行代码库,对其进行转录会生成错误。另外,Fortran是一种简单的语言,可能很难看,但它是由清晰的概念组成。保持对其他代码的依赖性,也许可以为Fortran写一个不错的C风格的接口,您会发现该代码具有显着的面向未来性(C风格,因为几乎所有其他语言都有一种调用机制C风格界面的代码)。
匿名

2
必须同意。如果您了解正在做的事情(大多数工程师都在做)的数学原理,那么在FORTRAN中实现它并不是那么艰难的学习过程。构建好之后,需求几乎不会像在业务或社交应用程序中那样变化。
JeffO 2011年

哇,我不知道对FORTRAN有那么多爱。我必须在F77上开发5年,我无法忍受。
dodgy_coder 2012年

2
@dodgy_coder。令人高兴的是,您在90年代使用Fortran + .NET进行了开发。.NET 的第一个Beta版于2000

10

我怀疑Fortran是否会死掉-它具有如此庞大的软件遗产和库,以至于人们仍在研究它,只是稳定了这种情况。此外,如果您不希望做除数字运算之外的其他事情,它仍然是一种非常好的语言-语法非常优雅且合乎逻辑,而且编译器可以轻松猜测正在发生的事情。因此,可以保证任何新的硬件加速器技术都将支持C,Fortran和某种OpenCL(最终将其融合为可靠的东西)。

因此,我想您应该将数字部分清楚地分开,将其保留在Fortran中,进行清楚的绑定,然后将其余部分写在您想要的任何地方。


更不用说Fortran中的新项目现在也开始了。
Rook

是的,Fortran不是COBOL,它不仅受到支持,因为那是30年前人们学到的(尽管IMO是其中的一部分)。数字运算并不是我的专长,因此,如果有更好的选择,我当然不知道。
本·布罗卡

1
fortran语言在数字运算和相关的优化方面仍然领先十年。它不会很快消失。
马丁约克

1
文章出现在最近的“ ACM通讯”中,内容涉及Fortran,以及它如何随着连续的现代化而不断发展。在Fortran中保留代码(至少是数字处理的一部分)可能是个不错的选择。它还有助于避免Netscape综合征(重写=新错误=巨大的循环时间=激怒所有参与人员)。
quick_now 2011年

1
您是否真的希望对Fortran完全不感兴趣的人触摸您的数字处理代码?一个大问题是确保重写后结果仍然准确。
彼得·史密斯

4

Python确实在科学计算社区中获得了广泛的关注(有关过时的观点,请参阅CiSE的第9卷第3期)。我认为Python / Fortran混合是一种绝佳的选择。为了利用所有这些GPU,您可以使用PyCUDAPyOpenCL

我是一位数学家,负责分析和编写偏微分方程的数值求解器。我最近和你朋友的处境相似。有问题的Fortran 77代码是著名的Clawpack软件。我们用Python重写了顶层代码(不需要快速的所有部分),并使用f2py自动包装了底层部分。

真正强大的结果是,我们几乎可以轻松地将Python / Fortran混合代码(称为PyClaw)与并行库PETSc连接起来,首次创建了可扩展的并行版本Clawpack,在65K内核上表现良好。我们必须编写的所有并行代码都包含在少于300行的Python中。现在,我们正在解决用旧代码无法解决的问题。同样重要的是,由于Python是一种非常友好的语言,几乎所有内容都可以在运行时而不是编译时进行修改,因此新用户现在更容易提取代码。

如果您想了解我们的方法和结果的更多细节,请参阅arXiv

对自我广告表示歉意,但似乎我的个人经验在这里很重要。如果您想听到更多的想法,也可以将其发布在新的http://scicomp.stackexchange.com上


1

我目前的处境与您朋友的处境非常相似。我也非常想“现代化”我40多岁的KLOC Fortran-77旧代码。尽管尽管Fortran仍然被认为是数字处理应用程序中的王者,但我想说的是,这一切并没有丢失。(下面是夸夸其谈,请多多包涵。)

仅仅因为Fortran是用于数字代码的最佳语言,并不意味着我们必须一直随身携带如此繁琐,复杂的代码的庞大包((是的,Fortran代码注定是凌乱的,尤其是Fortran-77跨过某些KLOC时实际上不考虑软件工程的语言)。提倡Fortran进行数字运算的人会忘记一般的观察,即对此类代码进行性能分析时,只有5%或10%的代码会占用大量性能,而其余90%以上的Fortran则是无用的开销,在那里使您成为“软件工程师”的生活变为现实。

当您从Fortran-77迁移到Fortran-90时,您实际上愿意在某种程度上权衡性能与语言功能。Fortran是强大的数字处理器,主要是因为Fortran-77。您可能会说Fortran-90是如此之快,但是编译器作者在添加Fortran-90 / 2003功能并保持Fortran-77性能时必须处理的优化问题与C编译器作者必须处理的问题没有太大不同。 (因此C也被认为是快速的,更不用说C也允许内联汇编了)。因此,为什么不开始将C代码(而不是Fortran-90)一点一点地添加到Fortran-77代码中。我的代码已经用C语言编写了一些代码,而在Fortran-77中则使用了一些代码,它在某些情况下(例如传递字符串,零索引/一索引等)非常有效。但是我从C中得到的好处是,

我再走一步。如果您想为数字运算代码提供一个很好的“人性化”界面,那么即使C(以及绝对是Fortran-90 / 95/2003)也太低级了。我正在考虑使用Python-Fortran-77或Python-C混合体。其中90%的代码是Python(包括Numpy,Scipy,可绘制性以及所有这些甜味),而性能密集型5%-10%的代码仍为Fortran-77或C代码。


1
“ Fortran代码注定是混乱的”。不会。凌乱的编码器可以用任何语言编写凌乱的代码,反之亦然。多年前, Kernighan和Plauger展示了如何编写干净的Fortran 。

0

我目前正在更新旧的FORTRAN95代码库,以在现代工业环境中使用,因为以前的版本最晚只能在Windows2000计算机上运行。FORTRAN代码库本身执行与灌溉模拟有关的大量数字运算。

因此,我要做的不是用更现代的语言重写FORTRAN,我只是使用一个称为Silverfrost FTN95的商业编译器将FORTRAN代码库编译为.Net 4.0库,并将其用作WPF应用程序的后端。这样,我就不会冒将已知错误引入仿真代码的风险,并且通过将代码库移至.Net 4.0框架来对其进行现代化,从而使其可以在更现代的环境中运行。

但是根据模拟的大小,您可能只想用一种更现代的语言(例如C#)简单地重写整个内容,我自己计划在有运行的模拟版本与输出进行比较时执行此操作。

希望我的经验对您有所帮助,谢谢Alex。


0

我是2001-2003年一个项目的首席开发人员,该项目将100KLOC Windows应用程序从FORTRAN移植到C#。它是一个数字处理应用程序,具有自己的Win32库自定义GUI绑定。C#和WinForms的移植使代码的管理变得更加简单,并为每个人在Visual Studio中提供了更丰富的开发环境。早期有一些抵制(特别是在格式声明方面),但最终肯定是值得的。

我认为,咬住子弹并摆脱可能的最大数量的FORTRAN代码是有意义的。速度从来都不是问题-与C语言相比,使用C#对C#运行代码的初始测试发现性能差异可以忽略不计,即使C#在运行托管代码。但是,您对向量的需求可能会略有不同,并且可以保留少量的FORTRAN代码。

这样做的另一个原因当然是与C#开发人员相比,具有FORTRAN经验的人可以长期维护您的代码。此外,它还可以帮助团队士气以现代的,得到良好支持的语言进行工作。


0

有人告诉我,在许多情况下,MATLAB都将FORTRAN替换为科学计算应用程序。它不仅是现代且高级的,它的工作也非常快。许多从事医学成像软件工作的开发人员已经在使用MATLAB,因此它有几个专门用于医学成像的库。这意味着如果您使用MATLAB,则将同时找到工具和领域专家支持。

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.