2017-01-25 10 views
1

Я написал простой C-код для вычисления среднего значения N float s, которые существуют в массиве. Я получил 10,5 ClockCyles за поплавок, так как пропускная способность для больших N.ARM CMSIS DSP пропускная способность для среднего числа выборок N float

arm_mean_f32() на самом деле хуже в производительности.

Разве это не слишком много CC/float?

В 3 операции

  1. нагрузки из памяти
  2. накопления-из загруженных значений
  3. приращение указателя

может произойти параллельно.

Выполняет ли это ARM Cortex M4F?

Проект был запущен на пользовательской плате с процессором Freescale K24 с ARM Cortex M4F.

+0

Я думаю, что ваше разделение с плавающей точкой занимает много времени. Попробуйте вычислять взаимные значения и умножать их на сумму, нужно сэкономить некоторое время. – user3528438

ответ

0

Реализация ARM очень традиционная, вы можете проверить ее на Github, они просто выполняют разворот цикла, чтобы уменьшить накладные расходы цикла, а затем аккумулировать сумму из 4 выборок в каждом цикле и, наконец, разделить количество выборок, я попробовал их с M4F и получил 5.3 цикла в поплавке.

Вот код, я использовал

#include "arm_math.h" 
#define MAX_BLOCKSIZE 32 

float32_t src_buf_f32[MAX_BLOCKSIZE] = 
{ 
    -0.4325648115282207, -1.6655843782380970, 0.1253323064748307, 
    0.2876764203585489, -1.1464713506814637, 1.1909154656429988, 
    1.1891642016521031, -0.0376332765933176, 0.3272923614086541, 
    0.1746391428209245, -0.1867085776814394, 0.7257905482933027, 
    -0.5883165430141887, 2.1831858181971011, -0.1363958830865957, 
    0.1139313135208096, 1.0667682113591888, 0.0592814605236053, 
    -0.0956484054836690, -0.8323494636500225, 0.2944108163926404, 
    -1.3361818579378040, 0.7143245518189522, 1.6235620644462707, 
    -0.6917757017022868, 0.8579966728282626, 1.2540014216025324, 
    -1.5937295764474768, -1.4409644319010200, 0.5711476236581780, 
    -0.3998855777153632, 0.6899973754643451 
}; 
float32_t result_f32; 

int main(void) 
{ 
arm_mean_f32(src_buf_f32, MAX_BLOCKSIZE, &result_f32); 
return 0; 
} 

Я думаю, что это лучший результат вы можете получить с плавающей точкой, ваша низкая производительность может быть благодаря тому, что ваш измеряет количество циклов неправильно или ваш кремний , вы также можете попытаться повысить оптимизацию компилятора.