pragma optimize vs pragma target в чем разница - PullRequest
1 голос
/ 02 августа 2020

В чем разница между #pragma GCC optimize() и #pragma GCC target() и какой из них выбрать, когда, каковы другие варианты?

1 Ответ

0 голосов
/ 02 августа 2020

На высоком уровне optimize() используется для управления тем, используются ли определенные методы оптимизации при компиляции кода: общая идея состоит в том, что компилятор может тратить больше времени на создание либо более быстро выполняющегося кода, либо - иногда - большего компактный код, для работы которого требуется меньше памяти. Оптимизированный код иногда бывает труднее профилировать или отлаживать, поэтому вы можете захотеть, чтобы большая часть вашей программы была не оптимизирована или менее оптимизирована, но некоторые c функции, которые критичны по производительности, должны быть оптимизированы в высокой степени. Прагма дает вам свободу варьировать оптимизацию для каждой функции.

Отдельные оптимизации перечислены и объяснены в https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Optimize -Options

Общие обзор нотации и назначения атрибута optimize отсюда :

optimize (level, …)

optimize (string, …)

Атрибут optimize используется для укажите, что функция должна быть скомпилирована с параметрами оптимизации, отличными от указанных в командной строке. Допустимые аргументы - это постоянные неотрицательные целые числа и строки. Каждый аргумент numeri c указывает уровень оптимизации. Каждый строковый аргумент состоит из одной или нескольких подстрок, разделенных запятыми. Каждая подстрока, начинающаяся с буквы O, относится к варианту оптимизации, например -O0 или -Os. Другие подстроки берутся как суффиксы к префиксу -f, вместе формируя имя параметра оптимизации. См. Параметры оптимизации.

‘#pragma GCC optimize’ можно использовать для установки параметров оптимизации более чем для одной функции. Подробную информацию о прагме см. В Спецификации функций c Option Pragmas.

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

Не каждая опция оптимизации, которая начинается с префикса -f, указанного в атрибуте, обязательно влияет на функцию. Атрибут optimize следует использовать только для целей отладки. Это не подходит для производственного кода.


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

Дополнительные сведения отсюда

target (string,…)

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

Атрибут target может использоваться, например, для компиляции функции с ISA (архитектурой набора команд), отличной от используемой по умолчанию. '#pragma G CC target' может использоваться для указания параметров c целевого объекта для более чем одной функции. Подробную информацию о прагме см. В Спецификации функций c Option Pragmas.

Например, на x86 вы можете объявить одну функцию с атрибутом target ("sse4.1, arch = core2") и другим с целью ("sse4a, arch = amdfam10"). Это эквивалентно компиляции первой функции с параметрами -msse4.1 и -march = core2, а второй функции с параметрами -msse4a и -march = amdfam10. Вы должны убедиться, что функция вызывается только на машине, которая поддерживает конкретный ISA, для которого она скомпилирована (например, используя cpuid на x86, чтобы определить, какие функциональные биты и семейство архитектуры используются).

int core2_func (void) __attribute__ ((__target__ ("arch=core2")));

int sse3_func (void) __attribute__ ((__target__ ("sse3")));

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

Поддерживаемые параметры указаны c для каждой цели; см. Атрибуты функций x86, Атрибуты функций PowerP C, Атрибуты функций ARM, Атрибуты функций AArch64, Атрибуты функций N ios II и Атрибуты функций S / 390.

...