Как я могу сказать, используется ли внутренняя версия функции из разборки?

StackOverflow https://stackoverflow.com/questions/4048766

Вопрос

Я пытаюсь оптимизировать свое упражнение в VS2010. В основном у меня есть несколько SQRT, POW и MEMSET в основном цикле. Более конкретно, это то, что я делаю:

// in a cpp file ...
#include <cmath>

#pragma intrinsic(sqrt, pow, memset)
void Simulator::calculate() 
{
  for( int i=0; i<NUM; i++ )
  {
    ...
    float len = std::sqrt(lenSq);
    distrib[0] = std::pow(baseVal, expVal);
    ...
    clearQuad(i); // invokes memset
  }
}

После сборки разборка показывает, что, например, вызов SQRT по-прежнему компилирует как «вызов _CISQRT (0x ####)« ничего не изменяется независимо от того, включен ли флаг / OI или нет.

Может кто-нибудь любезно объяснить, как я могу включить внутреннюю версию и как я могу проверить его с помощью кода разборки?(Я также включил / O2 в настройках проекта.)

Спасибо

Редактировать:Проблема решена путем добавления / fp: быстро. Для SQRT, в качестве примера, внутренняя версия использует один «FSQRT» для замены версии STD «Call __Cisqrt ()». К сожалению, в моем случае внутренняя версия на 5% медленнее.

Большое спасибо Zan Lynx и MCH.

Это было полезно?

Решение

Вы компилируете машинный код, а не .NET CLR. Верно?

Если вы компилируете .NET, то код не будет оптимизирован, пока он не будет проходить через jit. В этот момент есть собственные внутренние и другие вещи, которые произойдут.

Если вы собираете нативный машинный код, вы можете играть с / arch опция и то / fp: быстрая опция.

Другие советы

Использование пространства имен C ++ STD мощь Заставить компилятора не использовать внутрисину. Попробуйте удалить std:: от твоего sqrt, pow, а также memset звонки.

Документация библиотеки MSDN для #pragma intrinsic Предлагает пример для тестирования, если используется внутренний действительно: компилировать с -FAs Флаг и посмотрите на полученный файл .asm.

Глядя на разборку в отладчике, как вы, кажется, уже делаете, должны также показать внутреннюю, а не call.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top