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