Оптимизация с плавающей точкой - руководство

Большинство проблем научных вычислений, которые нам необходимо решить путем реализации конкретного алгоритма в C / C ++, требуют точности, которая намного ниже, чем двойная точность. Например,1e-6, 1e-7 точность покрытия99% случаев для решения ОДУ или численного интегрирования. Даже в тех редких случаях, когда нам нужна более высокая точность, как правило, сам численный метод терпит неудачу, прежде чем мы можем мечтать о достижении точности, близкой к двойной точности. Пример: мы не можем ожидать точности 1e-16 от простого метода Рунге – Кутты даже при решении стандартного обыкновенного дифференциального уравнения Ностифа из-за ошибок округления. В этом случае требование двойной точности аналогично требованию лучшего приближения неправильного ответа.

Тогда агрессивная оптимизация с плавающей запятой в большинстве случаев кажется беспроигрышной, поскольку она делает ваш код быстрее (намного быстрее!) И не влияет на целевую точность вашей конкретной задачи. Тем не менее, кажется невероятно трудным убедиться, что конкретная реализация / код устойчива к оптимизации fp. Классический (и несколько тревожный) пример: GSL, научная библиотека GNU, является не только стандартной числовой библиотекой на рынке, но и очень хорошо написанной библиотекой (я не могу себе представить, что делаю лучше). Однако GSL не стабилен против fp оптимизации. Фактически, если вы компилируете GSL, например, с помощью компилятора Intel, его внутренние тесты не пройдут, если вы не включите-fp-model strict флаг, который отключает fp оптимизации.

Таким образом, мой вопрос: существуют ли общие рекомендации по написанию кода, устойчивого к агрессивным оптимизациям с плавающей запятой. Являются ли эти рекомендации специфическими для языка (компилятора). Если да, то каковы лучшие практики C / C ++ (gcc / icc)?

Примечание 1: Этот вопрос не задает вопрос о том, каковы флаги оптимизации fp в gcc / icc.

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

Примечание 3: Этот вопрос не задает список большинства стандартных оптимизаций fp (например, x / x -> 1).

Примечание 4: Я твердо верю, что это НЕ субъективный / не по теме вопрос, похожий на классический «Самые крутые имена серверов». Если вы не согласны (потому что я не предоставляю конкретный пример / код / проблему), отметьте это как вики сообщества. Меня гораздо больше интересует ответ, чем получение нескольких статусных очков (не они не важны - вы получите точку!).

Ответы на вопрос(1)

Ваш ответ на вопрос