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

 
 
> 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
Ответов
MacArrow
сообщение May 20 2013, 03:16
Сообщение #2





Группа: Участник
Сообщений: 8
Регистрация: 21-05-12
Пользователь №: 71 941



А если посмотреть ассемблер, что там видно?
При включенной поддержке неона оно будет оптимизировать с учетом неонных инструкций, но так же оно еще может циклы поразворачивать итп
Go to the top of the page
 
+Quote Post
Methane
сообщение May 20 2013, 03:28
Сообщение #3


Гуру
******

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



Цитата(MacArrow @ May 20 2013, 06:16) *
А если посмотреть ассемблер, что там видно?

+1

objdump -D ./a.out
Надо запустить.
Go to the top of the page
 
+Quote Post
pepelats
сообщение May 20 2013, 04:31
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Methane
сообщение May 20 2013, 04:47
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 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
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
pepelats
сообщение May 20 2013, 04:57
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:25
Рейтинг@Mail.ru


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