CalabraMed Да, согласен. Я встретился с такими задачами когда пришёл приятель со своей кандидатской - сложность оказалась двойной - как в самой задаче, тут пришлось порыться в справочниках по вычислительным методам, так и в том, что конкретная задача оказалась очень чувствительна к сверхмалым величинам, и расчёты пришлось вести на грани аффинного нуля (виртуальный "нуль" используемый во всех современных процессорах), когда значение параметра становится меньше нижнего порога разрядной сетки ЦП. Кратко поясню что это такое.: например, у нас имеется для простоты модели 32-битный ЦП, один (обычно старший, обычно его значение "0" интерпретируется как "+", а "1" как "-") бит разрядной сетки используется для представления знака, и наш результат содержит 33 бита, а его значащие биты с 1 по 31 равны "0", в то время как значащий бит 0 равен "1", тогда и возникает состояние аффинного нуля, значение бита 32 - знакового разряда в такой ситуации можно не учитывать, поскольку "0" считает условно-беззнаковым числом. Это приводит к интересному парадоксу: мы имеем три нуля!: 1-й положительный, знаковый разряд равен "0"; 2-й отрицательный, , знаковый разряд равен "1"; истинный, математический - число имеет разрядность равную бесконечности, и все разряды равны "0", только в такой ситуации значением знакового разряда допустимо пренебречь.
Аффинный нуль и переполнение разрядной сетки это те типичные вычислительные ситуации когда многие процессоры не предназначенные для научных расчётов теряют точность. Что делает их микропрограмма (она отвечает за выполнение любой машинной команды)? В декодере команд последняя разбивается на строго упорядоченную последовательность микрокоманд - пакет из ряда параллельных!!! наборов управляющих сигналов для всех узлов процессора, его битовая размерность зависит от архитектуры конкретного ЦП, и может достигать нескольких килобит, а иногда и более (например в процессорах ЭВМ IBM S/360 ширина микрокоманды составляла 256/512 бит в зависимости от модели)). Вычислительный процессор в ситуации аффинного нуля выставит биты состояния "потеря точности" и "аффинный нуль", а не вычислительный просто вернёт нулевой результат операции.
Массовые ЦП от Intel при возникновении ситуации аффинного нуля возвращают только нулевой результат, не выставляя флаги "потеря точности" и "аффинный нуль", а ЦП AMD (Athlon XP/Athlon MP/AMD 64/Opteron), NEC, SUN (Sparc), DEC (Alpha AXP), MIPS (MIPS R8x000/1x000), IBM (Power, но не PowerPC!) - обработают данную ситуацию правильно - выставят состояние "аффинного нуля". Поэтому, мы и можем утверждать о их разном предназначении. Единственным ЦП от Intel который правильно обработает ситуацию "аффинного нуля" на сегодня можно считать только Itanium 2 - он выставляет флаги состояния правильно. В линейке процессоров HP PA-RISC только старшие модели серии 8ххх предназначены для научных расчётов, и выставляют флаги правильно. Обычные же процессоры в такой ситуации в зависимости от реализации микропрограммы могут выставить и флаг "переполнение". Примерно подобная ситуация возникает и при переполнении разрядной сетки, когда результат выходит за её пределы: научные процессоры выставят флаги: "переполнение", "потеря точности", "выход за границу разрядной сетки" и в зависимости от реализованной микропрограммы при обработке такой ситуации либо передадут по специальной команде число в виде двух частей старшей, содержащей разряды переполнения, и младшей содержащей те биты, что не вышли за пределы разрядной сетки, либо вернут только младшую часть, но всегда выставят правильно биты состояния. Обычные же процессоры выставят только бит "переполнение" и возвращаемый результат будет содержать либо все "1" во всех битах (чаще всего), либо младшие биты результата, или иногда непредсказуемое значение. Но в любом случае возвращаемый результат будет не действителен. Для массовых ЦП Intel всех серий (i4004/i8008/i8080/i808x/i80x86/iPentiun xxx/iCore xxx/iXeon xxx) при переполнении разрядной сетки или возникновении аффинного нуля результат будет не действителен. Для научных ЦП ЦП AMD (Athlon XP/AMD 64/Opteron), NEC, SUN (Sparc), DEC (Alpha AXP), MIPS (MIPS R8x000/1x000), IBM (Power, но не PowerPC!) результат будет действителен в пределах их спецификаций, и поддаваться правильной интерпретации.
Именно с различием в механизмах обработки крайних граничных значений в разных типах ЦП и связана их пригодность для разных задач. Офисные задачи (работа с текстом, связь, простые расчёты, многие финансовые вычисления) в основном содержат команды для работы с целыми числами, а самое важное их результат никогда не вызывает ни переполнения, ни возникновения аффинного нуля, а немногочисленные операции с дробными (вещественными, с плавающей запятой) числами также не вызывают подобных эффектов. В научных расчётах мы встречаем противоположную ситуацию. И потому нам нужны механизмы для компенсации побочного действия обоих граничных эффектов (аффинного нуля и переполнения разрядной сетки). При использовании для таких задач не научных процессоров мы получим с высокой степенью вероятности не предсказуемый и не верный результат, а научные (их часто называют вычислительными) процессоры в случае ошибки в расчётах дадут приближённый результат, но но его точность (т.е. степень приближения полученного к реальному значению результата) легко может быть увеличена путём проведения нескольких последовательных итераций.
Вот тут мы и выходим на второй класс задач: промежуточные задачи - 2D графика, не сложные математические расчёты с невысокой точностью, простые задачи имитационного моделирования, финансовые расчёты, игры, базы данных, допечатная подготовка (DTP), Web-разработка, но только при условии что промежуточные результаты находятся в диапазоне выше аффинного нуля и ниже переполнения для значащих разрядов числа. Для них мы можем использовать любые процессоры, но с учётом известных нам ограничений по точности и диапазону границ значений результатов. Только при соблюдении этих условий мы получим действительные результаты.
Третий класс задач, научные и сложные расчёты с высокой точностью: 3D/nD моделирование (многомерные модели), системы автоматизированного проектирования (CAD/CAM), разработка программного обеспечения, имитационное моделирование, 3D графика высокой точности, задачи аэро-/газо-/гидродинамики, физической химии, теории электромагнитного поля, теоретической физики и им подобные. Характерной особенностью подобных задач является не столько сложность и объёмность расчётов, сколько работа вычислительного узла на границах диапазона точности как с низу, со стороны "нуля", так и сверху, со стороны "переполнения". Для них нам потребуются именно научные процессоры, и обычные, целочисленные процессоры не подойдут не в следствии "высокой/низкой" производительности, а по причинам связанным с их внутренней микроархитектурой, точнее с их основным рассчётным узлом Арифметико-Логическим Устройством (АЛУ, ALU) - в обычных процессорах битовая разрядность АЛУ равна или кратна разрядности разрядности операндов, и если мы например будем умножать два числа разрядностью N, то результат будет иметь разрядность M=2N. И тут то, как будет осуществляться обработка (не алгоритм, а его временная реализация в виде временных тактов процессора, где каждый такт строго соответствует одному минимальному и неделимому временному отсчёту работы процессора) определяется его конструктором и начальным Техническим Заданием (ТЗ). Неизменным останется одно: соотношение M/N=x, где х=1,2,3,...n, но всегда целое число.
В научном процессоре АЛУ строиться по иной архитектурной схеме: K=x*(N+y), где x=1,2,3,...n, целое число, а y={1 <= y <= N}, где y - это резервные биты АЛУ предназначенные для компенсации возможного выхода промежуточного результата за пределы разрядной сетки. И после выполнения любой арифметической операции научные процессоры проверяют возможность того, что результат операции не поместился в пределы разрядной сетки, и его старшие биты вышли в резервную часть. Остальные действия в данном случае просты: выставляем флаги исключений, и в зависимости от микропрограммы либо осуществим округление с переводом, если вычисления велись с целыми числами их в форму с плавающей точкой, либо осуществляют округление выставляя максимальное значение разрядной сетки и биты "переполнение", "округление", "превышение диапазона разрядной сетки" оставляя результат в той форме в какой это задано форматом машинной команды. Именно с этими особенностями архитектуры АЛУ и связаны принципиальные различия этих классов ЦП.
Вот тут возникает и четвёртый тип задач: обработка потоковых данных, например аудио/видео потоков, или иначе, простые векторные задачи. Они очень интересны именно с точки зрения своих особенностей: 1) эти задачи могут при обработке вызывать выход результатов за границы диапазона разрядности АЛУ, но они к нему значительно менее чувствительны чем другие типы расчётных задач. Это связанно с эффектом инерционности нашего зрения - если мы получим случайную цветовую ошибку длительностью меньшей чем примерно 1/1000 секунды, то в следствии инерционности зрения она останется не замеченной. Подобной особенностью обладает и наш слух, но там пороговый интервал значительно короче, порядка 1/100000 секунды. Именно это позволяет нам использовать очень эффективный механизм векторной обработки: мы имеем несколько однотипных по структуре потоков данных, но один поток инструкций (команд), т.н. архитектуру ОКМД (SIMD, одиночный команд/множественный данных, Single Instructions/Multiply Data). Она исходит из предположений, что: 1) потоки данных однотипны; 2) результат расчётов не выйдет за пределы разрядной сетки; 3) данные можно обрабатывать либо последовательно побитно, либо побитно-параллельно группами от младших разрядов к старшим; 4) допустимо наличие случайных ошибок потери точности маскируемых инерционностью обрабатываемого потока. Задачи аудио/видео обработки этим условия удовлетворяют, и их можно обрабатывать используя SIMD архитектуру. Другое дело, если мы попробуем использовать её в научных расчётах. Там, поскольку условия 1) - 4) не удовлетворяются либо полностью, либо частично это решение абсолютно не применимо. Как альтернативу можно рассмотреть архитектуру MIMD (Multiply Instructions/Multiply Data), но во первых она отличается сложностью реализации, во вторых применима не ко всем классам задач, в третьих требует значительного усложнения операционной системы и программного обеспечения. Поэтому, в массовых решениях она не применяется, несмотря на то, что теоретически способна обеспечить высокую скорость обработки при высокой точности вычислений.
Для сложных векторных задач которые могут возникнуть например в аэро/газо/гидродинамике значительное ускорение по времени обработки можно получить именно на специализированных MIMD векторных вычислительных структурах, но чаще всего такие системы строятся не как самостоятельные системы, а как специализированные векторные ускорители для систем общего назначения, например отечественная система
ПС-3000 применявшаяся в качестве векторного ускорителя в некоторых проектах на базе многопроцессорного вычислительного комплекса (МВК)
Эльбрус-2, но данные решения нашли большее применение в современных супер ЭВМ:
Atlas, Cray X1E, Cray XT5 и им подобные комплексы. Они содержат тысячи ЦП каждый из которых работая под управлением собственной операционной системы (ОС) входит в общую структуру как функциональная ячейка, но сложность программирования и стоимость этих систем такова, что например в России таких систем на которые бы попали в список TOP500, да ещё в его наиболее престижную часть TOP50 самых производительных вычислительных установок планеты на данный момент нет...
Имея перед собой определения классов задач и типов процессоров попробуем более точно оценить их применимость по параметрам: внутренняя разрядность АЛУ, реакция на ситуацию возможной потери точности, работа с вещественными (формат с плавающей запятой) данными, поскольку что нужно для большинства офисных и многих домашних задач нам уже ясно: подойдёт любой ЦП, лишь бы он отвечал условиям производительность не менее пороговой для данной задачи, но желательно с запасом в 10% - 15%, и при этом не слишком сильно греющийся, а так же совместимый с максимально широким спектром наборов системной логики и микросхем памяти при минимальной собственной цене. Для научно-инженерных задач обычные универсальные ЦП не подойдут по причинам рассмотренным нами выше, но общие требования и к ним такие же! Максимальная совместимость с микросхемами системной логики, памяти, минимальное энергопотребление, производительность соответствующая решаемой задаче и минимальная цена. Всё. Что толку в покупке супер-пупер процессора если его нельзя использовать на всю мощность? Печка для яичницы? Да её вроде на костре/газу/электроплитке (нужное подчеркнуть) жарить можно... А если мы купим процессор который нам вроде подходит по производительности, совместимости, тепловым параметрам и цене, но не предназначен для решаемого нами основного класса задач? Опять те же грабли.
Например процессоры AMD Duron/Athlon K7/K75, Intel Pentium/Xeon всех марок, VIA C1 - C7, Transmeta Crusoe это именно универсальные процессоры общего назначения, они имеют АЛУ разрядность 32/64 бита, в научных задачах они не применимы, что бы нам не говорили маркетологи - проведённый нами анализ сразу покажет нам, что именно произойдёт при выходе результатов операции за пределы разрядной сетки. Иное дело процессоры AMD Athlon XP/MP/AMD 64/Opteron во первых они используют АЛУ разрядностью 36/72 бита, а во вторых, при возникновении ситуации с потерей точности 1) их поведение чётко регламентировано; 2) результат будет правильно интерпретирован в зависимости от того какими операндами мы пользовались и исполняемой операции: при переполнении эти процессоры сохраняют в своих регистрах два результата: полный, в диапазоне внутреннего представления АЛУ и округлённый в соответствии с обработанной командой, и естественно выставляют все нужные в такой ситуации флаги.
Другое дело, что ОС и прикладные программы часто их игнорируют, но это проблема программная, а не аппаратная, и она может быть решена при необходимости средствами языков программирования.
Вот теперь мы можем для себя дать ответ и на самый интересный для нас вопрос: что такое архитектура Intel Core/Core 2 с точки зрения вычислительной структуры?
Анализ "открытой" архитектуры Intel нам ничего не даст! Мы не знаем самого главного: разрядность применяемых ALU - это строжайшая "производственная тайна" - ни на на сайте производителя, как и в его технической документации этих данных нам не дадут, но за очень приличные деньги (не знаю как насчёт новейших, но по старым моделям инженерное описание с подробностями микроархитектуры моделей до Intel Pentium включительно нам продали по "смехотворной" цене - от $86000 за книжку из десятка страниц общих характеристик, правда внутренняя разрядность АЛУ там была указана как условная(?) экстраполированная величина, а на "старшие" модели от Pentium MMX и новее в предоставлении данных подробностей на вообще отказали, но устно сказали, что ключевые вычислительные узлы архитектурно не изменились). Приходится либо верить Intel "на слово", или производить свой анализ. Иного выбора у нас нет - реальная документация - это материалы закрытые как для публики, так и для специалистов. А раз так, то встаёт вопрос - "А что там скрывать?". Оказывается многое! Например архитектура блока плавающей точки (FPU) - она не менялась со времени появления i486/i487 (1989 год), и появление SIMD блока для операций с плавающей точкой (SSE) как раз и вызвано слабостью данного блока, хоть их и включили два параллельно (реально в FPU четыре конвейера) - при отключении блока SSE "чистая" производительность FPU значительно падает по сравнению с заявленной, а это означает, что все вычисления с плавающей точкой осуществляются как раз в блоке SSE, правда этот факт и не особо скрывают - слишком легко проверить производительность связки и отдельно FPU. Но нам известно и то, что блок SSE имеет ограничение по точности обработки, а следовательно, если использовать такой ЦП для точных расчётов, то это ограничение обязательно проявится. Поэтому, я и берусь утверждать "столь категорично" - "ЦП Intel - годятся только для офиса, развлечений да игрушек. Для серьёзной работы они не рассчитаны!". И в довершение пара слов об отличиях Intel Xeon от других ЦП Intel - по большому счёту все их отличия кроются в наличии дополнительных средств контроля работоспособности, температуры, ошибок и загрузки ЦП, а так же наличии более ёмких кэшей, что для одиночных ЦП позволяет получить +5% - +10% производительности, а в многопроцессорных системах слегка сгладить влияние недостаточной пропускной способности используемой во всех решениях Intel архитектуры "Общая шина". Данная проблема была выявлена ещё во времена первых Intel Xeon, и не решена до настоящего времени, т.к. для применяемой архитектуры "общая шина" решения данной проблемы простого не существует - можно поднимать тактовую частоту шины до частоты ядра ЦП и выше, но проблему её разделения между несколькими абонентами на одном канале связи, возрастающей по мере увеличения увеличения их числа, теоретически решить простыми методами нельзя. Повышение частоты шины приводит к её чувствительности к помехам и наводкам, а так же к длине самих проводов и их радиочастотным параметрам, а все резервы роста частот сегодня практически полностью выбраны, и остаётся только один вход - смена архитектурной модели на модель "Точка-Точка" как используемая AMD. Вот к этому Intel и движется, медленно, но верно - у неё нет иного выбора...
А вот процессоры-конкуренты строились по иной архитектуре, главное для других задач. Первые Athlon K7/K75 это обычные универсальные ЦП с не плохим блоком FPU, но его АЛУ имело разрядность 36 бит сразу, поскольку именно в АЛУ осуществлялись все операции адресной арифметики, а исключительно удачная структура блока FPU была скопирована с процессора DEC Alpha AXP 2164A в разработке которого AMD принимала непосредственное участие. Эта архитектура просуществовала до того момента когда К. Баррет от имени Intel заявил, что они купили права на процессорную архитектуру DEC Alpha AXP и объявляют её ".... Технической ошибкой, недоразумением, вчерашним и даже позавчерашним днём техники...", но Intel смогла купить только права на архитектуру EV6/EV7, её они "схоронили" - у них "разрабатывался" на целиком её вычислительной основе (в своё время Intel производила чипы EV6) Itanium, а вот более старшие решения до EV8/EV9 ей купить не удалось - они разошлись по иным владельцам. У AMD в тот момент была действующая лицензия как на шину Alpha EV6, та и что не менее важно на саму архитектуру EV7/EV8, а у Intel было "на руках" судебное решение о том, что она имеет право использовать без лицензионных отчислений и процедуры патентной защиты любые разработки AMD действительное кажется до 2010 года, и что самое главное по данному решению AMD обязана сама отдавать Intel все свои новейшие разработки! Это результат скандала вокруг процессоров 486DX когда Intel через суд добилась права получать всю научно-техническую, технологическую и патентную документацию AMD в качестве компенсации заявленной суммы "морального ущерба" оцененного всего в 800 миллиардов долларов. От разорения AMD тогда спасло вмешательство DEC, IBM и Пентагона, который от имени Правительства США обратился в антимонопольное ведомство США с жалобой против Intel и её руководству велели поумерить свои аппетиты в плане полного уничтожения конкурента. Но, если с IBM и Пентагоном Intel не справится то DEC она отомстила сполна используя серию судебных исков я якобы от имени частных лиц, нас (я тогда работал в DEC) обвинили в нарушении ограничений установленных в 50-х годах КОКОМ (контора по контролю за экспортом из США, жутко бредовая структура) и сожрали, а разработанную DEC Alpha AXP "схоронила" Intel... Дальше насколько мне это известно Intel не только использовала все наработки AMD не вкладывая в это ничего, но и активно, ползуяс судебным вердиктом патентовал любые потенциально перспективные разработки AMD на себя. Как сейчас это происходит, я не знаю, на пару лет назад ситуация ещё не менялась.