Ваша подпрограмма тестирования полностью испорчена, чтобы начинаться с:
Поскольку все входные данные четко видны компилятору во время сборки, компилятор просто сгенерирует машинные коды, подобные приведенному ниже:
A[0] = 3.0f;
A[1] = 5.0f;
A[2] = 7.0f;
A[3] = 9.0f;
Чтобы компиляторы не могли этого типа обмануть, вы должны скрыть ввод:
void myFunc_c(float *pA, float *pB, uint32_t count)
{
if (count == 0) return;
do {
*pA++ += *pB++;
} while (--count);
}
void myFunc_neon(float *pA, float *pB, uint32_t count)
{
float32x4_t a, b;
count >>= 2;
if (count == 0) return;
do {
a = vld1q_f32(pA);
b = vld1q_f32(pB);
a = vaddq_f32(a, b);
vst1q_f32(pA, a);
pA += 4;
pB += 4;
} while (--count);
}
Все, что вам нужно сделать, это выделить достаточно памяти для pA
и pB
, если хотите, инициализируйте их и вызовите функции выше.
Я думаю, что неоновая версия будет примерно в 3 раза быстрее.