不,超级计算机不会让你的代码运行得更快(2017)

2021-07-26 02:44:20

我有时会咨询其他部门从事高级统计模型或模拟的聪明同事。他们来自经济学、心理学等等。很多时候,他们的代码很慢。如“运行需要数周时间”。这不好。鉴于学术研究的缓慢步伐,您可能会认为如此长时间的延误没什么可担心的。然而,我的同事们常常理所当然地担心。如果您需要数周时间才能获得结果,那么您一年只能迭代几次您的想法。这极大地限制了您调查问题的深度。这些可怜的人经常被派往我的路上。在理想的世界中,他们会有预算,以便他们的代码可以重新设计以提高速度……但大多数研究都没有充足的资金。他们经常被他们放在一起的任何东西困住。他们常常希望我有一台功能强大的机器可以更快地运行他们的代码。我确实有一些快速的机器,但它们通常没有他们期望的那么有用。强大的计算机往往非常擅长并行。也许与直觉相反,这些计算机运行非并行代码的速度可能比普通 PC 慢。因此,将您的代码转储到超级计算机上甚至会使速度变慢!理论上,你会认为软件可以“自动”并行化,以便它可以在超级计算机上快速运行。遗憾的是,我想不出很多例子,软件会自动尝试使用 CPU 上所有可用的芯片来运行。程序员仍然需要告诉代码并行运行(尽管通常很简单)。一些软件库很聪明,可以为您完成这项工作……但是如果您编写代码时不关心性能,很可能您没有选择这些聪明的库。如果您只是从 Internet 上抓取代码,并且您不完全了解发生了什么……或者您对软件性能一无所知……很可能一点点工程可以使代码运行 10、100 或快 1000 倍。因此,搞乱一台超级计算机可能完全是可选的。大概是这样。不止一次,通过改变单个依赖项或单个函数,我已经能够将某人的代码从“太慢”切换到“非常快”。

我建议进行粗略的计算。处理器每秒可以执行数十亿次操作。你大概做了多少操作?如果您正在执行 10 亿次简单运算(例如 10 亿次乘法)并且需要几分钟、几天或几周的时间,那么一定是出了问题,您可以做得更好。如果您真的需要数百万次操作,那么您可能需要一台超级计算机。估计很重要。我的一个学生曾经抱怨过内存不足。我愚蠢地支付了更多的内存。然而,为了确定机器没有问题,我所要做的就是将学生代码与在线找到的标准示例进行比较。该示例比在同一台机器上运行的学生的代码快得多,但该示例却用不多的代码完成了更多的工作。这足以确定问题所在:我鼓励学生查看示例代码。您通常不需要花哨的工具来使代码运行得更快。一旦确定可以更快地运行算法,您通常可以检查代码并一目了然地确定大部分工作在哪里完成。然后你可以搜索替代库,或者只是考虑不同的工作方式。