Как эффективно загружать данные вертикальной линии из памяти в неоновые регистры

Я хочу прочитать вертикальную строку данных из блока изображения, т.е. я хочу получить первые данные каждой строки (длина строки равна ширине блока).

Я думаю, что следующий код не очень хорош. Есть ли лучшая реализация? (адрес данных в 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 бит). В противном случае, если в вашем изображении много строк, строки кеша, содержащие первые строки, будут удалены из кеша к тому времени, как вы обработали последние, и их придется повторно выбирать для обработки следующего фрагмента. колонн.

Другие вопросы по тегам