2017-01-25 14 views
1

어레이에 존재하는 N float의 평균을 계산하는 간단한 C 코드를 작성했습니다. 큰 N의 처리량으로 float 당 10.5 ClockCyles가 있습니다.ARM CMSIS 평균 N float 샘플의 DSP 처리량

arm_mean_f32()은 실제로 성능이 떨어졌습니다.

너무 많지 않습니까?

3 개 동작

  1. 로드에서 메모리 포인터

  • 증가 병렬로 일어날 수
  • 축적의로드 - 값.

    ARM Cortex M4F는이 작업을 수행합니까?

    이 프로젝트는 ARM Cortex M4F가 포함 된 Freescale K24 프로세서가 장착 된 맞춤형 보드에서 실행되었습니다.

  • +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; 
    } 
    

    를 사용하는 코드입니다 . 당신은 또한 컴파일러 최적화를 증가 시키려고 시도 할 수있다.