2010-03-04 8 views
6

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

ответ

1

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

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

Однако есть вещь, которую вы можете сделать:

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

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

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

0

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

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