строгий fp в Java - PullRequest
       38

строгий fp в Java

9 голосов
/ 03 марта 2011

Я внедряю некоторую библиотеку нейронных сетей в Java, и выполняются интенсивные double (не Double) матричные операции, матрицы большие и, конечно, требуется производительность.

Итак, я пришел кпрочитайте о strictfp ключевом слове. Я, честно говоря, не понял, что именно оно делает, и я искал простое объяснение того, стоит ли мне его использовать или нет, и почему

Ответы [ 4 ]

15 голосов
/ 03 марта 2011

strictfp указывает, что для вычислений с плавающей запятой следует использовать точный стандарт IEEE754. Без strictfp виртуальная машина может свободно использовать другие (но зависящие от платформы) представления промежуточных значений типа float и double для повышения точности.

Используйте strictfp, если вам нужны одинаковые результаты на нескольких платформах. Избегайте этого, если хотите добиться максимальной точности, которую может дать ваша текущая платформа.

например. в следующем простом дополнении:

  2.0 + 1.1 + 3.0

Хотите, чтобы промежуточные результаты (например, 2.0 + 1.1) были представлены в виде двойного стандарта IEEE754 или с максимально возможной точностью, которую позволяет ваша платформа. StrongFP обеспечивает первое, а не использование StrongFP позволяет виртуальной машине использовать второй вариант.

Не использование strictfp не повлияет на производительность и может на платформах, где собственные типы с плавающей запятой не соответствуют IEEE754, повысить производительность, поскольку виртуальная машина не требуется для преобразования между собственными и обратно. и форматы IEEE754. Ответ зависит от платформы, вам нужно измерить.

1 голос
/ 03 марта 2011

Существует стандарт IEEE для хранения числа с плавающей запятой. Этот стандарт хорошо работает на всех платформах, но у него есть некоторые недостатки, например, с переполнением и понижением.

Некоторые платформы оптимизировали способ хранения чисел с плавающей запятой, поскольку в Java 1.2 JVM пытается использовать эти оптимизированные возможности. Проблема в том, что теперь недостатки могут отличаться от одной платформы к другой или даже полностью исчезнуть.

Таким образом, любой код, основанный на этих недостатках, может не работать на некоторых платформах, в качестве обходного пути было введено ключевое слово strictfp. Когда вы используете это ключевое слово, Java будет использовать стандарт IEEE, что обеспечивает большую совместимость на всех платформах.

Однако, поскольку оптимизация платформы больше не используется, вычисления с плавающей точкой медленнее с strictfp.

0 голосов
/ 03 июля 2014

Если вы хотите, чтобы другие исследователи обучали ту же самую нейронную сеть, используя те же тренировочные данные и те же случайные начальные числа, независимо от их ЦП, используйте strictfp. Воспроизводимость научных результатов (или точных битовых единичных тестов) является основным использованием для строгого фп. Для повседневного использования это наносит вред производительности и числовой стабильности.

0 голосов
/ 25 января 2013

Что касается производительности, вам не следует смешивать код с ключевым словом strictfp или без него, поскольку это может привести к снижению производительности на 20-30% (проверено на JDK 1.7 для точных преобразований Фурье).

Что касается точности, то они идентичны (более 1e-14 абсолютных или относительных погрешностей): это позволяет использовать только показатель большей степени, чтобы избежать недопущения или переполнения

...