Оптимизация использования ARM-кэша для разных массивов - PullRequest
6 голосов
/ 04 марта 2010

Я хочу портировать небольшой фрагмент кода на процессор ARM Cortex A8. И кэш L1 и кэш L2 очень ограничены. В моей программе 3 массива. Доступ к двум из них осуществляется последовательно (размер> Массив A: 6 МБ и Массив B: 3 МБ), а схема доступа к третьему массиву (размер> Массив C: 3 МБ) непредсказуема. Хотя вычисления не очень строгие, но при обращении к массиву C возникают огромные пропуски в кеше. Я подумал, что одним из решений было бы выделить больше места для кеша (L2) для массива C и меньше для массива A & B. найти какой-либо способ достичь этого. Я прошел предварительную загрузку движка ARM, но не смог найти ничего полезного.

Ответы [ 2 ]

1 голос
/ 05 марта 2010

Было бы неплохо разделить кэш и выделить каждый массив в отдельной его части.

К сожалению, это невозможно. Кэши CortexA8 просто не такие гибкие. У старого доброго StrongArm был дополнительный кэш для этой цели, но он больше не доступен. Вместо этого у нас есть кэши L1 и L2 (в целом хорошее изменение imho.)

Однако есть кое-что, что вы можете сделать:

Блок NEON SIMD CortexA8 отстает от универсального процессора примерно на 10 процессорных циклов. При умном программировании вы можете выдавать предварительные выборки из кеша из универсального устройства, но осуществлять доступ через NEON. Задержка между двумя конвейерами дает кешу немного времени для выполнения предварительных выборок, поэтому среднее время задержки кеша будет ниже.

Недостатком является то, что если вам никогда не придется перемещать результат вычисления обратно из NEON в модуль ARM. Поскольку NEON отстает, это приведет к полной очистке конвейера ЦП. Почти, если не дороже, из-за отсутствия кеша.

Разница в производительности может быть значительной. Внезапно я ожидал бы что-то между 20% и 30% улучшения скорости.

0 голосов
/ 05 марта 2010

Из того, что я мог найти через Google, похоже, что ARMv7 (версия ISA, которую поддерживает Cortex A8) имеет функцию очистки кэша, хотя я не смог найти четкую ссылку на то, как ее использовать - возможно, вам удастся добиться большего, если вы потратите на это больше времени, чем минута или две, которые я потратил, набрав «ARM cache flush» в поле поиска и читая результаты.

В любом случае вы должны быть в состоянии приблизиться к тому, что вы хотите, периодически выполняя «промывочные» инструкции, чтобы вымыть части A и B, которые, как вы знаете, вам больше не нужны.

...