- 首页 > it技术 > >
ARM-高效C编程|第六篇 ARM C 高效编程 - 浮点运算
armc语言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;
}
推荐阅读