Что такое спекуляция с плавающей точкой и чем она отличается от модели с плавающей точкой компилятора - PullRequest
8 голосов
/ 14 сентября 2011

Компилятор Intel C ++ предоставляет две опции для управления плавающей точкой:

-fp-speculation (быстро / безопасно / строго / выключено) -fp-модель (точный / быстрый / строгий и исходный / двойной / расширенный)

Мне кажется, я понимаю, что делает fp-модель. Но что такое fp-спекуляция и как она связана с fp-моделью? Я до сих пор не нашел ни одного документа Intel, объясняющего это!

Ответы [ 3 ]

13 голосов
/ 14 сентября 2011

-fp-model влияет на способ выполнения вычислений с плавающей запятой и может изменить числовой результат (путем лицензирования небезопасных оптимизаций или изменения точности, с которой оцениваются промежуточные результаты).

-fp-speculation не изменяет числовые результаты, но может влиять на то, какие флаги с плавающей точкой поднимаются операцией (или какие ловушки принимаются, если ловушки с плавающей точкой включены). 99,99% программистов не нуждаются в этих вещах, поэтому вы, вероятно, можете работать по умолчанию и не беспокоиться об этом.

Вот конкретный пример; Предположим, у вас есть следующая функция:

double foo(double x) {
    // lots of computation
    if (x >= 0) return sqrt(x);
    else return x;
}

sqrt, относительно говоря, медленно. Было бы неплохо поднять вычисление sqrt(x) примерно так:

double foo(double x) {
    const double sqrtx = sqrt(x);
    // lots of computation
    if (x >= 0) return sqrtx;
    else return x;
}

Делая это, мы позволяем вычислению sqrt идти одновременно с другими вычислениями, уменьшая задержку нашей функции. Тем не менее, есть проблема; если x отрицательно, то sqrt(x) поднимает флаг недействительности. В исходной программе этого никогда не могло произойти, потому что sqrt(x) вычислялось только, если x было неотрицательным. В модифицированной программе sqrt(x) вычисляется безоговорочно. Таким образом, если x отрицательно, измененная программа поднимает флаг недопустимости, тогда как исходная программа этого не делала.

Флаг -fp-speculation дает вам возможность сообщить компилятору, заботитесь ли вы об этих случаях или нет, и он знает, есть ли у него лицензия на такие преобразования.

1 голос
/ 14 сентября 2011

Неисполнение ордера и спекулятивное исполнение могут привести к посторонним исключениям или вызвать исключения в неподходящее время.

Если это имеет значение для вас, вы можете использовать опцию fp-speculation для управления предположениями о командах с плавающей запятой.

Для (немного) дополнительной информации: http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/fortran/lin/compiler_f/copts/common_options/option_fp_speculation.htm

0 голосов
/ 13 октября 2014

В ОС Windows: 1.Intel компилятор плавающий расчет 32-битное приложение против 64-битного приложения, тот же код может дать вам другой результат !!!! Неважно, какой флаг вы выберете:) !!!!

2. Плавающее вычисление компилятора в студии Visual 32-разрядное или 64-разрядное приложение, тот же код выводит тот же результат.

...