Узнав о встроенных функциях ARM NEON, я вычислил время написанной мной функции для удвоения элементов в массиве. Версия, использующая встроенные функции, требует больше времени, чем простая версия функции на C.
Без НЕОНА:
void double_elements(unsigned int *ptr, unsigned int size)
{
unsigned int loop;
for( loop= 0; loop<size; loop++)
ptr[loop]<<=1;
return;
}
С НЕОНОМ:
void double_elements(unsigned int *ptr, unsigned int size)
{
unsigned int i;
uint32x4_t Q0,vector128Output;
for( i=0;i<(SIZE/4);i++)
{
Q0=vld1q_u32(ptr);
Q0=vaddq_u32(Q0,Q0);
vst1q_u32(ptr,Q0);
ptr+=4;
}
return;
}
Интересно, занимают ли операции загрузки/сохранения между массивом и вектором больше времени, что компенсирует преимущества параллельного добавления.
ОБНОВЛЕНИЕ: Дополнительная информация в ответ на ответ Игоря.
1. Код размещен здесь:
plain.c
plain.s
neon.c
neon.s
Из раздела (метки) L7 в обоих листингах сборки я вижу, что в неоновой версии больше инструкций по сборке (следовательно, требуется больше времени?)
2. Я скомпилировал с использованием -mfpu= neon на arm-gcc, никаких других флагов или оптимизаций. Для простой версии вообще никаких флагов компилятора.
3. Это была опечатка, SIZE должен был быть размером; оба одинаковы.
4,5 .Пробовал на массиве из 4000 элементов. Я использовал gettimeofday() до и после вызова функции. NEON=230us,ordinary=155us.
6.Да, я распечатал элементы в каждом случае.
7.Сделал так, никаких улучшений.