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

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

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

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

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

РЕДАКТИРОВАТЬ:

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

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

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

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


person B.Gen.Jack.O.Neill    schedule 17.05.2010    source источник
comment
В следующем посте о переполнении стека добавьте пустые строки между вопросами, так как это позволит людям легче определять вопросы (особенно при разработке ответов для вас).   -  person Thomas Matthews    schedule 18.05.2010
comment
Учтите, что даже базовый add реализован по-разному на разных семействах процессоров. При выборе между выводом PPC и выводом Intel компилятор выполняет те же основные действия, что и при выборе между выводом SSE и выводом без SSE.   -  person Dennis Zickefoose    schedule 18.05.2010


Ответы (9)


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

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

person Brian Agnew    schedule 17.05.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.

person rotoglup    schedule 17.05.2010

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

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

person Thomas Matthews    schedule 17.05.2010

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

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

person Greg Hewgill    schedule 17.05.2010
comment
ИМХО, я бы предпочел медленно умереть в аду с C, чем использовать Java для оптимизации процессора. - person Farshid Ashouri; 05.05.2019

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

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

#include ‹xmmintrin.h›

__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);

person Tom Womack    schedule 17.05.2010

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

person Puppy    schedule 17.05.2010

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

  1. Когда компилятор компилируется, вы настраиваете его для генерации кода для конкретной архитектуры, и он может использовать любые известные ему функции, которые будут иметься в этой архитектуре. Например, если он gcc настроен на достаточно новый процессор Intel (или «недостаточно старый»?), Чтобы содержать интегрированный FPU, он будет генерировать инструкции с плавающей запятой.
  2. Когда компилятор вызывается, флаги или параметры могут указывать тип функций, доступных процессору, который будет запускать программу, и тогда компилятор будет знать, что использовать эти функции безопасно. Если флаги отсутствуют, он сгенерирует эквивалентный код без использования специальных инструкций, предоставляемых этими функциями.
person Nick Meyer    schedule 17.05.2010
comment
Когда компилируется сам компилятор Хм, почему это должно происходить уже при компиляции компилятора? - person Viktor Sehr; 18.05.2010
comment
@Viktor нет. Я хочу сказать, что когда вы создаете компилятор, он автоматически знает некоторые основные сведения о своей целевой платформе в зависимости от того, настроили ли вы его для генерации исполняемых файлов для 8086, Pentium, PowerPC, SPARC и т. Д. Если вы создаете компилятор для генерации Pentium-совместимых исполняемых файлов, он может использовать специальные функции, представленные ранее в архитектуре x86, которых не было, например, в 386, даже если они принадлежат к одному семейству. - person Nick Meyer; 18.05.2010

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

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

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

person Matteo Italia    schedule 17.05.2010

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

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

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

person daveangel    schedule 17.05.2010