第六篇 ARM C 高效编程 - 浮点运算

/**
 * 结论:
 *     1. 尽量避免使用浮点除法运算。通常情况下,除法运算的耗时为加减乘法运算速度的 2~3 倍
 *     2. 在无法避免除法的情况下且除法除数为常数的情况下,可将除法变为乘法。
 *        如,x=x/3.0,可将其变为 x = x * (1.0/3.0),其中 1.0/3.0 的值将在编译时确定。
 * compile with arm-linux-gnueabihf-gcc v8.3
 * flags: -O3 -mcpu=cortex-a7 -mtune=cortex-a7 -mfloat-abi=hard -mfpu=neon
 * 00010400 
: * 10400: eef07a08 vmov.f32 s15, #8 ; 0x40400000 3.0 * 10404: ee800a27 vdiv.f32 s0, s0, s15 * 10408: e12fff1e bx lr * 0001040c : * 1040c: eeb70ac0 vcvt.f64.f32 d0, s0 * 10410: eddf0b02 vldr d16, [pc, #8] ; 10420 * 10414: ee200b20 vmul.f64 d0, d0, d16 * 10418: eeb70bc0 vcvt.f32.f64 s0, d0 * 1041c: e12fff1e bx lr * 10420: 55555555 .word 0x55555555 * 10424: 3fd55555 .word 0x3fd55555 */ #include #include #include uint64_t get_clock_us(void) { uint64_t us = 0; uint64_t sec = 0; struct timespec timespec; clock_gettime(CLOCK_MONOTONIC, &timespec); sec = timespec.tv_sec; us += sec * 1000000; us += timespec.tv_nsec / 1000; return us; } // * run on rv1126(4核 A7), cost 177109us float div(float x) { return x / 3.0; } // * run on rv1126(4核 A7), cost 160021us float div1(float x) { return x * (1.0 / 3.0); } int main(void) { int i = 0; float sum = 0; uint64_t s = get_clock_us(); for (i = 0; i < 10000000; i++) { sum += div1(i); } printf("cost %"PRIu64 "us\n", get_clock_us() - s); printf("sum is %f\n", sum); return 0; }

你可能感兴趣的:(ARM-高效C编程,arm,c语言)