Инструкции по предварительной выборке в ARM

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

  •  01-07-2019
  •  | 
  •  

Вопрос

Новые процессоры ARM включают инструкции PLD и PLI.

Я пишу жесткие внутренние циклы (на C ++), которые имеют непоследовательный шаблон доступа к памяти, но шаблон, который, естественно, полностью понимает мой код.Я бы ожидал существенного ускорения, если бы мог предварительно выбрать следующее местоположение во время обработки текущей ячейки памяти, и я ожидал бы, что это будет достаточно быстро, чтобы попробовать, чтобы эксперимент того стоил!

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

Как я могу включить явные инструкции предварительной выборки в свой код на C ++?

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

Решение

Должны быть какие-то особенности, специфичные для Компилятора.Не существует стандартного способа сделать это для C / C ++.Ознакомьтесь со Справочным руководством по составлению вашего компилятора.О компиляторе RealView см. это или это.

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

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

Рискуя спросить об очевидном:вы проверили целевую архитектуру компилятора?Например (юморите меня), если по умолчанию компилятор ориентирован на ARM7, вы никогда собираюсь ознакомиться с инструкцией PLD.

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

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