我如何使用 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 科学库、Cairo、OpenCV、OpenMP 等库。由于我生成了大量需要大量后处理的数值数据,如果没有 Bash shell 及其工具,我将寸步难行。对于可视化,我使用 gnuplot 和 Visual Molecular Dynamics (VMD),它们是非常棒且易于使用的工具,可以节省大量时间。

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

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

7 条评论

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

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

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

阅读像这样的经历让我印象深刻,我见证了工具在过去几年中的发展。我在很久以前完成了博士学位,虽然我不需要用木头雕刻我的微处理器,但我的控制软件是用 6502 汇编语言编写的,并使用了用 BASIC 编写的汇编器。

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

祝您好运,继续努力。
Uncle Ed McNerd,博士

很高兴听到 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) 好的,说得通。作为一名经验丰富的程序员,您可能会检查您的输入,并确保您的代码在缺少一个或多个输入或格式错误时不会崩溃。许多研究学生(和研究人员)从不费心,让他们的继任者来处理讨厌的配置问题和完全可以避免的找 bug 练习。

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

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

回复 作者:tzunami_bomber

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

回复 作者:Golodh (未验证)

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