C / C++ использование специальных функций процессора

Мне любопытно, используют ли новые компиляторы некоторые дополнительные функции, встроенные в новые процессоры,такие как MMX SSE, 3DNow! и что?

Я имею в виду, в оригинальном 8086 не было даже FPU, поэтому компилятор, который старый не может даже использовать его, но новые компиляторы могут, так как FPU является частью каждого нового процессора. Итак, новые компиляторы используют новые функции CPU?

или, правильнее спросить, используют ли новые функции стандартной библиотеки C/C++ новые функции?

спасибо ответ.

EDIT:

хорошо, поэтому, если я все правильно понял, даже некоторые стандартные операции, особенно с номерами float, можно сделать с помощью SSE быстрее.

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

в случае некоторых системных библиотек, требующих максимальной производительности, таких как OpenGL, DirectX и т. д., Эта поддержка может поддерживаться в система.

по умолчанию, По соображениям совместимости, компилятор не поддерживает его, но вы можете добавить эту поддержку, используя специальные функции C, поставляемые, например, Intel. Это должен быть лучший способ, так как вы можете напрямую управлять wheather и при использовании специальных функций нужной платформы писать приложения с поддержкой нескольких процессоров.

9 ответов


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

GCC может воспользоваться дополнительные инструкции в MMX, Расширения SSE, SSE2, SSE3 и 3dnow последних процессоров Intel и AMD. Параметры-mmmx, - msse, - msse2, -msse3 и -m3dnow позволяют использовать эти дополнительные инструкции, позволяющие несколько слов обрабатываемых данных параллельно. В результате исполняемые файлы будет работает только на процессорах, поддерживающих соответствующие расширения--на других системы они разобьются с помощью Ошибка незаконной инструкции (или аналогичная)


эти инструкции не являются частью стандартов ISO C и C++. Они доступны через компилятор встроенные функции в зависимости от используемого компилятора.

для MSVC см. http://msdn.microsoft.com/en-us/library/26td21ds (VS.80).aspx

для GCC, вы можете посмотреть наhttp://developer.apple.com/hardwaredrivers/ve/sse.html

AFAIK, внутренние компоненты SSE одинаковы между GCC и MSVC.


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

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


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

компиляторы JIT (для языков VM, таких как Java и C#) сделайте этот шаг дальше и скомпилируйте байт-код для конкретные CPU, на котором он работает. Это дает вашему собственному коду преимущество конкретной оптимизации процессора. Это одна из причин, почему Java-код может быть быстрее чем скомпилированный код C, потому что компилятор Java JIT может задержать свои решения по оптимизации, пока программа не будет запущена на фактической целевой машине. Компилятор C должен принимать эти решения, не всегда зная, что такое целевой процессор. Кроме того, компиляторы JIT развиваются и могут сделать вашу программу быстрее с течением времени без необходимости что-либо делать.


Если вы используете компилятор Intel C и задаете достаточно высокие параметры оптимизации, вы обнаружите, что некоторые из ваших циклов "векторизованы", что означает, что компилятор переписал их для использования инструкций в стиле SSE.

Если вы хотите использовать операции SSE напрямую, вы используете встроенные компоненты, определенные в ' xmmintrin.H ' заголовочный файл; скажи

#include

_ _ m128 U, V, W; плыть ww[4];

V=_mm_set1_ps (1.5);

U=_mm_set_ps (0,1,2,3);

W=_mm_add_ps (U,V);

_mm_storeu_ps (ww,W);


различные компиляторы будут использовать различные новые функции. Visual Studio будет использовать SSE / 2, и я считаю, что компилятор Intel будет поддерживать самые последние функции процессора. Вы должны, конечно, быть осторожны с проникновением на рынок вашей любимой функции.
Что касается использования вашей любимой стандартной библиотеки, это зависит от того, с чем она была скомпилирована. Однако стандартная библиотека c++ обычно компилируется на месте, так как она очень сильно шаблонна, поэтому, если вы включите SSE2, библиотеки std c++ должны использовать его. Что касается ЭЛТ, зависит от того, с чем они были скомпилированы.


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

  1. когда компилятор сам компилируется, вы настраиваете его для генерации кода для определенной архитектуры, и он может использовать любые функции, которые он знает, что архитектура будет иметь. Например, если это gcc настроен для процессора Intel, достаточно новые (или "не дорос"?) чтобы содержать интегрированный FPU, он будет генерировать плавающую точку инструкции.
  2. при вызове компилятора флаги или параметры могут указать тип функций, доступных процессору, который будет запускать программу, и тогда компилятор будет знать, что безопасно использовать эти функции. Если флаги отсутствуют, он будет генерировать эквивалентный код без использования специальных инструкций, предоставляемых этими функциями.

Если вы говорите о коде, написанном на C / C++, новые функции объясняются, если вы скажете своему компилятору сделать это. По умолчанию ваш компилятор, вероятно, нацелен на" простой x86 " (естественно, с FPU:)), обычно оптимизированный для наиболее распространенного поколения процессоров на данный момент, но все еще способный работать на старых процессорах.

Если вы хотите, чтобы компилятор генерировал код также учитывая новые наборы инструкций, вы должны сказать ему, чтобы сделать это с соответствующей командной строки параметр switch / project, например для Visual C++ параметр для включения генерации инструкций SSE/SSE2 -/arch.

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


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

использование CPUID для обнаружения наличия наборов инструкций SSE 4.1 и SSE 4.2

по мере выпуска новых компиляторов они добавляют новые функции напрямую, например VS2010. Код Visual C++ Генерация в Visual Studio 2010