реклама на сайте
подробности

 
 
> ARM+NEON быстродействие, с NEON медленнее чем без него :(
pepelats
сообщение May 20 2013, 01:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-10
Из: Томск
Пользователь №: 54 958



Здравствуйте,

Завожу железку с Cortex-A9, у которой есть NEON на борту. В качестве операционки - Linux. Решил потестировать скорость вычисления суммы массива int16 размером 1000000 элементов.

сначала обычное суммирование

Код
int sum_array(int16_t *array, int size)
{
    int i;
    int res = 0;

    for(i=0;i<size;i++){
        res += array[i];

    }

    return res;
}


затем с использованием NEON

CODE
/* return the sum of all elements in an array. This works by calculating 4
totals (one for each lane) and adding those at the end to get the final total */
int sum_array_neon(int16_t *array, int size)
{
/* initialize the accumulator vector to zero */
int32x2_t acc1;
int64x1_t acc2;
/* this implementation assumes the size of the array is a multiple of 4 */
assert((size % 4) == 0);
/* counting backwards gives better code */
for (; size != 0; size -= 4)
{
int16x4_t vec;
/* load 4 values in parallel from the array */
vec = vld1_s16(array);
/* increment the array pointer to the next element */
array += 4;
/* add the vector to the accumulator vector */
acc = vadd_s16(acc, vec);
}
/* calculate the total */
acc1 = vpaddl_s16(acc);
acc2 = vpaddl_s32(acc1);
/* return the total as an integer */
return (int)vget_lane_s64(acc2, 0);
}


в итоге скорость вычисление без NEON с оптимизацией -О3 оказалась выше чем с NEON с параметрами оптимизации:
Код
-mfpu=neon -mfloat-abi=softfp  -O3


Непонятно почему так получается. Предположение только что накладные расходы по копировании в памяти в случае с NEON оказались выше. Или все таки может я что то не учел? cranky.gif

Сообщение отредактировал IgorKossak - May 20 2013, 06:28
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
diwil
сообщение May 20 2013, 07:00
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107



Какая версия компилера? у меня не генерится неоновый код самомтоятельно (imx53).
а... вижу... это не настоящий компилер. он может генерить неоновый код когда захочет. увы.
Go to the top of the page
 
+Quote Post
pepelats
сообщение May 20 2013, 07:30
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-10
Из: Томск
Пользователь №: 54 958



Цитата(diwil @ May 20 2013, 14:00) *
а... вижу... это не настоящий компилер. он может генерить неоновый код когда захочет. увы.


да так то бы фик с ним. Просто не понятно, ему значит не важно, использую я в коде инструкции NEON или нет. Он сам их применяет по своему усмотрению? Интересно, в принципе, я могу, применяя инструкции NEON, заставить работать быстрее, или проще не париться и писать все как обычно, а компилятор сам по мере возможности будет оптимизировать. Вообще не очень понятно нафига они сделали чтобы компилятор сам что то пытался вставить, если я явно это не указывал. 01.gif
Go to the top of the page
 
+Quote Post
Methane
сообщение May 20 2013, 08:04
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(pepelats @ May 20 2013, 10:30) *
Интересно, в принципе, я могу, применяя инструкции NEON, заставить работать быстрее, или проще не париться и писать все как обычно, а компилятор сам по мере возможности будет оптимизировать.

Если на ассемблере, то думаю можно ускорить очень значительно.

Цитата
Вообще не очень понятно нафига они сделали чтобы компилятор сам что то пытался вставить, если я явно это не указывал. 01.gif

Думаю что где-то указано, что можно использовать. Просто вы не знаете где это указано. sm.gif
Go to the top of the page
 
+Quote Post
pepelats
сообщение May 20 2013, 09:24
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 20-01-10
Из: Томск
Пользователь №: 54 958



Цитата(Methane @ May 20 2013, 15:04) *
Думаю что где-то указано, что можно использовать. Просто вы не знаете где это указано. sm.gif


В доках сказано:
Цитата
2.2.4 Sourcery CodeBench Lite Edition for Xilinx Cortex-A9 Compiler Toolchain
SDK includes the Sourcery CodeBench Lite Edition for Xilinx Cortex-A9 compiler toolchain
for bare-metal Embedded Application Binary Interface (EABI) and Linux application
development.
The Xilinx Sourcery CodeBench Lite toolchain in SDK contains the same GNU tools, libraries
and documentation as the standard Sourcery CodeBench Lite Edition EABI and Linux compiler
toolchains, but adds the following enhancements:
* Default toolchain settings for the Xilinx Cortex-A9 processors
* Bare-metal (EABI) startup support and default linker scripts for the Xilinx Cortex-A9 processors
* Vector Floating Point (VFP) and NEON optimized libraries


Походу компилятор сам пытается подогнуть все под NEON, дабы не утруждать разработчика.

P.S. насчет писать все на асме, не очень бы хотелось по причине более сложной переносимости и трудночитаемости кода. В дальнейшем сопровождать такой код, как правило, может только тот, кто его написал (и то не факт), поэтому хочется по возможности и код понятный получить и быстродействия добиться. Асм, это уже как крайняя мера, если больше никак не выжать из проца требуемую скорость.


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

Сообщение отредактировал pepelats - May 20 2013, 09:24
Go to the top of the page
 
+Quote Post
Methane
сообщение May 20 2013, 09:32
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230



Цитата(pepelats @ May 20 2013, 12:24) *
Попробовал посмотреть ассемблер более сложной функции по вычислению. Там не обнаружилось ни одной инструкции NEON. Судя по всему компилятор может самостоятельно оптимизировать только тривиальные вещи. Типа простого суммирования большого количества данных. Но если вычисления усложняются и комбинируются например с умножением, плюс действия с матрицами, тогда он ничего не оптимизирует и нужно явно писать код для оптимизации применяя вызовы NEON.

Именно. Прочитали 8 интов, прочитал других 8 интов. Перемножили первые 8 на вторые 8.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 06:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.0757 секунд с 7
ELECTRONIX ©2004-2016