Новые наборы команд в CPU - PullRequest
4 голосов
/ 27 марта 2010

Каждое новое поколение процессоров вводит некоторые наборы новых инструкций, то есть MMX, 3DNOW, SSE и т. Д.

У меня есть несколько общих вопросов о них:

  1. Если какая-либо программа использует, например, инструкцию SSE, может ли она быть запущена на процессоре, который не поддерживает SSE?
  2. Если да, означает ли это, что эти инструкции будут изменены на большее число более простых инструкций?
  3. Если нет, значит ли это, что реальное влияние на производительность таких новых инструкций будет через несколько лет, когда большинство процессоров будет поддерживать такую ​​технологию (поэтому не будет никаких несовместимостей)?
  4. Когда я компилирую программу на C ++ с оптимизацией, значит ли это, что она будет использовать некоторые из этих новых инструкций? (Я знаю, что это зависит от многих факторов, особенно от кода, но я хочу получить общий ответ). Или они зарезервированы в основном для программ, написанных на asm?

Ответы [ 5 ]

8 голосов
/ 27 марта 2010

1) Да и нет: ЦП будет считать их недействительными, но если программа проверит, поддерживает ли ЦП эти инструкции, то может вернуться к версии, которая не использует эти инструкции, что позволяет программе быть беги в любом случае.

2) Программа должна будет предоставить альтернативную реализацию, используя более «базовые» инструкции, и знать, когда какую использовать.

3) Поскольку программа может проверять процессор, преимущества могут быть доступны прямо сейчас, но, конечно, если ваши пользователи используют процессоры, которые не поддерживают эти инструкции, они не увидят никакой выгоды.

4) Это будет полностью зависеть от компилятора и оптимизатора. Некоторые из наборов инструкций могут считаться достаточно старыми, чтобы компилятор всегда использовал их, если вы не скажете этого, а другие будут противоположны: вы должны указать компилятору использовать их. Будет ли он автоматически создавать запасные варианты, также будет зависеть от компилятора.

2 голосов
/ 27 марта 2010

Для уточнения ответа Майкла Мэдсена на вопрос 4, GCC по умолчанию генерирует код для процессора i386. Он предоставляет флаг с именем -march (также известный как -mcpu), который определяет, какие виды команд будет генерировать компилятор. cl.exe от Microsoft предоставляет флаги /arch: и /Gx для той же цели.

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

Мне неизвестен какой-либо статический компилятор, который будет создавать резервный код автоматического набора функций. Обычно это должно быть сделано явно программистом. Но хорошая новость в том, что этот программист не обязательно должен быть вами; например, библиотека liboil (Оптимизированных внутренних циклов) во время выполнения выберет лучший код для запуска в зависимости от машины, на которой он выполняется.

1 голос
/ 15 августа 2013
  1. Если какая-либо программа использует, например, инструкцию SSE, может ли она быть запущена на процессоре, который не поддерживает SSE?

Нет.Но в целом это часто генерирует ловушку или исключение, и обработчик ловушек / прерываний может обработать это при необходимости.

Например, давным-давно программы часто содержат код для x87.Если существует сопроцессор x87, инструкция будет нормально выполняться на аппаратном уровне, но если на компьютере отсутствует сопроцессор x87, то он сгенерирует ловушку, после чего инструкция будет обработана программно и вернет результат в обычном режиме.См. Что такое протокол для эмуляции с плавающей запятой x87 в MS-DOS?

Первые версии Hackintosh также используют это для эмуляции SSE2 на процессорах, которые не поддерживают этот набор команд.Конечно, производительность ужасна, но она будет работать.

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

Да.Но через несколько лет, возможно, программное обеспечение нуждается в обновлениях, верно?Для программного обеспечения с высокой производительностью может потребоваться переписать, чтобы воспользоваться новым набором команд.Для некоторых других увеличение производительности может быть незаметным

Когда я компилирую программу на C ++ с оптимизацией, значит ли это, что она будет использовать некоторые из этих новых инструкций?(Я знаю, что это зависит от многих факторов, особенно от кода, но я хочу получить общий ответ) Или они зарезервированы в основном для программ, написанных на asm?

Зависит от компилятора иопции, которые вы передаете ему во время компиляции.

Современные компиляторы поддерживают , поэтому они обнаруживают общие идиомы и оптимизируют его .Вам просто нужно перекомпилировать , чтобы воспользоваться новым набором команд.Но для сложных случаев вам все еще нужно оптимизировать вручную с использованием встроенных SIMD

Если вы используете внешнюю библиотеку , вы автоматически получите повышение скорости, когда библиотекаобновляется для поддержки нового набора инструкций, даже если вы ничего не делаете с вашей программой

1 голос
/ 27 марта 2010

MMX существует с 1996 года, SSE появился в 1999 году, а SSE2 дебютировал с Pentium 4 в 2001 году. Я думаю, можно с уверенностью предположить, что любой процессор, который вы будете использовать, имеет MMX и SSE и, возможно, SSE2. 3DNOW Я думаю, что это только AMD, поэтому не ожидайте, что эти инструкции будут доступны.

1 голос
/ 27 марта 2010

Исполняемый файл, содержащий новые инструкции, может выполняться только на процессорах, которые поддерживают эти новые инструкции. Вы можете настроить компилятор для компиляции для конкретного процессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...