Как эффективно загружать данные вертикальной линии из памяти в неоновые регистры
Я хочу прочитать вертикальную строку данных из блока изображения, т.е. я хочу получить первые данные каждой строки (длина строки равна ширине блока).
Я думаю, что следующий код не очень хорош. Есть ли лучшая реализация? (адрес данных в r5, длина строки в r1)
vld1.u8 d3[0], [r5], r1
vld1.u8 d3[1], [r5], r1
vld1.u8 d3[2], [r5], r1
vld1.u8 d3[3], [r5], r1
vld1.u8 d3[4], [r5], r1
vld1.u8 d3[5], [r5], r1
vld1.u8 d3[6], [r5], r1
vld1.u8 d3[7], [r5], r1
vld1.u8 d4[0], [r5], r1
vld1.u8 d5[0], [r5], r1
vld1.u8 d5[1], [r5], r1
vld1.u8 d5[2], [r5], r1
vld1.u8 d5[3], [r5], r1
vld1.u8 d5[4], [r5], r1
vld1.u8 d5[5], [r5], r1
vld1.u8 d5[6], [r5], r1
vld1.u8 d5[7], [r5], r1
1 ответ
NEON поддерживает только непрерывные нагрузки для шагов до 4 (с помощью инструкций VLDn, где n - размер шага). Поскольку ваша длина строки, вероятно, намного больше этой длины, я не вижу способа сделать то, что вы хотите, кроме загрузки каждого элемента по отдельности, как это делает ваш код.
Однако, если вам нужно применить этот шаг постобработки не только к первому столбцу, но и ко всем столбцам, вы можете обработать 8 (или 16, если вы используете Q регистров) столбцов сразу, вместо того, чтобы обрабатывать их по отдельности. Насколько это возможно, конечно, зависит от вашего алгоритма.
В идеале вы должны еще больше увеличить размер фрагмента и обрабатывать сразу несколько столбцов, которые умещаются в одну строку кэша (64 на большинстве ARM, если размер элемента составляет 8 бит). В противном случае, если в вашем изображении много строк, строки кеша, содержащие первые строки, будут удалены из кеша к тому времени, как вы обработали последние, и их придется повторно выбирать для обработки следующего фрагмента. колонн.