Как обнаружить различия в поведении с плавающей запятой на разных платформах - PullRequest
2 голосов
/ 22 марта 2019

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

Может быть достаточно проверки соответствия IEE-754 или проверки известных ошибок (чтобы объяснить разницу в выходных данных)что я наблюдал).

Я посмотрел флаги процессора через / proc / cpu и оба утверждают, что поддерживают SSE2, на которые я смотрел:

но они выглядят сложными в использовании.Я построил TestFloat, но я не уверен, что с ним делать.На домашней странице написано:

«К сожалению, вывод TestFloat не так легко интерпретировать. Для того, чтобы ответственно использовать TestFloat требуется детальное знание стандарта IEEE.»

В идеале я простоЯ хочу запустить одну или две программы или несколько простых проверок стилей конфигурации и сравнить выходные данные между двумя платформами.

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

Фон

Я обнаружил разницу в поведении приложения C ++ на двух разных платформах:

  • Процессор Intel (R) Xeon (R) E5504
  • Процессор Intel (R) Core (TM) i5-3470

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

Уточнение Исполняемый файл, скомпилированный в machine A ведет себя как исполняемый файл, скомпилированный на машине B, когда копируется для запуска на машине B и наоборот.

Это может быть неинициализированная переменная (хотя в valgrind ничего не отображалось) или многие другие, но я подозревалчто причиной может быть непереносимое использование плавающей запятойВозможно, одна машина интерпретирует сборку с плавающей запятой иначе, чем другая?Исполнители подтвердили, что знают об этом.Это не мой код, и у меня нет желания полностью переписывать его, чтобы проверить это.Перекомпиляция это хорошо, хотя.Я хочу проверить свою гипотезу.

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

Обновление

Я прошел путь проверки конфигурации, попробовал следующее на основе подсказок @ chux.

#include <iostream>
#include <cfloat>

int main(int /*argc*/, const char* /*argv*/[])
{
   std::cout << "FLT_EVAL_METHOD=" << FLT_EVAL_METHOD << "\n";
   std::cout << "FLT_ROUNDS=" << FLT_ROUNDS << "\n";
#ifdef __STDC_IEC_559__
   std::cout << "__STDC_IEC_559__ is defined\n";
#endif
#ifdef __GCC_IEC_559__
   std::cout << "__GCC_IEC_559__ is defined\n";
#endif
   std::cout << "FLT_MIN=" << FLT_MIN << "\n";
   std::cout << "FLT_MAX=" << FLT_MAX << "\n";
   std::cout << "FLT_EPSILON=" << FLT_EPSILON << "\n";
   std::cout << "FLT_RADIX=" << FLT_RADIX << "\n";
   return 0;
}

Предоставление одинакового вывода на обеих платформах:

./floattest 
FLT_EVAL_METHOD=0
FLT_ROUNDS=1
__STDC_IEC_559__ is defined
FLT_MIN=1.17549e-38
FLT_MAX=3.40282e+38
FLT_EPSILON=1.19209e-07
FLT_RADIX=2

Я все еще ищу что-то, что может отличаться.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Я нашел программу под названием esparanoia , которая выполняет некоторые проверки поведения с плавающей запятой.Это основано на оригинальной параноидальной программе Уильяма Кахана , которая обнаружила печально известную ошибку деления Pentium.

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

0 голосов
/ 22 марта 2019

ОП имеет 2 цели, которые немного конфликтуют.

  1. Как обнаружить различия в поведении с плавающей запятой на разных платформах (?)

  2. Iпросто хочу одну или две программы или несколько простых проверок стилей конфигурации, которые я могу запустить и сравнить выходные данные между двумя платформами.

Да, некоторые различия легко обнаружить, но некоторые различия могут быть очень незначительными.
Пример Может ли флаг состояния с плавающей точкой FE_UNDERFLOW быть установлен, если результат не является ненормальным?

Простых тестов для общей проблемы не существует.

Рекомендовать либо:

  1. Изменить цель кодированиячтобы учесть номинальные различия.

  2. Проверьте, определено ли _STDC_IEC_559__ и надежда , что достаточно для вашего приложения.Принимая во внимание различные другие факторы, такие как FLT_EVAL_METHOD и FLT_ROUNDS и уровни оптимизации, код все еще может быть совместимым, но обеспечивать другие результаты, но степень будет более управляемой.

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

...