Как я могу сказать, используется ли внутренняя версия функции из разборки?
-
27-09-2019 - |
Вопрос
Я пытаюсь оптимизировать свое упражнение в 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
.