Почему GCC отключает указанные ниже параметры по умолчанию в архитектуре "westmere", хотя "westmere" их поддерживает - PullRequest
0 голосов
/ 12 февраля 2019

Я хочу скомпилировать свое приложение, включив -march="westmere" на RHEL5 с GCC.Но когда я запрашиваю gcc с gcc -march=westmere -Q --help=target, что все опции, которые будут включены для этой арки, все нижеуказанные опции по умолчанию отключеныПоддержите все наборы инструкций выше.Если да, то почему GCC не включает эти параметры по умолчанию?

Какое-либо неблагоприятное влияние на приложение, если я включил их в компиляцию приложения?На данный момент я использую эти опции в другой архитектуре, например, Sandybridge.Так хотел узнать, будет ли какое-нибудь влияние, если они отключатся на Вестмере?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я думаю, что лучший способ проверить, отличаются ли какие-либо параметры по умолчанию между различными архивами с -mrach в gcc, - это передать эти архивы в GCC с помощью простой тестовой программы и записать их.Позже прочтите параметры по умолчанию, переданные им с помощью readelf.

gcc -frecord-gcc-Switches -march = собственный Helloworld.cpp -o test

readelf -p .GCC.command.linetest

gcc -frecord-gcc-switch -march = westmere Helloworld.cpp -o test

readelf -p .GCC.command.line test

В RHEL5 x86 сКоманды GCC 4.9.1, приведенные выше, показали тонкую разницу между тем, что компилятор передает в качестве параметров по умолчанию.Как я уже писал в своем вопросе, передача westmere в -march не передает все эти флаги по умолчанию.

0 голосов
/ 12 февраля 2019

-Q - это опция, предназначенная только для разработчиков, и она заставляет --help=target выводить внутреннюю информацию.В этом случае из-за того, как реализованы опции выбора цели, настройки подопции не отражают значения общих настроек.

Вы можете просмотреть предопределенные макросы препроцессора, чтобы определить, что на самом деле включено вкомпилятор.Сравните:

$ gcc -E -x c -dM /dev/null | grep SSE
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSE__ 1

Кому:

$ gcc -march=westmere -E -x c -dM /dev/null | grep SSE
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSSE3__ 1
#define __SSE__ 1
#define __SSE3__ 1

(Обратите внимание, что оба системных компилятора в Red Hat Enterprise Linux 5 (gcc и gcc44) не поддерживают -march=westmere.)

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