我如何使用 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 使之成为可能的地方。它涉及很多问题,可能很多人在我之前就解决了,但我喜欢这个挑战。阅读像《Linux 编程接口》和《Unix 域套接字》这样的书,激发了我去研究一些简单的概念。这个项目帮助我积累了有用的经验,因为将来我想通过启动一个新项目或加入另一个项目来为开源项目做出贡献。

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

7 条评论

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

感谢您的评论!实际上,我的许多同事都为此目的使用 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++ 的类特性以及内存管理时,他们会把事情搞砸,以至于他们不得不向真正的程序员寻求帮助,或者我甚至不得不 gently nudge 他们转向 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 时,目前还没有遇到任何问题。

回复 很高兴听到 Linux 的评论,作者是 Golodh (未验证)

嗨 Jonas,

很高兴看到您有时间阅读并评论我的胡言乱语。当我阅读您的文章时,我忍不住要评论,因为它对编程方面的事情充满热情(好吧……这是一个程序员论坛)。

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

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

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

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

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

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

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

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

再说一遍,看起来您做对了。干杯。

回复 嗨 Golodh,感谢您的评论,作者是 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 很有用(在我的待办事项清单上!),但版本控制和构建工具绝对是必不可少的。

回复 很高兴听到 Linux 的评论,作者是 Golodh (未验证)

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