Це гарне запитання, оскільки розуміння чисельних алгоритмів та продуктивності є важливою умовою бути ефективним вченим-обчислювачем. У той же час, це бідний питання , оскільки обмеження , як позувала мало кваліфікувати його , щоб дати змістовну відповідь.
Виконання трьох обчислень буде сильно залежати від точності, необхідної для кінцевого результату, а також мінімальної точності, необхідної для представлення операндів. Ви кваліфікуєте , b і c як додатні дійсні числа, але ми також повинні знати, скільки двійкових цифр d n потрібно, щоб їх точно представити. Щоб зрозуміти міркування щодо ефективності загальних реальних чисел, спершу нам потрібно зрозуміти, як комп’ютери представляють цілі числа, а також як він наближає реальні числа за допомогою чисел з плаваючою комою.abcdn
Коли комп'ютери працюють на ціле число , кількість необхідних двійкових цифр, очевидно, дорівнює log 2 величини цілого числа плюс додатковий біт для обробки знаку:M2
log 2 | М | + 1dn=2|M|+1
Наприклад, число -8 можна представити чотирма двійковими цифрами. Для ефективності та просторової ефективності арифметичні логічні одиниці (ALU), відповідальні за чисельні обчислення цілих чисел на сучасних одиницях обробки, призначені для обробки математики на цілі числа до певного фіксованого розміру, найбільш поширеними в ці дні d = 32 і d = 64. Не просто процесори x86, як у вашому комп’ютері, мають ALU, вони є фундаментальним складовим елементом архітектури комп'ютерів, всюдисущим у сучасному електронному суспільстві. Якщо ви знайомі з консолями відеоігор, ви можете запам'ятати Nintendo 64, систему відеоігор, названу за розміром (у бітах), арифметичні логічні одиниці на процесорі консолі, призначені для роботи.
Додавання, віднімання і множення цілих чисел на арифметичні логічні одиниці є дуже ефективними, і зазвичай для обчислення потрібно не більше декількох циклів. Підрозділи менш ефективні, і на сучасних процесорах може знадобитися аж кілька десятків циклів. Продуктивність залежить як від архітектури блоку обробки (і відповідної реалізації арифметичної логічної одиниці), так і від її частоти. Зауважте, що 64-розрядний процесор зазвичай може виконувати арифметику на -бітних операндах з однаковою швидкістю для x де-небудь між 1 і 64.xx
У загальних обчисленнях, особливо в наукових обчисленнях, ціла математика є непростою для багатьох обчислень, і потрібне інше представлення чисел, так зване представлення "плаваючої крапки". Числа з плаваючою комою представляють компроміс між тим, як працюють сучасні мікропроцесори (переносять дані навколо бітових груп) та потребами обчислення, представляючи числа на процесорі в усічених наукових позначеннях, використовуючи фіксовану базу b (як правило, b = 2 або b = 10 ) і представляє число за допомогою двох цілих чисел, мантіси (означальноїі в деяких колах) s та експонента e . Дане число xnbb=2b=10sex Тоді приблизно представлений як:
x=s∗be
Я кажу приблизно тому, що має бути очевидним, що навіть прості раціоналісти, такі як не може бути представлено точно як число з плаваючою комою для стандартних баз. Кількість цифр, допущених до значенняі визначає точність числа, що відповідає його власній величині. СтандартIEEE 754визначає ряд правил щодо того, як очікується поведінка чисел з плаваючою комою, включаючи діапазони значень та мантіси (і відповідний діапазон та точність) для кількох важливих значеньdn, так що числові обчислення можна повторити в межах деяка толерантність. Існує досить багато тонкощів у тому, як працюють номери з плаваючою комою, які я не можу сподіватись зафіксувати у цій відповіді, для гарного вступу я рекомендую«Що повинен знати кожен комп'ютерний вчений про арифметику з плаваючою комою».13dn.
Значні обсяги інтелектуальних зусиль за останні 50 років були вкладені в покращення можливостей процесора для ефективного обчислення арифметичних операцій з плаваючою комою. На сучасних процесорах ці обчислення обробляються одним або декількома одиницями з плаваючою комою (FPU), більш складною версією арифметичної логічної одиниці, призначеної для виконання арифметичних операцій на числах з плаваючою комою, і зазвичай призначені для обробки обох заданих IEEE 754 32 -розрядні номери з плаваючою комою (часто їх називають "плаваючі") та 64-бітні числа з плаваючою комою (часто називаються "подвійними"). Подібно до арифметичних логічних одиниць, одиниці з плаваючою комою часто можуть обчислювати додавання, віднімання та множення всього за кілька циклів, тоді як для ділення зазвичай потрібно трохи більше.
У більшості випадків 64-розрядні «парні точки» з плаваючою комою IEEE 754 є достатніми для чисельних обчислень, тому припустимо, що , b і c представлені як 64-бітні подвійні, і ви зацікавлені в ефективності три обчислення як скалярні операції в архітектурі Intel Nehalem з використанням підмножини інструкцій з плаваючою комою x87, тобто ви не зацікавлені в обчисленні цих операцій для циклу for або для діапазону даних, і ви не хочете використовувати векторні розширення . Інформація про затримку інструкцій збирається з відмінного набору довідкових таблиць інструкцій Agner Fog для архітектур Intel / AMD.abc
- ab
- log a cac
- c1b
1 Загальна експоненція часто реалізується з такою ідентичністю:
ab=βa⋅logβb
Де або 2, або e (у цьому випадку я використовую β = 2 ). Якщо припустити, що ви готові відкинути деяку точність результату (одиниця x87 робить свої обчислення в 80 біт точності, але цього недостатньо для певних діапазонів значень для a і b ), це обчислення можна зробити за допомогою апаратної інструкції FYL2X для обчислення t = a ⋅ log 2 b та інструкції з обладнання F2XM1 (за допомогою деякої допомоги щодо масштабування) для обчислення 2 t . Припустимо ~ 20 циклів для обробки масштабування:β2eβ=2abt=a⋅log2b2t
FYL2X + F2XM1 + ~ 20 = 80 + 51 + ~ 20 = ~ 151 цикл
2 Це може бути перетворено на два логарифми та поділ шляхом зміни базової ідентичності та не потребує перерахунку для точного результату.
2 * FYL2X + FDIV = 2 * 80 + (7-27) = 167-187 циклів
[3] Це еквівалентно поділу, що супроводжується експоненцією, тому [1] плюс FDIV, ~ 175 циклів.