X87
x87 — это, если говорить человеческим языком (что для Лурка, конечно, моветон), сопроцессор для x86-процессоров, заточенный под FPU (Floating Point Unit), то бишь под операции с плавающей запятой. А если не говорить человеческим языком, то это исчадие ада, порожденное сумрачным гением инженеров Intel, призванное заставить программистов страдать, рыдать и биться головой об стену, бормоча проклятия на ассемблере.
Зачем, спросите вы, нужен этот ваш x87, если современные процессоры и так умеют в математику? А затем, мой юный падаван, что в стародавние времена, когда компы были большими, а дискеты — маленькими, основному процессору было не до ваших этих синусов с косинусами. Ему бы байтики туда-сюда перетасовать, а вы тут со своими иррациональными числами лезете! Вот и придумали x87 — отдельный чип, который берет на себя всю эту математическую чертовщину.
Стек, регистры и прочие радости[править]
Архитектура x87 — это отдельная песня, способная довести до нервного тика даже Шелдона Купера. Вместо привычных регистров общего назначения, тут у нас, внезапно, стек. Да-да, тот самый, который вы представляете себе в виде стопки тарелок, откуда можно взять только верхнюю. Только вместо тарелок у нас числа с плавающей запятой, а вместо рук — кривые лапки программиста, пытающегося все это дело не уронить и не перепутать.
Восемь 80-битных регистров, которые обозначаются как ST(0), ST(1), …, ST(7), образуют этот самый стек. Все операции производятся с вершиной стека (ST(0)), а результаты, как правило, тоже помещаются в ST(0). Представь себе, что тебе нужно сложить два числа. Ты загружаешь первое в ST(0), второе — тоже в ST(0) (предыдущее при этом сдвигается в ST(1)), выполняешь сложение, а результат… правильно, снова оказывается в ST(0)! И так со всеми операциями. Это как пытаться забить гвоздь микроскопом, одновременно танцуя чечетку и читая рэп.
Команды и прочие непотребства[править]
Система команд x87 — это отдельный вид извращенного удовольствия. FLD, FST, FADD, FMUL, FSUB, FDIV… Все эти акронимы, словно заклинания из неведомого языка Ктулху, способны вызвать у неподготовленного человека приступ неконтролируемого смеха (истерического, разумеется). А еще есть команды для вычисления трансцендентных функций типа FYL2X (это, если что, y * log2(x)) или FPATAN (арктангенс, чтоб вы знали). И попробуй только с первого раза запомнить, в каком порядке там аргументы передаются!
А еще x87 умеет работать с разными форматами чисел: с одинарной точностью (32 бита), двойной (64 бита) и, та-дам, расширенной (80 бит). Зачем нужны 80 бит, когда всем хватает 64, спросите вы? А затем, что Intel так захотелось! Ну и чтобы жизнь медом не казалась, очевидно же.
Совместимость, точность и прочие неприятности[править]
Несмотря на то, что x87 уже давно морально устарел, его эмуляция все еще присутствует в современных процессорах ради обратной совместимости со старым говном мамонта. Правда, эта эмуляция не всегда работает идеально, что иногда приводит к забавным (и не очень) багам. Например, результат одной и той же операции может немного отличаться на разных процессорах или даже на разных версиях ОС. Это как если бы 2 + 2 на одном калькуляторе было 4, а на другом — 3.99999997.
Кроме того, из-за своей стековой архитектуры и особенностей реализации, x87 может накапливать ошибки округления, особенно при выполнении длинных цепочек вычислений. Это, конечно, не Therac-25, но приятного мало.
Зеленая магия и x87[править]
PhysX — это, если кто не в курсе, такой себе физический движок, который изначально разрабатывался компанией Ageia, а потом был куплен зелеными и прикручен к их видеокартам. Типа, чтобы все эти взрывы, тряпки и разлетающиеся осколки выглядели «реалистично» (ну, насколько это вообще возможно в компьютерной игре). И все бы ничего, если бы не одно «но»: когда PhysX работает на CPU (то есть, когда у тебя нет видеокарты NVIDIA), он, внезапно, начинает использовать… правильно, x87!
И вот тут-то начинается самое интересное. В 2010 году некий Дэвид Кантер, эксперт по чипам, предположил, что NVIDIA специально использует устаревший x87, чтобы PhysX на CPU работал медленнее. Типа, чтобы на фоне тормозящего CPU их видеокарты с аппаратным ускорением PhysX выглядели еще круче.
Цимес ситуации в том, что современные процессоры уже давно умеют в SSE (и его последующие версии), который гораздо быстрее и эффективнее, чем x87. Использование SSE вместо x87 могло бы, по некоторым оценкам, ускорить PhysX на CPU в 2-4 раза! Но NVIDIA, почему-то, этого не делает.