Задать вопрос
Dyikot
@Dyikot

Как найти причину недетерминизма программы?

Есть программа для рассчета физических задач. Назовем ее - решатель. Она написана на C/C++ давно не мной. Программа в качестве аргумента принимает путь до файла определенного формата в бинарном виде который содержит необходимые данные для рассчета. После рассчета результаты сохраняет в тот же файл.
Я делаю тесты на python. Запускаю решатель, жду результата и потом извлекаю их и сравниваю с аналитическим решением. Допустимая погрешность 5%. По непонятным причинам результаты могут быть другими. Например в среднем 1 из 20 рассчетов (вызовов программы) результаты получаются такими что погрешность уже становится например 8%, а обычно она в пределах и для разных задач разная и пусть будет 2%. Т.е тест будет провальным, причем это случается не со всеми задачами. Также вот еще пример - мне нужно поссчитать предел величин из рассчетов нескольких вызовов (задача одна, но начальные условия разные) и мне нужны результаты нескольких тестов и я по очереди их запускаю. Пусть их будет 16. Как их запускаю и случайная задача вылетает с ошибкой,т.е и return code не равен 0, полагаю это исключение. И так может происходит если я запускаю их подрят. Если запускать их по отдельности, но все хорошо и исключений нет. У меня доступ к исходному коду. Я его собрал в Debug моде и при таком использывании проблем нет, по крайнем мере не вылетаю исключения.
  • Вопрос задан
  • 248 просмотров
Подписаться 1 Простой 7 комментариев
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Skillbox
    Профессия Разработчик С++
 с нуля + ИИ
    7 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++ расширенный
    12 месяцев
    Далее
Решения вопроса 1
@rPman
С высокой вероятностью, если в release есть исключения, а в debug нет - значит есть выход за границы размеров массивов и объектов.. очевидно что алгоритм реализован с ошибкой и значит точно считает неправильно (разные запуски будут разные результаты, в зависимости от мусора в памяти).

Если нет, то нужно понимать алгоритм, если в нем нет использования rnd, rand или time (тупо поиском подстроки по исходнику) то либо алгоритм берет еще какие то данные (из других мест) либо... ну к примеру unordered_map/set при итерации не гарантируют сохранение порядка, замени на просто map, еще сортировка со своим компаратором может давать недетерменированный результат для одинаковых элементов (но это не в пределах одного бинарника, а между разными реализациями sort в разных компиляторах), еще есть многопоточность, если от порядка исполнения что то зависит, то результат будет недетерменирован.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@kovserg
"Она написана на C/C++ давно не мной" -> врядли она многопоточна или использует opencl / cuda.
"Если запускать их по отдельности, но все хорошо" -> А ваша чудо программа создаёт временные файлы? Как вариант попробывать запускать разные копии программы в разных директориях.
"Я его собрал в Debug моде и при таком использывании проблем нет" -> в коде UB, прогнать анализатор и valgrind
"Как найти причину недетерминизма программы?" как обычно логированием этапов вычисления. Можно даже не самих данных а значения их hash значения (для уменльшения логов) и пологам искать место возникновения отклонений. После локализации смотреть причины.
Ответ написан
Комментировать
maaGames
@maaGames
Погроммирую программы
У дебаг данные инициализируются нулём, у релиз остаётся мусор. Убедись, что всё инициализируешь. Можно настройки компилятора поменять, чтобы была рантайм ошибка при использовании явно неинициализированных переменных, причём в дебаге.
Ответ написан
Комментировать
@Phisist
может float поменять на double, если есть?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы