gpt4 book ai didi

c - 32位浮点除法并没有我想象的那么慢

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:44 24 4
gpt4 key购买 nike

我的环境:

  • Xilinx Zynq(基于 ARM Cortex A9)
  • PetaLinux V2014.2

我正在使用 PetaLinux 在 Zynq 上开发 Linux 应用程序。

我现在的问题是四次算术运算(+/-/*/div)的处理时间。

我使用以下代码使用 clock_gettime() 对处理时间进行计时。

对于加法(+):

static void funcToBeTimed_floatAdd(void)
{
int idx;
float fval = 0.0;
for(idx=0; idx<100; idx++) {
fval = fval + 3.14;
}
}

除法(/):

static void funcToBeTimed_floatDiv(void)
{
int idx;
float fval = 314159000.00;
for(idx=0; idx<100; idx++) {
fval = fval / 1.001;
}
}

对于时间测量,使用以下代码。procNo 使用 main(int argc, char *argv[])

设置
static void disp_elapsed(int procNo)
{
struct timespec tp1, tp2;
long dsec, dnsec;

/***/
switch(procNo) {
case 0:
printf("add\n");
clock_gettime(CLOCK_REALTIME, &tp1);
funcToBeTimed_floatAdd();
clock_gettime(CLOCK_REALTIME, &tp2);
break;
case 1:
printf("multi\n");
clock_gettime(CLOCK_REALTIME, &tp1);
funcToBeTimed_floatMulti();
clock_gettime(CLOCK_REALTIME, &tp2);
break;
default:
printf("div\n");
clock_gettime(CLOCK_REALTIME, &tp1);
funcToBeTimed_floatDiv();
clock_gettime(CLOCK_REALTIME, &tp2);
break;
}

dsec = tp2.tv_sec - tp1.tv_sec;
dnsec = tp2.tv_nsec - tp1.tv_nsec;
if (dnsec < 0) {
dsec--;
dnsec += 1000000000L;
}

printf("Epalsed (nsec) = %ld\n", dnsec);
}

因此,加法 (+) 和除法 (/) 的处理时间都在 2500 纳秒左右。

一般来说,除法比加法的成本更高,我认为,但在这种情况下差别不大。

我想知道

  • 什么样的优化应用于ARM
  • 用于搜索有关此类优化的更多信息的关键字
  • (如果有)检查处理时间的代码中的一些错误(例如,避免循环内的自动优化等)

最佳答案

您的代码可能存在几个问题:

  • 您没有向函数传递任何参数,因此优化可能会预先计算其结果。
  • 调用计时函数和调用您的函数的开销很大,因此速度下降是不可见的。
  • 您使用的计时器的粒度(尝试 granularity test)
  • 您正在使用 float 作为结果,但您正在以 double 执行所有操作 - 3.14 是 double ,3.14f 是 float 。
  • 100 次循环太少,看不到任何合理的地方,请尝试增加循环数以达到至少 1 秒的执行时间。
  • 您可以尝试禁用这些功能,看看实际情况如何。
  • 您是否使用硬件浮点支持对其进行编译?

关于c - 32位浮点除法并没有我想象的那么慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26209229/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com