Какие проверки можно выполнить, чтобы определить различия в поведении с плавающей запятой двух аппаратных платформ?
Может быть достаточно проверки соответствия 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
Я все еще ищу что-то, что может отличаться.