Это хороший вопрос, потому что понимание численных алгоритмов и производительности является важной предпосылкой для того, чтобы быть эффективным вычислительным ученым. В то же время, это плохой вопрос, потому что установленные ограничения недостаточно квалифицируют его, чтобы дать значимый ответ.
Производительность трех вычислений будет сильно зависеть от точности, необходимой в конечном результате, а также от минимальной точности, необходимой для представления операндов. Вы квалифицируете , b и c как положительные действительные числа, но нам также нужно знать, сколько двоичных цифр d n требуется для их точного представления. Чтобы понять соображения производительности для общих действительных чисел, мы сначала должны понять, как компьютеры представляют целые числа, а также как они аппроксимируют действительные числа, используя числа с плавающей запятой.aбсdN
Когда компьютеры работают с целым числом , тогда необходимое количество двоичных цифр, очевидно, равно log 2 величины целого числа плюс дополнительный бит для обработки знака:M2
log 2 | М | + 1dNзнак равно2| M| +1
Например, число -8 может быть представлено 4 двоичными цифрами. Для повышения производительности и эффективности использования пространства арифметико-логические единицы (АЛУ), отвечающие за численные вычисления целых чисел на современных процессорах, предназначены для обработки математических вычислений с целыми числами вплоть до некоторого фиксированного размера, наиболее распространенными в наши дни являются d = 32 и d = 64. Не только процессоры x86, как на вашем компьютере, имеют ALU, они являются фундаментальным строительным блоком компьютерной архитектуры, повсеместной в современном электронном обществе. Если вы знакомы с игровыми приставками, вы, возможно, помните Nintendo 64, систему видеоигр, названную по размеру (в битах), для которой были разработаны арифметико-логические устройства на процессоре консоли.
Целочисленные сложения, вычитания и умножения на арифметических логических единицах очень эффективны и обычно требуют не более нескольких циклов для вычисления. Деления менее производительны, и на современных процессорах может потребоваться до нескольких десятков циклов. Производительность зависит как от архитектуры блока обработки (и соответствующей реализации арифметико-логического блока), так и от его частоты. Обратите внимание, что 64-битный процессор обычно может выполнять арифметику с -битными операндами с одинаковой скоростью для x в любом месте от 1 до 64.ИксИкс
В общих вычислениях, и особенно в научных вычислениях, целочисленная математика является громоздкой для многих вычислений, и необходимо другое представление чисел, так называемое представление с плавающей запятой. Числа с плавающей запятой представляют собой компромисс между работой современных микропроцессоров (преобразование данных в битные фрагменты) и потребностями вычислений путем представления чисел на процессоре в усеченной научной нотации с использованием фиксированной базы b (обычно b = 2 или b = 10 ) и представляет число, используя два целых числа, мантиссу (значимую в некоторых кругах) s и показатель степени e . Данное число хNбб = 2б = 10sеИкс тогда приблизительно представляется как:
x = s ∗ bе
Я говорю примерно, потому что должно быть очевидно, что даже простые рациональные, такие как не может быть представлен точно как число с плавающей точкой для стандартных базисов. Количество цифр, зафиксированных в значении, определяет точность числа, которое относительно его собственной величины. СтандартIEEE 754определяет ряд правил поведения ожидаемых чисел с плавающей запятой, в том числе диапазоны значений и мантиссы (и соответствующий диапазон и точность) для нескольких важных значенийdn, так что численные вычисления могут повторяться в пределах некоторая терпимость. В том, как работают числа с плавающей запятой, есть некоторая тонкость, которую я не могу надеяться охватить в этом ответе. Для хорошего введения я рекомендую«Что должен знать каждый специалист по вычислительной технике об арифметике с плавающей запятой»13dN,
За последние 50 лет были вложены значительные интеллектуальные усилия в улучшение возможностей процессора для эффективного вычисления арифметических операций с плавающей запятой. На современных процессорах эти вычисления обрабатываются одним или несколькими блоками с плавающей запятой (FPU), более сложной версией арифметического логического блока, предназначенного для выполнения арифметических операций над числами с плавающей запятой и обычно предназначенного для обработки обоих указанных в IEEE 754 32 -битные числа с плавающей запятой (часто называемые «числами с плавающей запятой») и 64-битные числа с плавающей запятой (часто называемые числами с двойными числами) эффективно. Подобно арифметическим логическим единицам, единицы с плавающей запятой часто могут вычислять сложение, вычитание и умножение всего за несколько циклов, в то время как для деления обычно требуется немного больше.
В большинстве случаев для числовых вычислений достаточно 64-разрядных двойных чисел с плавающей точкой IEEE 754, поэтому давайте предположим, что , b и c представлены в виде 64-разрядных двойных чисел , и вас интересует производительность три вычисления в виде скалярных операций в архитектуре Intel Nehalem с использованием подмножества команд с плавающей запятой x87, т. е. вас не интересует вычисление этих операций в цикле for или для диапазона данных, и вы не хотите использовать векторные расширения , Информация о задержке команд собирается из превосходного набора справочных таблиц команд для архитектур Intel / AMD.aбс
- aб
- войти в грaс
- с1б
1 Общее возведение в степень часто осуществляется со следующей идентичностью:
aб= β⋅ журналβб
Где равно 2 или e (в этом случае я использую β = 2 ). Предполагая, что вы готовы отбросить некоторую точность результата (модуль x87 выполняет вычисления с точностью 80 бит, но этого недостаточно для определенных диапазонов значений a и b ), это вычисление можно выполнить с помощью аппаратной инструкции FYL2X. для вычисления t = a ⋅ log 2 b и аппаратной инструкции F2XM1 (с некоторой помощью по масштабированию) для вычисления 2 t . Предполагая ~ 20 циклов для обработки масштабирования:β2еβ= 2aбt=a⋅log2b2t
FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 циклов
2 Это может быть преобразовано в два логарифма и деление путем изменения базовой идентичности и не требует масштабирования для получения точного результата.
2 * FYL2X + FDIV = 2 * 80 + (от 7 до 27) = от 167 до 187 циклов
[3] Это эквивалентно делению с возведением в степень, поэтому [1] плюс FDIV ~ 175 циклов.