2016-04-20 4 views
3

У меня есть оптимизированное для AVX приложение, которое мне не нужно делать совместимым с не AVX-процессорами. Тем не менее, я хотел бы показать чистый диалог ошибок на этих старых процессорах, вместо того, чтобы сбой приложения, так как это вызывает путаницу у клиента.C++ app crashing on non AVX CPUs

В моем main() Я создаю экземпляр QApplication (я использую каркас Qt), а затем тестирую AVX, используя gcc __builtin_cpu_supports ("avx"). Если это не удается, отображается диалоговое окно с ошибкой. Это доказало свою работу над процессорами без AVX в простом тестовом приложении.

Однако наше (большое) приложение аварийно завершает работу перед отображением диалогового окна на процессорах без AVX.

Я подозревал:

  • глобальной переменной инициализации где-то, который использует AVX встроенные функции. Я не уверен на 100% проверять везде, но, похоже, это не так.
  • gcc optimizer использует инструкции AVX для некоторого кода, вызываемого перед проверкой.

Проблема в том, что для отладки у меня нет системы без AVX, и я предпочел бы избежать покупки, если это возможно.

  1. Возможно ли отключить AVX при отладке на моем процессоре, чтобы отладчик остановился на любой инструкции AVX?
  2. Любые альтернативные идеи?
+0

Почему бы не запускать 'простое тестовое приложение' всегда, и если все нормально, тогда' простое тестовое приложение' запустит 'главное сложное приложение'? – fghj

+0

Уже обсуждался на этом форуме (https://software.intel.com/en-us/forums/intel-isa-extensions/topic/508413). [Intel Software Development Emulator] (http://software.intel.com/en-us/articles/intel-software-development-emulator). –

+0

Получаете ли вы 'SIGILL', и можете ли вы установить для этого обработчик? –

ответ

1

Вы можете создать (не оптимизированную) программу-обертку, которая выполняет тест функции, а затем либо выйдет с дружественным сообщением, либо выполнит ваше приложение.

Конструктор QApplication может изменять переданные аргументы, поэтому вам нужно будет взять копию (или не использовать Qt в пути, который проходит до exec()).

Что-то вроде (из моей головы):

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

VMWare может fake the CPUID гостевой ОС, и вы можете просто отключить все биты AVX.

Однако это просто врет для приложения: приложение не будет врываться в отладчик, если оно все еще выполняет эту инструкцию AVX.

+1

Это не решает мою проблему! Я не могу найти, где сбойная инструкция AVX скрыта. – galinette

+0

@galinette Это действительно решит вашу проблему. Перед тем, как они могут быть использованы, должны быть активированы инструкции AVX. Если ОС не обнаруживает, что процессор поддерживает инструкции AVX, он не сможет их включить. –

+1

Это отключит обнаружение AVX, но инструкции AVX все равно будут работать нормально, если я прав. – galinette