Почему функция cos в math.h работает быстрее, чем инструкция x86 fcos - PullRequest
1 голос
/ 13 апреля 2019

cos () в math.h работает быстрее, чем x86 asm fcos.

Следующий код сравнивается между x86 fcos и cos () в math.h.

В этом коде 1000000 раз asm fcos стоит 150 мс; 1000000 раз, потому что () стоимость звонка составляет всего 80 мс.

Как fcos реализован в x86? Почему fcos намного медленнее, чем cos ()?

Моя среда - Intel i7-6820HQ + win10 + visual studio 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. На этом ноутбуке 1000000 раз fcos стоит всего 51 мс. Почему между двумя процессорами такая большая разница.

1 Ответ

0 голосов
/ 13 апреля 2019

Бьюсь об заклад, ответ прост.Вы не используете результат cos, и он оптимизируется, как в этом примере

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

Измените переменные на volatile, чтобы вызвать cos call.

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

Еще одно предположение: возможно, ваша реализация cos использует таблицы поиска.Тогда это будет быстрее, чем аппаратная реализация.

...