c++应用程序在非AVX CPU上崩溃

c++ app crashing on non AVX CPUs

本文关键字:CPU 崩溃 AVX 应用程序 c++      更新时间:2023-10-16

我有一个AVX优化的应用程序,不需要与非AVX CPU兼容。然而,我希望在这些旧的CPU上显示一个干净的错误对话框,而不是让应用程序崩溃,因为这会引起客户的困惑。

在我的main()中,我创建了QApplication实例(我使用的是Qt框架),然后使用gcc __builtin_cpu_supports ("avx")测试AVX。如果失败,我会显示一个错误对话框。事实证明,在一个简单的测试应用程序上,这可以在非AVX CPU上工作。

但是,我们的(大型)应用程序在非AVX CPU上显示对话框之前会崩溃。

我怀疑:

  • 使用AVX内部函数的全局变量初始化。我不能百分之百肯定到处都检查过,但事实似乎并非如此
  • gcc优化器在检查之前调用的一些代码上使用AVX指令

问题是,我没有非AVX系统在工作中进行调试,如果可能的话,我宁愿避免购买。

  1. 在我的CPU上调试时,是否可以禁用AVX,以便调试器在任何AVX指令上停止
  2. 有其他想法吗

您可以创建一个(未优化的)包装程序来执行功能测试,然后带着友好的消息退出或执行您的应用程序。

QApplication构造函数可以修改传递的参数,因此您需要获取一个副本(或者在通往exec()的路径中不使用任何Qt)。

(从我的脑海中):

int main(int argc, char **argv)
{
    if (__builtin_cpu_supports ("avx")) {
        execv("/the/real/program", argv);
        perror("exec");
        exit 1;
    } else {
        QApplication app(argc, argv);
        QDialog d;
        d.show();
        return 1;
    }
}

VMWare可以伪造客户操作系统的CPUID,您可以关闭所有AVX位。

然而,这只是在欺骗应用程序:如果应用程序仍然执行AVX指令,它不会导致应用程序闯入调试器。