Могу ли я контролировать распределение регистров в g ++?

StackOverflow https://stackoverflow.com/questions/535039

Вопрос

У меня есть высоко оптимизированная часть C ++, и внесение даже небольших изменений в местах, удаленных от горячих точек, может снизить производительность на целых 20%.После более глубокого исследования оказалось, что это (вероятно) немного другие регистры, используемые в горячих точках.Я могу контролировать встроенность с помощью атрибута always_inline, но могу ли я контролировать распределение регистров?

Это было полезно?

Решение

Если вы действительно хотите возиться с распределением регистров, то вы можете заставить GCC выделять локальные и глобальные переменные в определенных регистрах.

Вы делаете это с помощью специального объявления переменной, подобного этому:

 register int test_integer asm ("EBX");

Работает и для других архитектур, просто замените EBX именем целевого регистра.

Для получения дополнительной информации по этому вопросу я предлагаю вам ознакомиться с документацией gcc:

http://gcc.gnu.org/onlinedocs/gcc-4.3.3/gcc/Local-Reg-Vars.html

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

Если ваша функция настолько критична к производительности, что вы получаете разницу в производительности на 20% между компиляциями, возможно, было бы хорошей идеей написать эту вещь на встроенном ассемблере.


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

Другие советы

Как правило, ключевое слово register просто игнорируется всеми современными компиляторами.Единственным исключением является (относительно) недавнее добавление ошибки при попытке получить адрес переменной, которую вы отметили ключевым словом register.

Я тоже испытал такого рода боль и в конце концов нашел единственный реальный способ обойти это - посмотреть на сборку вывода, чтобы попытаться определить, что заставляет gcc выходить из глубины.Есть и другие вещи, которые вы можете сделать, но это зависит от того, что именно пытается сделать ваш код.Я работал в очень-очень большой функции с большим количеством вычисляемого хаоса goto, в котором незначительные (казалось бы, безобидные) изменения могли привести к катастрофическому снижению производительности.Если вы делаете подобное, есть несколько вещей, которые вы можете сделать, чтобы попытаться смягчить проблему, но детали несколько туманны, поэтому я воздержусь от их обсуждения здесь, если это действительно не имеет значения.

Это зависит от используемого вами процессора.Или я должен сказать, да, вы можете использовать ключевое слово register, но это не одобряется, если только вы не используете простой процессор без прокладки каналов и с одним ядром.В наши дни GCC может выполнять работу намного лучше, чем вы с распределением регистров.Доверяй этому.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top