为什么math.h中的cos函数比x86 fcos指令快

问题描述 投票:1回答:1

math.h中的cos()运行速度比x86 asm fcos快。

下面的代码在math.h中的x86 fcos和cos()之间进行比较。

在此代码中,100万次asm fcos花费150ms; 1000000次cos()通话费用仅为80ms。

如何在x86中实现fcos?为什么fcos比cos()慢得多?

我的环境是英特尔i7-6820HQ + win10 +视觉工作室2017。

#include "string"
#include "iostream"
#include<time.h>
#include "math.h"

int main()
{
  int i;
  const int i_max = 1000000;

  float c = 10000;
  float *d = &c;

  float start_value = 8.333333f;
  float* pstart_value = &start_value;
  clock_t a, b;
  a = clock();

  __asm {
    mov edx, pstart_value; 

    fld [edx];
  }

  for (i = 0; i < i_max; i++) {
    __asm {
        fcos;
    }
  }


  b = clock();
  printf("asm time = %u", b - a);

  a = clock();
  double y;
  for (i = 0; i < i_max; i++) {
    start_value = cos(start_value);
  }

  b = clock();
  printf("math time = %u", b - a);
  return 0;
}

根据我个人的理解,单个asm指令通常比函数调用更快。为什么在这种情况下fcos这么慢?


更新:我在i7-6700HQ的另一台笔记本电脑上运行了相同的代码。在这台笔记本电脑上,100万次fcos只需51ms。为什么两个cpu之间存在如此大的差异。

c assembly x86 floating-point x87
1个回答
0
投票

我打赌答案很简单。您不使用cos的结果,并且它已在此示例中进行了优化

https://godbolt.org/z/iw-nft

将变量更改为volatile以强制cos调用。

https://godbolt.org/z/9_dpMs

另一个猜测:也许你的cos实现使用查找表。然后它将比硬件实现更快。

© www.soinside.com 2019 - 2024. All rights reserved.