我有一个 AVX 优化的应用程序,我不需要使其与非 AVX CPU 兼容。但是,我想在这些较旧的 CPU 上显示一个干净的错误对话框,而不是让应用程序崩溃,因为这会导致客户混淆。
在我的 main()
中,我创建了 QApplication
实例(我使用的是 Qt 框架),然后使用 gcc __builtin_cpu_supports ("avx ")
。如果失败,我会显示一个错误对话框。事实证明,这适用于非 AVX CPU 的简单测试应用。
但是,我们的(大型)应用程序在非 AVX CPU 上显示对话框之前崩溃了。
我怀疑:
- 在某处使用 AVX 内部函数进行全局变量初始化。我不是 100% 确定已检查所有地方,但似乎并非如此。
- gcc 优化器在检查前调用的一些代码上使用 AVX 指令。
问题是,我没有用于调试的非 AVX 系统,我宁愿尽可能避免购买。
- 是否可以在我的 CPU 上调试时禁用 AVX,以便调试器在执行任何 AVX 指令时停止?
- 有其他想法吗?
最佳答案
您可以创建一个(未优化的)包装程序来执行功能测试,然后以友好的消息退出或执行您的应用程序。
QApplication
构造函数允许修改传递的参数,因此您需要复制一份(或者不在通过 exec()< 的路径中使用任何 Qt/
)。
类似的东西(来 self 的脑海):
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;
}
}
关于c++ 应用程序在非 AVX CPU 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36739633/