我如何使用 Linux 进行理论物理研究

4 位读者喜欢这篇文章。
Penguins gathered together in the Artic

Opensource.com

2008 年,我开始学习物理学,并接触到了 Linux,因为很多人使用它进行数据分析和模拟。在这些人的帮助下,我很快就理解并掌握了 Linux,并且强烈地被鼓励使用 Linux 完成工作。我在我的笔记本电脑上安装了 Ubuntu,并很快熟悉了 Bash 和标准工具。

几年后,我转向了理论物理学。在撰写硕士论文期间,我可以使用一台运行 Scientific Linux 的工作站,以及一个拥有数百个核心的集群系统。令我印象深刻的是,我的每一位同行都实现了自己定制的工作流程,并且实际上可以使用键盘完成所有工作,这对于 Windows 用户来说是不可思议的。幸运的是,每天使用 Linux 使我的学习曲线陡峭上升。我的任务是编写一个软件,使其能够从实验人员提供的视频序列中确定材料属性。我使用 C++ 成功地完成了这项工作,它以令人满意的运行时处理了图像分析和大量的数学运算,这是一个关键因素。这个项目本可以在 Windows 中完成,但是使用 Bash 和强大的命令行工具(如 MEncoder、convert 和 AWK)使开发过程变得快速而高效。

在过去的近三年里,我一直专注于我的博士项目,完全使用 C++ 和 Bash。我喜欢旧式的 C99 编码风格,没有智能指针、函数式编程和其他旨在使编码舒适的东西。在我自己编写的工具集中,我使用了 GNU Scientific Library、Cairo、OpenCV、OpenMP 等库。由于我生成了大量需要大量后处理的数值数据,如果没有 Bash shell 及其工具,我将寸步难行。对于可视化,我使用 gnuplot 和 Visual Molecular Dynamics (VMD),它们是非常棒且易于使用的工具,可以节省大量时间。

在 Windows 中编码让我对标准系统调用背后隐藏的机制感到不满意。因为我花费了大量时间将大型数据块压缩成简单的图形,所以我对了解幕后发生的事情越来越感兴趣。这促使我开展了自己的数据库项目,我已经在这个项目上工作了大约三年。当然,我知道已经有成百上千个现有的项目,但我有兴趣从底层开始理解它,而这正是 Linux 使之成为可能的。它涉及许多问题,可能很多人在我之前就解决过,但我喜欢这种挑战。阅读 The Linux Programming InterfaceUnix Domain Sockets 等书籍激励我研究出一些简单的概念。这个项目帮助我积累了有用的经验,因为在未来,我希望通过启动一个新项目或加入另一个项目来为开源项目做出贡献。

User profile image.
Jonas Hegemann 是一位来自德国的物理学家。2018 年 2 月,他完成了关于理论生物物理学的博士论文,包括细胞生物学的计算机模拟和弹性材料的视频分析。

7 条评论

感谢作者使用“陡峭的学习曲线”来表示快速学习,而不是学习困难。您可以考虑研究一下 Python,将其作为您所有底层分析/模拟代码的包装器;它的语法非常易于使用,并且您最终会得到比 shell 脚本更易于人类阅读的代码,同时又具有所有功能和速度。

感谢您的评论!实际上,我的许多同事都将 Python 用于此目的,我也时不时地这样做。关于可读性,您绝对是对的。我的 bash 脚本集合有点像历史遗产,因为我从 bash 开始,然后继续使用它。对于未来,我肯定会考虑将 Python 作为 bash 的替代方案。

回复 作者:匿名(未验证)

阅读像这样的经历让我印象深刻,多年来我亲眼目睹了工具的发展壮大。我很久以前就完成了我的博士学位,虽然我不需要用木头雕刻我的微处理器,但我用 6502 汇编编写了我的控制软件,并使用了用 BASIC 编写的汇编器。

我希望您享受这些挑战和工具的改进,并能够与他人分享您正在创造的东西。如果您发财了,那也没关系。

祝您好运,并坚持下去。
埃德·麦克纳德叔叔,博士

很高兴听到 Linux 对您有效。

但是,我想对 (1) 您如何开始使用 Linux,(2) 您如何构建您的工作负载,(3) 您如何深入研究数据库,以及 (4) 您对 CLI(命令行解释器)的赞美提出一些批评意见。

(1) 我理解并认同您对 Linux 的介绍。它在当今的物理计算环境中无处不在,因为它免费,可以轻松访问各种端口(用于数据捕获),因为它很容易设置您自己的完全定制的分析软件来管道传输您的数据,最重要的是因为在 Linux 下工作往往是累积性的。我的意思是,研究小组中以前的博士生的工作通常会为下一批人提供先发优势。所以这很好,而且通常比 Windows 更好。

(2) 我理解您工作的一部分是处理从实验中捕获的视频数据。您说您所有的工作都是用 C++ 完成的。我会对此感到疑惑,并想知道您为什么不使用例如 Matlab,如果您需要并行处理,为什么不使用带有 Matlab 的 Hadoop 集群?当然,这在一定程度上取决于算法的确切性质(但即使那样,您也可以为复杂的部分使用 C++ 子例程),但在我的经验中,Matlab 的编码速度大约快 5-10 倍,并且运行时间相当。我的学生在尝试积极使用 C++ 的类特性以及内存管理时,会搞得一团糟,以至于他们不得不向真正的程序员寻求帮助,或者我甚至不得不轻轻地引导他们转向 Matlab、Python 或现有的库例程软件。Matlab 有自己的内存管理,强大的图形,出色的数学原语和体面的分析例程。当然,Linux 上的 Matlab 相对昂贵,因此您要么在 Windows 上使用它,要么会有一个时间/成本权衡。我想知道您是否进行了比较并做出了有意的选择,还是只是选择了手边最方便的东西。虽然选择您的工具很大程度上是您自己的责任(您可以随意绕道 C++),但我并不认为从解决您问题的角度来看,您的选择是最佳的。

(3) 至于您对了解“幕后”数据块压缩的好奇心。这是完全值得称赞的。然而,这让我怀疑您有多少时间和精力被明智地花费了,因为您的目标不是成为一名程序员,而是一名物理学博士。至于深入研究数据库处理、Linux 系统接口和套接字编程的细节:作为一种爱好,这很好,但从专业(或研究)的角度来看,我认为这是浪费时间(除非您有明确的证据表明可用的例程效率低下或适应性不足)。但这只是我的意见。

(4) 关于您如此称赞的 CLI,我对它抱有健康的敬意,但通常将其工作原理隐藏在 make 脚本、Python 和 GUI 之后。就我所见,它有助于学生(甚至是博士生)构建一个简单的 GUI(Matlab 在这方面非常出色,如果您坚持使用 FOSS,您可能会喜欢 Kivy),从中运行他们的软件以生成最终输出。主要原因是学生们往往最终得到无数(通常没有文档记录的)细微不同的软件工具版本,并且常常无法可靠地重现他们的工作,更不用说可靠地改编它了。对于任何“结果版本”使用 GUI 都会产生一组可追溯的例程,这些例程构成某个结果,这些结果易于存档,甚至在几年后也可以轻松(且可靠地)重现您的结果。此外,它还有助于后来的使用者。

嗨,Golodh,感谢您的详细评论。让我简要回复您提出的一些观点。

(2) 我们已经有一个用 Wolfram Mathematica 实现的现有实现,但它自动化程度不高,而且速度太慢,无法处理大型数据集。特别是数值方法减慢了进程,优化确实是必要的,因为所用的方程很难求解且不稳定。随着输入序列质量的下降,情况变得更糟。使用 C++ 的决定实际上不是我做的,它是任务的一部分,但是我们将 Wolfram Mathematica 中的几周时间缩短到了 C++ 中的几个小时,所以我认为这个决定还不错。我完全同意您尽可能使用现有库的观点,但我有过“盲目”使用库也可能导致问题的经验。有时您必须更改、调整、修改或改编库函数。有时可以通过编写包装函数来完成,但在某些情况下,自己编写整个函数会更快。我看到了 Matlab 和 Python 在快速原型设计方面的优势,但是作为一名训练有素的 C++ 程序员,并且可以利用大量的现有代码池,在某种程度上使这种优势变得不那么重要。当然,如果您不知道如何在 C++ 中有效地管理内存,那么您最好使用 Matlab 编程,但您应该同意,原则上 Matlab 或任何其他数学软件都不可能比定制的 C++ 实现更快。我知道一个博士项目,其内容是编写高度优化的 C++ 代码,旨在在性能上击败 Comsol Multiphysics。对于运行时关键型应用程序,这确实值得付出努力。

(3) 如果您说这对于我目前的工作没有任何好处,称之为浪费时间,您可能是对的。到目前为止,这只是一种爱好,我没有花太多时间在上面。是的,我正在攻读物理学博士学位,但我并非不可避免地与学术研究联系在一起。实际上,我计划在软件开发或相关领域找到一份工作。

(4) 我没有使用 GUI,而是使用一个配置文件来设置所有相关参数,但只有少数参数在更改输入文件后需要调整。因此,通常运行程序非常简单,结果被包装成一个大型 HTML 报告,显示所有相关信息。因此,从我的角度来看,这与 GUI 相差不远。我们已经与一些化学家分享了代码。他们通常使用 Windows,但在虚拟机中使用 CLI 还没有遇到任何问题。

回复 作者:Golodh(未验证)

嗨,Jonas,

很高兴看到您有时间阅读并评论我的漫谈。当我读到您的文章时,因为您对编程方面的热情而忍不住评论(嗯……这是一个程序员论坛)。

(2) 好的,我不知道您已经有一个可用的原型(基本算法清晰,可用的工作系统设计)。然后,重写软件以优化性能是很有意义的。我也没有意识到您已经是一位经验丰富的 C++ 程序员。感谢您指出这一点;我相信这种组合使一切变得不同。

我同意 Mathematica 不是高性能数值工作的最佳选择,但如果方程难以求解且数值不稳定,那么它对于原型设计来说是一个极好的选择(这可能就是它最初被使用的原因)。

至于 Matlab 的性能,我经常看到巧妙构建的 Matlab 函数(导致调用 Kuck(手工制作的汇编语言)库例程)击败“优化”的 C++ 代码。

问题在于,进行“优化”的人(不是软件工程师或数值数学家,而是研究人员)通常不了解详细的软件工程问题,例如流水线、机器的内存层次结构、缓存一致性、数组访问中步幅的使用等。但他们喜欢使用抽象来阻碍编译器生成良好的汇编代码,并且喜欢使用各种巧妙的技巧来节省几个百分点的操作,但代价是许多流水线停顿。然后,他们非常惊讶地得知他们“优化”的代码没有创下性能记录(甚至更糟:遭受数值不稳定性的困扰):-)

但总的来说,我认为您是对的:如果您确实了解软件工程细节并且是一位称职的 C++ 程序员,那么您的实现通常很难被击败。

(3) 好的,也不知道这一点。所以您可能再次做出了正确的选择 :-)

(4) 好的,说得通。作为一名经验丰富的程序员,您可能会检查您的输入,并确保当一个或多个输入不存在或格式错误时,您的代码不会崩溃和崩溃。许多研究学生(和研究人员)从不费心,而让后来的使用者来处理令人讨厌的配置问题和完全可以避免的查找错误练习。

我也喜欢生成单个连贯的自文档输出文件的做法。令人惊讶的是,有多少人甚至没有在他们的输出中包含运行的日期/时间,更不用说哪个输入完全进入了他们的运行(啊,好吧……他们通常学得很快),并生成无数个不同的输出文件,名称都一样 ;-P。

再次,看起来您做对了。干杯。

回复 作者:tzunami_bomber

您提出了一些很棒的观点。作为一名计算物理学硕士生,我的想法是:
(1) 更重要的因素是 Linux 在 HPC 中的作用。您不可能在 Windows 上运行集群!尤其是 Scientific Linux,它是专门为高性能分布式计算而设计的。作为一名计算物理学家,您别无选择。
(2) 我只能谈谈我自己的经验,但我一直觉得用 C 和 Python 编写快速、健壮的代码比用 Matlab 快得多,也容易得多。虽然我辅修了计算机科学,并且在本科时使用了科学 Python;所以我已经足够清醒地抵制不必要的 OOP 的诱惑(并且几乎完全坚持使用 C99),并且已经有了高级语言偏好。我在任何可以摆脱 Python 的时候都使用 Python,对于繁重的工作使用 C,对于介于两者之间的所有工作使用加载到 Python 中的 C 库。在我看来,Matlab 作为一种语言,对于通用用途来说过于受限,对于 HPC 来说又太慢且级别太高(我想管理我的内存!),但它作为一种工具的价值在于其出色的库。
最重要的是,C 和 C++(以及 Fortran)完全支持 MPI,并且可以移植到任何服务器架构,这使得它们成为大规模计算物理应用程序的规范语言。您不可能长期远离它们!
(4) 我是一个配置文件爱好者,为了简单性和适应性。您为 GUI 提出了一个很好的论点,但我想知道,这些学生是否使用版本控制和构建工具?我的大部分工作的开发历史都是一团糟,充满了为了立即输出我需要的数据而进行的黑客行为,以及偶尔出现的灾难性重构……但是我可以立即加载 v0.01,并且立即编译并运行模拟,这要归功于 Git、make 和 shell 脚本。GUI 很有用(在我的待办事项清单上!),但版本控制和构建工具绝对是必不可少的。

回复 作者:Golodh(未验证)

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.