Могут ли очень большие числа с плавающей точкой вызывать недетерминизм? - PullRequest
2 голосов
/ 06 марта 2012

Я запускаю программу оптимизации C ++ в среде win32. Программа использует готовые библиотеки DLL для FFTW и pthreads.

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

Я дважды проверил все возможные переполнения буфера, выделения памяти, проблемы с многопоточностью (теперь я уменьшил размер пула потоков до 1), размер стека, но после нескольких недель поиска ничего не нашел. До изменения в программе не было проблем с детерминизмом или стабильностью, она регулярно запускалась в течение нескольких дней.

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

Ответы [ 4 ]

2 голосов
/ 06 марта 2012

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

Вы также можете рассмотреть возможность того, что ваш собственный код может быть виновником. Это обычно (хотя и не всегда) тот случай, когда сторонняя библиотека интенсивно используется, поскольку невозможно предположить, что большинство ошибок уже были бы найдены кем-то другим.

Находится ли FFTW в этой категории, я не знаю. Но, безусловно, возможно, что его протестировали больше людей, чем ваш собственный код: -)

0 голосов
/ 19 мая 2014

Я искал некоторые подсказки, чтобы решить аналогичную проблему с плавающими значениями и недетерминированным поведением в Java, и я оказался в этой теме.Я просто хочу поделиться этим LINK , который объясняет, почему код C ++ может вызывать недетерминированное поведение, когда он использует плавающие значения, близкие к переполнению.В статье говорится, что проблемы вызваны переводом компилятора в машинный код.В зависимости от того, сравнивает ли машина уже усеченные значения или значения, хранящиеся в регистрах ЦП, с большей точностью, мы можем получить различные варианты поведения.Надеюсь, это поможет.

0 голосов
/ 06 марта 2012

Большие числа не вызывают недетерминированного поведения, но они могут увеличивать его - то, что ранее было небольшими различиями округления, может стать разницей между конечным числом и NaN или бесконечностью.

Следует обратить внимание на выравнивание буферов, передаваемых в FFTW. Как и большинство высокопроизводительных числовых программ, оно может использовать разные реализации в зависимости от выравнивания данных.

0 голосов
/ 06 марта 2012

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

Другим моментом может быть многопоточность (хотя вы говорите, что сократили пул потоков до одного), возможно условие состязания между управляющим потоком и рабочим потоком. Valgrind также может помочь в проверке потенциальных рас в многопоточном коде.

...