|
|
  |
ARM+NEON быстродействие, с NEON медленнее чем без него :( |
|
|
|
May 20 2013, 01:31
|
Участник

Группа: Участник
Сообщений: 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 оказались выше. Или все таки может я что то не учел?
Сообщение отредактировал IgorKossak - May 20 2013, 06:28
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
May 20 2013, 03:16
|
Группа: Участник
Сообщений: 8
Регистрация: 21-05-12
Пользователь №: 71 941

|
А если посмотреть ассемблер, что там видно? При включенной поддержке неона оно будет оптимизировать с учетом неонных инструкций, но так же оно еще может циклы поразворачивать итп
|
|
|
|
|
May 20 2013, 04:31
|
Участник

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

|
Цитата(Methane @ May 20 2013, 10:28)  +1
objdump -D ./a.out Надо запустить. да, проделывал я такое. Щас вот повторил. файл без включения NEON
asm.txt ( 20.53 килобайт )
Кол-во скачиваний: 164файл с включенным NEON
asm_with_neon.txt ( 24.12 килобайт )
Кол-во скачиваний: 185почему то в обоих случаях встречаются инструкции NEON
|
|
|
|
|
May 20 2013, 04:47
|

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

|
Цитата(pepelats @ May 20 2013, 07:31)  да, проделывал я такое. Щас вот повторил. А в переменных окружения ничего не говорит GCC его использовать? И более корректно gcc -c -g -Wa,-a,-ad -O3 так сгенерить.
Сообщение отредактировал IgorKossak - May 20 2013, 06:29
Причина редактирования: избыточное цитирование
|
|
|
|
|
May 20 2013, 04:57
|
Участник

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

|
Цитата(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
|
|
|
|
|
May 20 2013, 06:06
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(pepelats @ May 20 2013, 08:31)  да, проделывал я такое. Щас вот повторил. мммм... так плохо понятно... лучше скомпилить до ассемблера - gcc -O3 -S infile.c и получить infile.s и потом его разглядывать. Ну а дальше думать, или вот ссылка - http://pulsar.webshaker.net/ccc/result.php?lng=us
Сообщение отредактировал IgorKossak - May 20 2013, 06:30
Причина редактирования: избыточное цитирование
|
|
|
|
|
May 20 2013, 06:17
|
Участник

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

|
Цитата(diwil @ May 20 2013, 13:06)  мммм... так плохо понятно... вот удобоваримый выход
main.S.txt ( 3.12 килобайт )
Кол-во скачиваний: 134Видно что по умолчанию все равно используется NEON (.fpu neon-fp16) Только все равно непонятна разница, т.к. я не использую типы данных и вызовы NEON
Сообщение отредактировал IgorKossak - May 20 2013, 06:30
Причина редактирования: избыточное цитирование
|
|
|
|
|
May 20 2013, 07:30
|
Участник

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

|
Цитата(diwil @ May 20 2013, 14:00)  а... вижу... это не настоящий компилер. он может генерить неоновый код когда захочет. увы. да так то бы фик с ним. Просто не понятно, ему значит не важно, использую я в коде инструкции NEON или нет. Он сам их применяет по своему усмотрению? Интересно, в принципе, я могу, применяя инструкции NEON, заставить работать быстрее, или проще не париться и писать все как обычно, а компилятор сам по мере возможности будет оптимизировать. Вообще не очень понятно нафига они сделали чтобы компилятор сам что то пытался вставить, если я явно это не указывал.
|
|
|
|
|
May 20 2013, 08:04
|

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

|
Цитата(pepelats @ May 20 2013, 10:30)  Интересно, в принципе, я могу, применяя инструкции NEON, заставить работать быстрее, или проще не париться и писать все как обычно, а компилятор сам по мере возможности будет оптимизировать. Если на ассемблере, то думаю можно ускорить очень значительно. Цитата Вообще не очень понятно нафига они сделали чтобы компилятор сам что то пытался вставить, если я явно это не указывал.  Думаю что где-то указано, что можно использовать. Просто вы не знаете где это указано.
|
|
|
|
|
May 20 2013, 09:24
|
Участник

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

|
Цитата(Methane @ May 20 2013, 15:04)  Думаю что где-то указано, что можно использовать. Просто вы не знаете где это указано.  В доках сказано: Цитата 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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|