Отклонение в детерминированном приложении - PullRequest
1 голос
/ 21 апреля 2011

В настоящее время я работаю над (устаревшей) программой, написанной на C ++ и C #;он выполняет некоторые тяжелые вычисления, но должен быть полностью детерминированным.т. е. одни и те же входные данные будут приводить к одним и тем же выходным данным ... Проблема состоит в том, что 2 запуска (на одном и том же компьютере с использованием одного и того же скомпилированного исполняемого файла) приводят к несколько отличным выходным данным.

Приложение считывает и записывает данные в базу данных сервера SQL(он имеет уникальный доступ к БД, поэтому ничто иное не должно мешать значениям БД).

Единственное очевидное различие между прогонами состоит в том, что каждому из них присваивается уникальное имя (просто строковая переменная).

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

Есть ли какие-то другие очевидные вещи, которые мне следует искать, которые могли бы вызвать такое отклоняющееся поведение?

Ответы [ 4 ]

2 голосов
/ 21 апреля 2011

Мне приходят в голову две идеи:

  • неинициализированные переменные.
  • Арифметика с плавающей запятой не ассоциативна.

Последний пункт может привести к различиям уровня точности станка при многопоточности. Вероятнее всего, это будут неинициализированные переменные!

2 голосов
/ 21 апреля 2011

Если это C ++, то другое дело - выделение памяти. Вполне возможно, что значение где-то не инициализируется и поэтому принимает любое значение, которое окажется в памяти в то время.

1 голос
/ 21 апреля 2011

На ум приходят некоторые возможные причины:

  • Математика с плавающей запятой может давать немного другие результаты на 32-битных верс. 64 бита
  • некоторые итерационные алгоритмы могут использовать некоторую случайность для инициализации некоторых начальных векторов или около того
  • некоторые реализации могут использовать сторонние библиотеки - предварительно установленные в системе. LAPACK или FFTW некоторые кандидаты. У них может быть другая версия, и это тоже может быть причиной.
0 голосов
/ 21 апреля 2011

Детерминизм устанавливается в соответствии с определенными входами.

Была ли ваша база данных сброшена между повторными запусками? Возможно резервное копирование и восстановление базы данных в порядке, и ваши последующие тесты должны быть выполнены из свежих восстановлений базы данных. Если это работает, то вам нужно вернуться к проектной документации, чтобы определить, допустимо ли различаться в зависимости от входных данных базы данных.

Если проектный документ не допускает различного вывода в зависимости от входных данных базы данных, значит, ваша программа не соответствует спецификации.

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

В любом случае, вы, вероятно, имеете больше входных данных для алгоритма, чем отслеживаете, следовательно, неопределенность.

...