Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ARM+NEON быстродействие
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
pepelats
Здравствуйте,

Завожу железку с 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
MacArrow
А если посмотреть ассемблер, что там видно?
При включенной поддержке неона оно будет оптимизировать с учетом неонных инструкций, но так же оно еще может циклы поразворачивать итп
Methane
Цитата(MacArrow @ May 20 2013, 06:16) *
А если посмотреть ассемблер, что там видно?

+1

objdump -D ./a.out
Надо запустить.
pepelats
Цитата(Methane @ May 20 2013, 10:28) *
+1

objdump -D ./a.out
Надо запустить.


да, проделывал я такое. Щас вот повторил.

файл без включения NEON
Нажмите для просмотра прикрепленного файла

файл с включенным NEON
Нажмите для просмотра прикрепленного файла
почему то в обоих случаях встречаются инструкции NEON
Methane
Цитата(pepelats @ May 20 2013, 07:31) *
да, проделывал я такое. Щас вот повторил.

А в переменных окружения ничего не говорит GCC его использовать? И более корректно

gcc -c -g -Wa,-a,-ad -O3

так сгенерить.
pepelats
Цитата(Methane @ May 20 2013, 11:47) *
А в переменных окружения ничего не говорит GCC его использовать? И более корректно

gcc -c -g -Wa,-a,-ad -O3

так сгенерить.


Компилится с помощью Eclipse команда получается:

Код
arm-xilinx-linux-gnueabi-gcc -Wall -O3 -g3 -c -fmessage-length=0 -MMD -MP -MF"src/main.d" -MT"src/main.d" -o "src/main.o" "../src/main.c"

и потом:
Код
Building target: filter.elf
Invoking: ARM Linux gcc linker
arm-xilinx-linux-gnueabi-gcc -s -o "filter.elf"  ./src/main.o   -lrt
Finished building target: filter.elf
Methane
Цитата(pepelats @ May 20 2013, 07:57) *
Компилится с помощью Eclipse команда получается:


arm-xilinx-linux-gnueabi-gcc -c -g -Wa,-a,-ad -O3 ../src/main.c

Попробуйте без эклипса для начала разобраться.
diwil
Цитата(pepelats @ May 20 2013, 08:31) *
да, проделывал я такое. Щас вот повторил.

мммм... так плохо понятно...
лучше скомпилить до ассемблера -
gcc -O3 -S infile.c
и получить infile.s и потом его разглядывать.

Ну а дальше думать, или вот ссылка - http://pulsar.webshaker.net/ccc/result.php?lng=us
pepelats
Цитата(diwil @ May 20 2013, 13:06) *
мммм... так плохо понятно...


вот удобоваримый выход
Нажмите для просмотра прикрепленного файла

Видно что по умолчанию все равно используется NEON (.fpu neon-fp16)
Только все равно непонятна разница, т.к. я не использую типы данных и вызовы NEON
diwil
Какая версия компилера? у меня не генерится неоновый код самомтоятельно (imx53).
а... вижу... это не настоящий компилер. он может генерить неоновый код когда захочет. увы.
pepelats
Цитата(diwil @ May 20 2013, 14:00) *
а... вижу... это не настоящий компилер. он может генерить неоновый код когда захочет. увы.


да так то бы фик с ним. Просто не понятно, ему значит не важно, использую я в коде инструкции NEON или нет. Он сам их применяет по своему усмотрению? Интересно, в принципе, я могу, применяя инструкции NEON, заставить работать быстрее, или проще не париться и писать все как обычно, а компилятор сам по мере возможности будет оптимизировать. Вообще не очень понятно нафига они сделали чтобы компилятор сам что то пытался вставить, если я явно это не указывал. 01.gif
Methane
Цитата(pepelats @ May 20 2013, 10:30) *
Интересно, в принципе, я могу, применяя инструкции NEON, заставить работать быстрее, или проще не париться и писать все как обычно, а компилятор сам по мере возможности будет оптимизировать.

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

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

Думаю что где-то указано, что можно использовать. Просто вы не знаете где это указано. sm.gif
pepelats
Цитата(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.
Methane
Цитата(pepelats @ May 20 2013, 12:24) *
Попробовал посмотреть ассемблер более сложной функции по вычислению. Там не обнаружилось ни одной инструкции NEON. Судя по всему компилятор может самостоятельно оптимизировать только тривиальные вещи. Типа простого суммирования большого количества данных. Но если вычисления усложняются и комбинируются например с умножением, плюс действия с матрицами, тогда он ничего не оптимизирует и нужно явно писать код для оптимизации применяя вызовы NEON.

Именно. Прочитали 8 интов, прочитал других 8 интов. Перемножили первые 8 на вторые 8.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.