|
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, 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
|
|
|
|
Сообщений в этой теме
pepelats ARM+NEON быстродействие May 20 2013, 01:31 MacArrow А если посмотреть ассемблер, что там видно?
При вк... May 20 2013, 03:16 Methane Цитата(MacArrow @ May 20 2013, 06:16) А е... May 20 2013, 03:28  pepelats Цитата(Methane @ May 20 2013, 10:28) +1
... May 20 2013, 04:31   Methane Цитата(pepelats @ May 20 2013, 07:31) да,... May 20 2013, 04:47    pepelats Цитата(Methane @ May 20 2013, 11:47) А в ... May 20 2013, 04:57     Methane Цитата(pepelats @ May 20 2013, 07:57) Ком... May 20 2013, 05:05      pepelats Цитата(diwil @ May 20 2013, 13:06) мммм..... May 20 2013, 06:17   diwil Цитата(pepelats @ May 20 2013, 08:31) да,... May 20 2013, 06:06
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|