有一个令人讨厌的问题暂时难住了我公司的一些工程师试图对其进行调试。
C++ 程序通常在具有 MPI 的多核计算机集群上运行。
它会运行很长时间——也许是几天——然后突然失败。
大多数从事它的工程师已经消除了程序本身存在错误的任何合理可能性,因此他们开始将责任归咎于可能的硬件问题,但我怀疑 Linux 内核模块或设备中一定存在软件问题司机。
值得怀疑的是,内核模块或设备驱动程序为了进行一些浮点计算,正在以在 SMP 系统上不安全的方式执行 FXSAVE/FXRSTOR。它可以像对需要可重入的内核例程中的静态缓冲区执行 FXSAVE 一样简单。这将创建一个竞争条件错误,该错误很少会破坏线程的浮点上下文。
在应用程序级别,似乎正在发生的事情是 MXCSR 的一个或多个位(它是 FXSAVE/FXRSTOR 上下文的一部分)突然更改,但没有应用程序代码来更改它。
多年前我在 Windows 上遇到过类似的情况,最终证明是视频驱动程序中的一个错误,因此当应用程序代码被操作系统抢占时,该线程上下文中的一些 MXCSR 位被破坏。
我不是 Linux 内核黑客或设备驱动程序开发方面的专家,但我了解到重入规则已经发生了很大变化;在非 SMP 和 SMP(多核)系统之间;内核版本之间;等等因此出现竞争条件错误的可能性似乎是合理的。
所以我的问题是:是否有任何已知的 Linux 驱动程序(或内核)错误符合该描述?
如果他们有类似的症状,我可以引用的任何先例都会有所帮助。在这一点上,很多相关人员(恕我直言)浪费时间思考“好吧,我的代码中没有错误,所以它一定是坏硬件。” 我想让他们超越这一点,并寻找更有可能成为真正原因的东西。