【问题标题】:c++ app crashing on non AVX CPUsc++ 应用程序在非 AVX CPU 上崩溃
【发布时间】:2016-04-20 09:35:18
【问题描述】:

我有一个 AVX 优化的应用程序,我不需要使其与非 AVX CPU 兼容。但是,我想在这些旧 CPU 上显示一个干净的错误对话框,而不是让应用程序崩溃,因为这会导致客户混淆。

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

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

我怀疑过:

  • 在某处使用 AVX 内部函数的全局变量初始化。我不是 100% 肯定会到处检查,但似乎情况并非如此。
  • gcc 优化器在检查前调用的某些代码上使用 AVX 指令。

问题是,我没有用于调试的非 AVX 系统,如果可能,我宁愿避免购买。

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

【问题讨论】:

  • 为什么不一直运行simple test app,如果一切正常,那么simple test app 将运行main complex app
  • 已经在this forum 中讨论过。 Intel Software Development Emulator 建议。
  • 你收到SIGILL,你能安装一个处理程序吗?
  • @Toby :我不知道,我该怎么做?使用 mingw gcc。
  • 在 gdb 或非 avx CPU 上的任何其他调试器下运行您的应用程序,然后查看它在哪里死机。做一个回溯,看看你是如何到达现在的位置的。你的两个猜测都不错,也可能是。

标签: c++ debugging gcc avx


【解决方案1】:

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

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;
    }
}

【讨论】:

    【解决方案2】:

    VMWare 可以fake the CPUID 来宾操作系统,您可以关闭所有 AVX 位。

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

    【讨论】:

    • 这并不能解决我的问题!我找不到错误的 AVX 指令隐藏在哪里
    • @galinette 这实际上会解决你的问题。 AVX 指令需要由操作系统启用才能使用。如果操作系统没有检测到 CPU 支持 AVX 指令,它将不会启用它们。
    • 这将禁用 AVX 检测,但如果我是对的,AVX 指令仍然可以正常运行。
    • 这应该可以用一个小程序来测试。我对这种特定情况知之甚少,但总的来说,添加更多用户可访问寄存器的架构更改需要由您使用的任何操作系统显式启用:除非您知道它们,否则您不得将寄存器公开给应用程序将在上下文切换中保留。当然值得一试。 OTOH,如果 AVX 只提供新指令而不是额外的寄存器,那么您成功的机会就更小了。
    • @TobySpeight:事情不是这样的,没有 x64 指令可以“公开寄存器”。如果没有硬件支持,在操作系统中伪造这种“暴露”的速度会很慢。除此之外,还能得到什么? 使用额外寄存器的程序完全不受影响。 确实 使用额外寄存器的程序也不受影响;它仍然不会运行。有条件地使用额外寄存器的程序必须检查 CPUID 并且不受影响。这里真正的边缘情况是一个使用 AVX 寄存器的程序,不检查它们,并且想要自定义错误。
    猜你喜欢
    • 1970-01-01
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多