ARM-高效C编程|第六篇 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:eef07a08vmov.f32s15, #8 ; 0x404000003.0 * 10404:ee800a27vdiv.f32s0, s0, s15 * 10408:e12fff1ebxlr * 0001040c : * 1040c:eeb70ac0vcvt.f64.f32d0, s0 * 10410:eddf0b02vldrd16, [pc, #8]; 10420 * 10414:ee200b20vmul.f64d0, d0, d16 * 10418:eeb70bc0vcvt.f32.f64s0, d0 * 1041c:e12fff1ebxlr * 10420:55555555.word0x55555555 * 10424:3fd55555.word0x3fd55555 */#include #include #include uint64_t get_clock_us(void) { uint64_t us = 0; uint64_t sec = 0; struct timespec timespec; clock_gettime(CLOCK_MONOTONIC, ×pec); 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; }

    推荐阅读