Оптимизация использования кэша ARM для разных массивов

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

6
задан artless noise 5 January 2015 в 20:23
поделиться

2 ответа

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

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

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

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

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

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

1
ответ дан 17 December 2019 в 22:12
поделиться

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

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

0
ответ дан 17 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: