выполнение обратного расчета в Stack Overflow

Есть ли способ, как улучшить производительность расчета \ Гидроразрыва {1} {1% 2Ва * Ь} без потери точности? В настоящее время я просто делаю:

1 / (1 + a * b)

куда а также б являются двойными. Ценность постоянно. Мне нужно сделать миллионы таких расчетов.

2

Решение

Давайте отделимся, когда a == 0, a != 0,

  • если a == 0тогда ответ 1 (кристально чистый)
  • если a ==!0, позволять c = 1/a

(c также является постоянным), тогда все выражение становится

    c / (b + c)

Это сохранит один из расчета умножения.

0

Другие решения

Похоже, вы должны вычислить данное выражение итеративно (миллионы раз). Поскольку у вас есть итеративный процесс — вы можете рассмотреть возможность сделать это в параллели. В данном случае я бы подумал о 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 года)

  • ISA | Инструкция | точность
  • AVX | VRCPS (без DP) | 2 ^ -12
  • AVX, AVX2 | VDIVPD / PS
  • AVX-512F | VRCP14PD / PS | 2 ^ -14
  • AVX-512F | ВДИВПД / ПС | 53 бит ??
  • AVX-512ER | VRCP28PD / PS | 2 ^ -28?
0

По вопросам рекламы [email protected]