Arhn - архитектура программирования

Зачем код, скомпилированный при сбое процессора Intel, на машине с процессором AMD?

У меня есть приложение, разработанное на C ++, в Visual Studio, на Windows, с процессором Intel.

Это приложение используется на нескольких машинах, в разных местах, все с процессорами Intel.

В последнее время его устанавливали на ПК с процессором AMD.

На машине AMD на определенной функции приложение зависает и вылетает.

Функция, которая дает сбой, использует блокировку ускоренного потока, а затем стандартные функции opencv (в частности, модуль реперных маркеров aruco), поэтому я предполагаю, что проблема заключается в блокировках потоков.

соответствующий код:

// заголовок

typedef boost::shared_mutex Lock;
typedef boost::unique_lock< Lock > WriteLock;
typedef boost::shared_lock< Lock > ReadLock;
Lock floorLock;

// поток первый (Производитель)

WriteLock f_lock2(floorLock);
frameFloor = image_ocv.clone(); //an opencv::Mat 
f_lock2.unlock();

// поток два (потребитель)

cv::Mat image_ocv;
ReadLock f_lock2(floorLock);
image_ocv = frameFloor;
f_lock2.unlock();

Я попытался заменить их на очереди, защищенные от рекламы, и сбой не исчез.

Другая третья сторона проверила это на разных машинах и подтвердила поведение. Единственная разница между машинами, на которых это работает нормально, и машинами, на которых происходит сбой, - это процессор Intel против AMD.

К сожалению, у меня нет машин AMD, поэтому у меня проблемы с отладкой.

Есть ли причина, по которой код, скомпилированный на процессоре Intel, вылетает из строя на AMD? Что я могу исправить, чтобы это исправить?


  • Использует ли функция opencv некоторые инструкции Intel AVX (512)? 30.10.2020
  • Привет, @Bob__, спасибо за ответ. Замечательная мысль! В коде используется модуль opencv :: aruco и Eigen. Я изучу это и посмотрю, смогу ли я что-нибудь найти. 30.10.2020
  • Параметры cmake opencv: CPU_BASELINE : SSE3, CPU_DISPATCH : SSE4_1;SSE4_2;AVX;FP16;AVX2;AVX512_SKX Может ли это вызвать проблему? 30.10.2020
  • Насколько мне известно, процессоры Ryzen (если это те процессоры AMD, которые у вас есть) поддерживают до AVX2, а не AVX512. Так что да, это может быть причиной проблемы, но я не буду претендовать на то, чтобы быть экспертом в этом вопросе. 30.10.2020
  • Ни один из процессоров AMD не поддерживает AVX512, но CPU_DISPATCH следует использовать эту функцию, только если она доступна. Кстати, странно, что вы не включили бы FMA или FMA3 в свой CPU_DISPATCH, если OpenCV не включает это с AVX2. Ваш процессор AMD действительно древний, настолько старый, что не поддерживает SSE3? Это было бы удивительно, думаю, даже более поздние процессоры K10 / Barcelona поддерживали SSE3. (SSSE3 (новое в Core 2; в основном целочисленные) не было доступно в AMD до Bulldozer, но это отличается от SSE3). 31.10.2020
  • Возможно, вы компилировали -march=native отдельно от того, что вы использовали с OpenCV? Какой конкретно процессор AMD у вас был? Скорее всего, это не совсем Intel против AMD, и на более старом Intel без некоторых расширений ISA произошел бы сбой. Особенно, если вы можете подтвердить, что это был сбой из-за недопустимой инструкции. (#UD аппаратное исключение. Linux SIGILL или что-то еще, что делает Windows, когда это происходит. То же, что и выполнение инструкции ud2, если вы хотите это проверить.) 31.10.2020
  • Привет @PeterCordes, Спасибо за ответ. Сбойный процессор AMD - это потайный процессор Ryzen, а не старая модель. У меня здесь нет машины AMD, поэтому это очень сложно отладить! Я попросил клиента провести несколько тестов, и это действительно похоже на функции opencv, которые вызывают сбой (только на машинах AMD). Есть ли у вас какие-либо мысли о том, что еще я могу здесь попробовать? 31.10.2020
  • Попробуйте его на процессоре Intel без AVX512, например Skylake-client или Haswell. Если там происходит сбой, значит, вы включили некоторые инструкции AVX-512, которые выполняются без каких-либо условий, а не только на процессорах с AVX-512. Если это воспроизводит аварию, поехали. Или, если это удобнее, вы можете использовать SDE на любом ЦП для эмуляции ЦП, отличного от AVX-512. Как противоположность Как проверить инструкции AVX-512 без поддерживаемого оборудования?. Или, например, Отключение AVX2 в ЦП в целях тестирования (но, конечно, отключите только AVX512; в Zen есть AVX2) 31.10.2020
  • Привет, @PeterCordes, я восстановил opencv без AVX512, и я вижу тот же сбой. Есть ли что-нибудь еще, что может вызывать это? Спасибо 03.11.2020
  • Может быть, обычные ошибки? Но вы все еще говорите, что у вас сбой, который нельзя воспроизвести с процессорами Intel? Может ли один использовать ускорение графического процессора, а другой - нет? 04.11.2020
  • Точно. Функции opencv отлично работают на процессорах Intel и дают сбой на машине AMD threadripper. Никакой другой разницы в аппаратном или программном обеспечении. Может быть, openMP? Я вижу в коде parallel_for_ петли 04.11.2020
  • Использование OpenMP в более сложных сценариях контекста потока иногда может стать довольно сложным, например, здесь я заметил несколько проблем для MSCPPUnit-Tests. Из вашего описания я действительно рекомендую сначала попытаться по возможности исключить любые проблемы, не связанные с архитектурой. Замки на стандартные пробовали заменить? Вы пытались воспроизвести сбой в эффективно неблокирующих сценариях? Но сомневаюсь, я думаю, вы не сможете обойтись без попытки воспроизвести это на машине AMD. Если задействован OpenMP, поведение кеша определенно различается между сомнительными архитектурами. 03.12.2020

Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..