C / C ++ использование специальных функций процессора - PullRequest
7 голосов
/ 18 мая 2010

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

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

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

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

EDIT:

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

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

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

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

Ответы [ 9 ]

4 голосов
/ 18 мая 2010

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

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

2 голосов
/ 18 мая 2010

Эти инструкции не являются частью каких-либо стандартов 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.

1 голос
/ 18 мая 2010

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

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

# include

__m128 U, V, W; float 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);

1 голос
/ 18 мая 2010

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

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

1 голос
/ 18 мая 2010

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

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

0 голосов
/ 18 мая 2010

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

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

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

0 голосов
/ 18 мая 2010

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

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

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

0 голосов
/ 18 мая 2010

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

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

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

...