Причины недетерминированности с плавающей точкой?Включая NumPy? - PullRequest
0 голосов
/ 05 декабря 2018

Операции с плавающей точкой IEEE являются детерминированными, но см. Как можно сделать вычисления с плавающей запятой детерминированными? для одного способа, которым общее вычисление с плавающей запятой может быть недетерминированным:

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

Вопрос из двух частей:

Допущения:

  • Одно и то же программное обеспечение с теми же входами на том же оборудовании.Выход нескольких прогонов должен быть одинаковым.
    • Если это работает, очень желательно проверить, что выходные данные после выполнения рефакторинга кода равны.(Да, некоторые изменения в порядке операций могут сделать некоторые выходные данные не равными.)
  • Все случайные числа в программе являются псевдослучайными числами, которые последовательно используются изодни и те же семена для всех прогонов.
  • Нет неинициализированных значений.Python в целом безопасен, но numpy.empty() возвращает новый массив без инициализации записей.И не ясно, что это намного быстрее на практике.Так что будьте осторожны!

    • @ Тест PaulPanzer показывает, что numpy.empty() действительно возвращает неинициализированный массив и может легко и быстро перезаписать последний массив:

      import numpy as np np.arange(100); np.empty(100, int); np.empty(100, int) np.arange(100, 200.0); np.empty(100, float); np.empty(100, float)

    • Сложно получить полезные измерения времени для этих процедур!В цикле timeit, numpy.empty() может просто перераспределять один и тот же один или два узла памяти.Время не зависит от размера массива.Для предотвращения повторного использования:

      from timeit import timeit timeit('l.append(numpy.empty(100000))', 'import numpy; l = []') timeit('l.append(numpy.zeros(100000))', 'import numpy; l = []')

      , но уменьшение этого размера массива до numpy.zeros(10000) занимает в 15 раз больше времени;уменьшение его до numpy.zeros(1000) занимает 1,3 раза дольше (на моем MBP).Озадаченный.

См. Также: Значения хеш-памяти подсолены в Python 3, и каждый из них сохраняет порядок вставки .Это может варьировать порядок операций от запуска к запуску.[Я спорю с этой проблемой в Python 2.7.15.]

1 Ответ

0 голосов
/ 10 декабря 2018

Я обнаружил, что большинство (не всех) проблем недетерминированности, которые я испытываю, похоже, исправлено в коде для OpenBLAS 0.3.5.

Куча проблем с многопоточностью в более ранних версиях OpenBLAS исправлены в выпуске 0.3.4 , но в этом выпуске есть ошибка совместимости с macOS, исправленная в коде для выпуска 0.3.5.Ошибки также возникают с Apple Accelerate Framework версии 1.1 и Intel MKL mkl==2019.0.

. См. , как установить OpenBLAS и скомпилировать на нем NumPy и SciPy .

Возможно,Остающиеся проблемы, с которыми я сталкиваюсь, связаны с другими библиотеками, связанными с Ускорением?

Примечание: Я все еще открыт для получения дополнительных ответов на этот вопрос.

...