Как я могу получить встроенную функцию для функции exp ()в коде x64?

У меня есть следующий код, и я ожидаю, что будет использоваться встроенная версия функции exp(). К сожалению, его нет в сборке x64, что делает его медленнее, чем аналогичный Win32 (, т.е. 32 -битная сборка ):

#include "stdafx.h"
#include 
#include 
#include 

int main()
{
  const int NUM_ITERATIONS=10000000;
  double expNum=0.00001;
  double result=0.0;

  for (double i=0;i

. Я использую следующие переключатели для своей сборки:

/Zi /nologo /W3 /WX-
/Ox /Ob2 /Oi /Ot /Oy /GL /D "WIN32" /D "NDEBUG" 
/D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm- 
/EHsc /GS /Gy /arch:SSE2 /fp:fast /Zc:wchar_t /Zc:forScope 
/Yu"StdAfx.h" /Fp"x64\Release\exp.pch" /FAcs /Fa"x64\Release\" 
/Fo"x64\Release\" /Fd"x64\Release\vc100.pdb" /Gd /errorReport:queue 

Как видите, я делаю иметь /Oi, /O2и /fp:fastв соответствии с требованиями статьи MSDN о внутренних функциях . Тем не менее, несмотря на мои усилия, обращение к стандартной библиотеке выполняется, что замедляет работу exp()на сборках x64.

Вот сгенерированная сборка.:

  for (double i=0;i

Как вы можете видеть в приведенной выше сборке, есть вызов функции exp(). Теперь давайте посмотрим на код, сгенерированный для этого forцикла с 32-битной -сборкой :

  for (double i=0;i

. Там намного больше кода, но он быстрее. Тест синхронизации, который я провел на хосте Nehalem -EP с частотой 3,3 ГГц, дал следующие результаты:

32 -бит:

Среднее время выполнения тела цикла :34,849229 циклов / 10,560373 нс

64 -бит:

Среднее время выполнения для тела цикла :45,845323 цикла / 13,892522 нс

Действительно, очень странное поведение. Почему это происходит?

Обновление:

Я создал отчет об ошибке Microsoft Connect . Не стесняйтесь голосовать за него, чтобы получить авторитетный ответ от самой Microsoft об использовании встроенных функций с плавающей запятой, особенно в коде x64.

9
задан Michael Goldshteyn 11 April 2012 в 02:35
поделиться