Программа VS-2019 аварийно завершает работу с первой инструкцией с плавающей запятой на некоторых серверах - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть сервис с кодом, который работает годами.

Теперь, используя VS-2019 16.3.7 / 8/9, я получаю исключения 0xC000001D (Поток пытался выполнить недопустимую инструкцию.) Для первой арифметики с плавающей запятой в фазе загрузки службы в некоторыхмашины.

Установка той же базы кода, скомпилированной с 16.2.4 / 5, работает.

У меня полный дамп памяти с одного компьютера. Сбой происходит при вызове _dtol3.

. Я вижу в коде сборки эту ситуацию.

0149477B 83 3D B4 AC 55 01 06 cmp         dword ptr [__isa_available (0155ACB4h)],6  
01494782 7C 15                jl          _dtol3_default (01494799h)  
01494784 C5 FA 7E C0          vmovq       xmm0,xmm0  
01494788 62 F1 FD 08 7A C0    vcvttpd2qq  xmm0,xmm0  <---- CRASH

__isa_available имеет значение 6. На моей машине это значение5. Одна машина, на которой мы видим сбой - это XEON Silver 4110, на котором запущено наше программное обеспечение. Тот же exe работает на XEON E5-2620. Тот же exe-файл работает на всех моих клиентских машинах в моей компании без каких-либо проблем (сочетание старых и новых машин Intel).

Глядя на вызываемый код, я вижу простое различие и деление на двойные значения, сравнивая его со значением, большим или равным 1,0.

COleDateTime nowClient = COleDateTime::GetCurrentTime(),
nowDB = GetCurrentTime();
COleDateTimeSpan diff = nowDB-nowClient;
if (diff.GetTotalMinutes()>=1)  // <----- CRASH
    ...

Есть ли способвлиять на создание кода в VS, чтобы избежать обращения к этому коду? (Любая регулировка, настройка совместимости)

Есть ли какие-либо известные изменения в VS-2019, которые влияют на плавающую математику после VS 16.2.4, которые могут повлиять на мою проблему?

Ответы [ 2 ]

2 голосов
/ 11 ноября 2019

Это ошибка в обновлении 16.3.x Visual Studio. Вот ссылка на отчет об ошибке .

Внимательно прочитайте, на самом деле это происходит на машинах, которые поддерживают AVX512, а не на старых процессорах, как описано в первом посте. Это также содержит несколько обходных путей, чтобы избежать проблемы, пока Microsoft не исправит проблему.

0 голосов
/ 11 ноября 2019

Вы можете включить или отключить генерацию «расширенных» инструкций для каждого проекта на его странице «Свойства»:

  1. Щелкните правой кнопкой мыши проект в обозревателе решений и выберите «Свойства» из всплывающего окна. меню.
  2. Выберите / откройте вкладку «C / C ++» в левой панели, а затем выберите элемент «Генерация кода».
  3. В списке свойств, представленных вна правой панели выберите «Не установлено» для свойства «Активированный расширенный набор инструкций» (или какой-либо другой параметр даст вам код, совместимый с вашими целевыми ПК).

Использование компиляторомvmovq подразумевает, что у вас (по крайней мере) включены расширенные векторные расширения;Кроме того, я думаю (не уверен на 100%), что vcvttpd2qq находится в категории "AVX2".

...