pavia писал(а):
А на практике могу продемонстрировать на примере сумматора. Как сумматор работает знаете?
Для того чтобы сложить два числа. Надо сделать последовательный перенос бита. Процесс этот интерационно и идёт по всем битам.
Однако хорошо известен паралельный сумматор, который работает быстрее.
Как обычно, демонстрируете начитанность (действительно достойную уважения) без способности правильно воспринимать прочитанное. Создание параллельного сумматора действительно возможно, но только ценой роста аппаратных затрат -- причём очень большого роста.
Для не совсем понимающих, но желающих разобраться, о чём речь, привожу в пример принципиальную схему так называемой схемы (прошу прощения за тавтологию) ускоренного переноса (СУП; см. скриншот даташита внизу). Её задача -- как раз формировать сигналы промежуточных переносов сразу, без ожидания формирования предыдущих переносов во время выполнения сложения или вычитания. Подобные схемы являются необходимой частью любого многоразрядного параллельного двоичного сумматора. Как легко заметить, для формирования младшего из переносов (на схеме обозначен как Cn+x, вывод 12 микросхемы -- это схема реального чипа 74182, а соответственно, и его отечественной копии К155ИП4) достаточно трёх логических элементов -- двух двухвходовых И и одного двухвходового же ИЛИ-НЕ. Формирование следующего разряда (Cn+y, вывод 11) требует уже двух трёхвходовых И, одного двухвходового И и одного трёхвходового ИЛИ-НЕ. Третий перенос (Cn+z) требует ещё больше элементов с большим числом входов. Ну а логические элементы -- это не только площадь на кристалле и энергопотребление, но ещё и длины связей между ними (понятно, что, чем больше элементов и чем большую площадь они занимают, тем длиннее будут соединяющие их проводники). Всё это приводит к увеличению времени задержки распространения сигнала, поэтому, даже если считать, что собственно сложность не является ограничением, 64-разрядный параллельный сумматор будет существенно медленнее 4-разрядного -- хотя с точки зрения чистой логики (не учитывающей реальную физику) схемы вроде бы должны быть одинаково быстрыми. Всё это и является причиной, почему в реальной жизни полностью параллельные многоразрядные сумматоры не встречаются -- они заняли бы недопустимо большую площадь кристалла, не окупаемую повышением производительности. Сюда можно добавить технические сложности с созданием многовходовых логических элементов большого быстродействия.
В итоге в реальности используются последовательно-параллельные сумматоры. В частности, во времена, когда была создана микросхема 74182 (а за ней -- куча других подобных схем), обычной практикой было использование 4-разрядного последовательного АЛУ (выполняющего, помимо прочего, операции сложения и вычитания) совместно с подобными схемами ускоренного переноса. Одна такая СУП способна обслуживать 4 АЛУ, что в результате позволяло построить 16-разрядное последовательно-параллельное АЛУ. СУП допускают наращивание своей разрядности (выходы G и P в верхней части приведённой схемы подаются на соответствующие входы СУП более высокого "порядка"), но это тоже получается последовательно-параллельная схема, а не чисто параллельная, как одиночная СУП.
То же самое касается, например, умножения. Теоретически можно умножение выполнить чисто параллельным образом. Скажем, умножение двух 4-разрядных двоичных чисел требует выполнить сложение четырёх промежуточных произведений (по одному на каждую цифру множителя), для чего вроде бы достаточного одного 7-разрядного 4-входового сумматора. Такие схемы вполне реально создать; более того, они существуют (например, у нас выпускался 4-входовый 4-разрядный сумматор -- кажется, КР1802ИМ1; понятно, что он был содран с какой-то буржуйской микросхемы, и предназначался в первую очередь как раз для построения быстродействующих умножителей). Проблема в том, что с увеличением количества разрядов и числа входов (слагаемых) сложность такого сумматора очень быстро нарастает. Поэтому на практике многоразрядное (скажем, 32- или 64-битное) осуществляется за несколько циклов, в каждом из которых производится суммирование частных произведений с получением всё менее "частных", пока не будет получено единственное итоговое произведение. Такое суммирование можно выполнять конвейерным образом, благодаря чему при выполнении нескольких команд умножения подряд у программиста складывается впечатление, что каждая из них выполняется за один такт. Однако латентность (задержка между началом выполнения операции и получением её результата) довольно велика -- скажем, 4 такта, поэтому, если сразу за командой умножения следует другая команда, использующая результат умножения, процессор вынужден будет ждать окончания умножения. (Ну, на практике суперскалярный процессор с возможностью внеочередного выполнения инструкций попробует заняться какой-нибудь другой работой, которую выполнить уже можно, но это к теме распараллеливания умножения не относится никоим образом, да и очень усложняет сам процессор).
С делением дело обстоит ещё хуже, поэтому даже самые мощные процессоры тратят на него в несколько раз больше времени, чем на умножение.
В общем, даже на самом элементарном уровне распараллеливание, даже если возможно теоретически, на практике может оказаться неосуществимым. Однако и оно на самом деле возможно далеко не всегда. Посчитайте, например, движение какого-то тела (например, снаряда) с учётом сопротивления воздуха и всяких прочих сопутствующих факторов. Нет там готовой формулы, чтобы, получив исходные данные (геометрические характеристики тела, начальную скорость, угол и т.д.), вычислить результат (точку, угол и скорость падения). Расчёт там идёт последовательно, с тем или иным временн
ым шагом. Чем меньше шаг, тем точнее получается результат, но тем дольше идёт расчёт, поскольку увеличивается число шагов. (Да, для реальных пушек существуют готовые "формулы", однако они получены подобным итеративным путём -- просто расчёты проведены заранее, и итоговые результаты позволяют быстро получить оценку для любых разумных исходных данных, чего в реальной жизни более чем достаточно -- всё равно 100% точность стрельбы недостижима в силу факторов, которые в принципе невозможно учесть в полной мере -- например, случайные порывы ветра, колебания в начальной скорости из-за особенностей снаряда, изношенности ствола орудия и т.д. и т.п. Ну а до появления вычислительных машин, для которых баллистические расчёты стали первой практической задачей, подобные таблицы стрельбы составлялись исключительно на основе практических результатов -- расчётов там слишком много, чтобы вручную можно было составить достаточно подробные таблицы за сколько-нибудь разумное время).
Цитата:
Кэша в оригинальном понимании не будет. Это скорее будет типа официанта, который будет шустренько подносить всем свежие данные. Хотя не скрою что производительность памяти тут самое узкое место и скорость просядет. Но думаю плюс от параллельности перекроит. Надо просто посчитать и найти оптимум.
Опять демонстрируете неспособность правильно интерпретировать вроде бы имеющиеся знания. Чтобы "шустренько подносить" данные для кучи ядер из единого центрального хранилища (называть его кэшем или нет -- без разницы), а заодно забирать от ядер свежевыданные данные и помещать их в это самое хранилище, потребуется куча мультиплексоров и демультиплексоров с управляющей логикой, а заодно и куча проводников, соединяющих всё это хозяйство. Ну а скорость распространения сигнала по линиям связи -- вещь ограниченная, как и скорость переключения логики. Таким путём придёте к тому, что "логически" всё должно работать быстро, а на практике -- медленнее, чем при традиционном подходе.
Кстати говоря, ёмкость традиционного кэша 1-го уровня ограничивает не невозможность впихнуть больший объём (в конце концов, помимо маленьких кэшей 1-го уровня, на том же самом кристалле процессора присутствуют более ёмкие кэши 2-го уровня, а зачастую -- ещё и 3-го; в процах мэйнфреймов IBM, если память не изменяет, сейчас 4 уровня кэшей). Главным ограничением является как раз необходимость иметь довольно небольшие размеры и простую коммутацию, чтобы обеспечить быструю работу кэша 1-го уровня -- чтобы собственно процессорное ядро не простаивало, дожидаясь, когда там кэш разродится очередной порцией информации. Дополнительное ограничение -- тепловыделение (частые переключения транзисторов означают большую рассеиваемую в виде тепла мощность, которую нужно отводить от кристалла, что является отнюдь не тривиальной задачей для высокопроизводительных процессоров).