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

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

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

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

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

Править:

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

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

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

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

7
задан B.Gen.Jack.O.Neill 17 May 2010 в 22:04
поделиться

9 ответов

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

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

4
ответ дан 7 December 2019 в 03:12
поделиться

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

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

#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 , Вт);

1
ответ дан 7 December 2019 в 03:12
поделиться

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

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

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

2
ответ дан 7 December 2019 в 03:12
поделиться

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

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

1
ответ дан 7 December 2019 в 03:12
поделиться

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

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

1
ответ дан 7 December 2019 в 03:12
поделиться

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

0
ответ дан 7 December 2019 в 03:12
поделиться

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

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

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

0
ответ дан 7 December 2019 в 03:12
поделиться

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

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

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

0
ответ дан 7 December 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: