Есть ли способ, как улучшить производительность расчета без потери точности? В настоящее время я просто делаю:
1 / (1 + a * b)
куда а также б являются двойными. Ценность постоянно. Мне нужно сделать миллионы таких расчетов.
Давайте отделимся, когда a == 0
, a != 0
,
a == 0
тогда ответ 1
(кристально чистый) a ==!0
, позволять c = 1/a
(c
также является постоянным), тогда все выражение становится
c / (b + c)
Это сохранит один из расчета умножения.
Похоже, вы должны вычислить данное выражение итеративно (миллионы раз). Поскольку у вас есть итеративный процесс — вы можете рассмотреть возможность сделать это в параллели. В данном случае я бы подумал о SIMD (векторном) параллелизме.
Современные процессоры x86 имеют различные SIMD-параллельные варианты инструкций для «упакованного» (то есть SIMD-параллельного) подразделения и «упакован» (SIMD параллельно) обратный с разной точностью.
Это означает, что если вы способны «векторизовать» свой итеративный алгоритм (используя современные компиляторы, прагмы, такие как OpenMP4.x и т. д.) и запускать результирующее приложение на современном оборудовании x86 с поддержкой AVX (Sandy Bridge или более поздней версии, т.е. выпущенной после 2011 года), а затем вполне вероятно, Compiler будет использовать эффективный и быстрый вектор параллельно деления или взаимные (или схема Ньютона-Рапсона) в зависимости от выбранных вами параметров компиляции точности с плавающей запятой. На некоторых платформах упакованное (параллельное) деление в большинстве случаев выполняется так же быстро, как и скалярное (последовательное) деление. 4-16 больше элементов одновременно. В свою очередь взаимные гораздо быстрее, чем дивизии.
Вот список упакованных инструкций AVX и AVX512, чтобы дать вам некоторое представление ( РКП расшифровывается как Взаимный. PS обозначает параллельную одинарную точность с плавающей точкой, PD обозначает параллельную двойную точность FP, DIV обозначает деление. AVX — это то, что поддерживает ваш процессор, начиная с ~ 2011 года. AVX-512 — это то, что некоторые «процессоры» будут поддерживать начиная со второй половины 2016 года)