Причем набор дискретных микросхем был пока старым - с малой степенью интеграции, как и в другой вычислительной технике, но быстродействие за полгода выросло почти на порядок. И дальнейший рост пока не предвиделся - мы уперлись в технологические проблемы. Да, в экспериментальных образцах делались элементы с нормами порядка десяти микрометров - а это уже начало семидесятых. Но выход годных был очень мал - процент, не более. Все из-за дефектов полупроводниковых пластин и отсутствия чистых комнат. Первую проблемы мы решали проведением десятков экспериментов по выращиванию кристаллов, а по второй пытались сделать что-то типа закрытого конвейера - там основная сложность была в установке и перемещении пластин - насколько я понимал, большие чистые комнаты и были нужны из-за того, что эти действия выполнял человек. И если его изъять из процесса, то необходимый чистый объем существенно уменьшится. Заодно нарабатывали факты для построения теории полупроводников. До этого-то действовали чуть ли не методом тыка - нанести пасту с легирующим веществом, подержать в печи десять минут и измерить электрические параметры. Нанести пасту на другой образец и подержать двадцать минут. Измерить. Увеличить содержание примеси в пасте, нанести на третий образец, подержать в печи, измерить - и так сотни раз.
А еще то же самое, но с ионными пучками - тут шли двумя путями - и легирование широким пучком через маску, и попытки рисовать узким пучком уже сами элементы. Первый способ давал обнадеживающие результаты - возможность управления разгоном ионов позволяла регулировать глубину их проникновения - а это важно даже не столько для полевых транзисторов (хотя и для них тоже - если делать скрытые каналы с высоким легированием), сколько для биполярных - высокоскоростным пуском загнать вглубь эмиттер, менее скоростным - базу, и еще менее скоростным - сформировать коллектор у самой поверхности, ну и к базе и эмиттеру пробить легированные проходы, к которым паять электроды - технологических операций много, но с биполярными по другому наверное и не получится. А вот второй способ пока не радовал - сложности с фокусировкой пучков давали слишком размытое пятно - ведь пучок состоит из положительно заряженных частиц, а они все норовят оттолкнуться друг от друга - трудно удержать их в одной упряжке. Да и долго это - вырисовывать каждый элемент каждого транзистора.
Тут, кстати, больше надежд было на рисование электронным лучом на фоторезисте и дальнейшим смывом и легированием обычным способом - с электронными пучками были те же сложности с фокусировкой, но меньший размер и заряд частиц все-таки обеспечивал узкое пятно - порядка ста нанометров - а это в тысячу раз меньше, чем наши текущие технологические нормы. Мне смутно вспоминалось, что DECовская Alpha на чуть более "толстом" техпроцессе выдавала более полутора гигагерц рабочей частоты, а интеловские Пентиумы с не к ночи будь помянутой NetBurst - и до двух с половиной гигагерц, пусть еще и с другими технологическими хитростями. Ну а нам для конвейерных числогрызов такое и надо - конвейер все-равно сбрасывать не придется, так как не будет неудачных предсказаний, а все ветвление будет выполняться с помощью отдельного вектора с битовыми масками - "выполнять или не выполнять операцию".
Проблемой были эти чертовы дефекты на пластинах. Наши исследователи, правда, пошли на хитрость - протравили пластину, чтобы выявить дефекты, дополнительно не один раз просветили ее рентгеном, и на хороших участках нарисовали по частям умножитель 52х52 вместе со всеми сдвигателями, сумматорами и регистрами - как раз для чисел с плавающей точкой двойной точности. Куски умножителя связывали между собой на той же пластине длинными дорожками, причем пластину прогоняли через цикл три раза - даже на хороших участках не все сразу получалось. Хорошо хоть легировали "холодным" способом - широкими ионными пучками по нужным участкам, а не нагревом, поэтому проводники, сделанные на предыдущих проходах, оставались в целости - только сточить электронным лучом лишнее - и можно заполнять новые куски схемы и соединять их с уже существующими. Франкенштейн.
Сейчас именно эта микросхема работала в нашем конвейерном числогрызе, правда, на частоте всего пятьдесят мегагерц - тут и длинные внутренние соединения, и входные-выходные емкости, да и умножение выполнялось кусками 8х8. Но умножение стало самой быстрой операцией этого устройства. Правда, сам способ был неповторяем - сейчас таким образом "рисовали" уже третью схему, и она все также была "ручной работой". И пытались как-то автоматизировать процесс для последовательно-параллельных схем - я предполагал, что все связи с периферией у нас будут по типу USB (RS-232 - в топку, пусть он тоже последовательный, но с кучей лишних проводов), а там быстрое преобразование из последовательного представления в параллельное и обратно очень даже не помешает. Правда, сами соединения были по типу точка-точка, безо всяких хабов и прочих наворотов, как минимум на первое время - в протоколе зарезервировали поля под адрес устройства и номер протокола, да в схемы заложили возможность ответа как минимум на протокол. Зато - соединение делали сразу же с горячим подключением - удлиненные выводы земли и питания в разъемах и входы-выходы с тремя состояниями - пока на отдельных микросхемах, чтобы не пихать в одну микросхему транзисторы с каналами разной проводимости - это ведь почти что двойное количество техпроцессов - сначала пролегируй каналы n-типа, затем - p-типа, затем - то же со стоком и истоком - каждая лишняя операция - это снижение выхода годных микросхем, а у нас и так с этим напряженка. Ничего, нам миниатюрность пока не существенна.
Впрочем, я подозревал, что эти микросхемы пойдут вовсе не на медленную периферию типа принтеров - те обойдутся и обычными, пусть и более медленными, схемами. А вот "быстрые" пойдут на сетевые карты - тут я рассчитывал, что дифференциальная передача сигналов и витая пара помогут решить проблему последней мили (да и не последней, если снизить скорость и ставить промежуточные усилители) - безо всяких там коаксиалов, модемов и прочей лабуды (эх, не видать мне ностальгии по свистящему модему). В общем, Наполеон "отдыхает".
И вот, чтобы все это хоть когда-то заработало, мы и проводили сотни экспериментов. И строили графики, пытались вывести уравнения - работы лет на десяток ... да больше ! Гораздо. Но даже с эмпирическими методами все более-менее работало, разве что каналы были пошире минимально возможных - микрометров пятьдесят, сто - у нас уже получались кристаллы, в которых дефекты на таких размерностях не играли особой роли и выход схем был процентов пятьдесят.
Собственно, уже такие схемы обеспечивали рабочие частоты до мегагерца - а это снова семидесятые годы. Ну, если только нагрузка на выход конкретных схем была не многовата - иначе приходилось снижать рабочие частоты, чтобы все емкости успели зарядиться за такт, или ставить несколько двойных элементов НЕ, чтобы выход микросхемы работал на меньшее число входов, а уж эти вспомогательные элементы доносили бы сигнал на меньшее число своих входов - например, если какой-то выход идет на шестнадцать входов следующих каскадов, ставим, например, четыре пары НЕ - и вот этот прежде нагруженный выход начинает работать уже только на четыре входа - емкости существенно уменьшаются - четыре вместо шестнадцати. А уж каждые из этих четырех элементов работают на свои четыре входа. Но такое разнесение нагрузки вносит дополнительные задержки. И это мы еще пошли на микросхемотехническую хитрость - ввели в микросхемы выходные транзисторы с длинным каналом - при ширине 50-100 микрометров его длина достигала пяти миллиметров - чтобы он мог выдавать достаточно тока для зарядки емкостей, образованных выходными ножками самой микросхемы, проводниками к соседним микросхемам и входными ножками потребителей сигнала. Попытки устанавливать несколько кристаллов на одной подложке, чтобы уменьшить длину и емкость межсоединений, я пока пресек - мы только-только отладили автоматизированную пайку проволочных переходников между кристаллом и ножками микросхемы, и заново все это отлаживать не хотелось - ведь потребуется несколько типоразмеров таких составных микросхем, а была надежда, что кристалльщики смогут выдавать слитки со все меньшим количеством дефектов и те же схемы удастся уместить на одном кристалле. Овчинка выделки не стоила.
Но и с такими широкими каналами и подобранными опытным путем параметрами легирования схемы работали. Я так вообще видел в интернете ролики, где народ дома в подвале делал вполне рабочие транзисторы - отламывали кусок от кремниевой пластины (вот она была покупная), наклеивали поперек полоску скотча шириной примерно полсантиметра - делали "маску" для затвора, опускали в плавиковую кислоту, чтобы получить на открытых поверхностях фторид кремния, затем грели в печи - проводили диффузию фтора, то есть легировали кремний в глубину - и транзистор работал ! Собственно, почти так же - на коленке - появился в моей истории и первый биполярный транзистор в конце сороковых - там он вообще состоял из кристалла германия и двух металлических иголок - американцы ведь исследовали работу диода, пытаясь найти на поверхности кристалла наилучшие точки, где будет лучше всего идти полупроводниковый эффект, ну и естественным образом подумали, что два контакта могут быть лучше чем один - вот и додвигались до того, что контакты стали настолько близкими, что между ними потек ток.
Про то, что полевые транзисторы известны еще до войны, в двадцать шестом, а в тридцать пятом был запатентован транзистор с изолированным затвором - об этом я писал ранее. И, насколько я понимаю, они "не взлетели" лишь потому, что всем требовались усилительные элементы, а в качестве усилителей эти приборы работали плохо, гораздо хуже проверенных ламп - тут и малое усиление, и нестабильность параметров. А работа в режиме ключа никого пока не интересовала, тогда как для нас - и прежде всего для меня - именно этот режим был интересен - ведь мы делали вычислительную технику.
А по биполярным у нас работал сам Олег Лосев (в РИ умер в блокадном Ленинграде в начале 1942го), который еще в двадцатых исследовал полупроводники, а перед войной приступил и к трехэлектродным схемам - глядишь, если бы он не умер в моей истории, лавры открывателя транзистора стали бы его - а потом злые языки еще говорят, что Россия и СССР не могли придумывать разные вещи, все тянули с запада - так лезли всякие уроды - либо с войной, либо просто проходимцы на теплые места - поправить свои дела. Сейчас мы вытянули Лосева к себе, а уж он подсказал, кто бы еще мог помочь по этим работам - отдали нам далеко не всех, но полтора десятка опытных советских ученых у нас по полупроводникам работали. Заодно мы уже начали выпуск светодиодов - Лосев и их исследовал, получал свечение на контактах металла с полупроводниками, только не знал как эта штука называется. А я - знал - и как они называются, и для чего их можно применять - замена в электронной технике лампочек накаливания для индикации и подсветки экономила немало энергии и трудоемкости изготовления.
На повышенную секретность новых элементов мы забили - наши агенты в Германии сообщали, что к фрицам попали некоторые образцы наших микросхем, так они попытались искать в них резисторы и конденсаторы, даже что-то нашли, но распределение легирования не проверяли - так у них это и прошло под пометкой "русские пытаются задешево въехать в рай". Думаю, еще лет пять такое продлится - "ну не могут русские что-то придумать, а если и придумают, то сделать". Мы вообще-то и не рассчитывали на глупость врага - не догадались сейчас, догадаются позднее, так что утечку любых секретов мы считали лишь вопросом времени, а результат данного инцидента был всего-лишь приятным бонусом. И так на попытках выкрасть микросхемы попалось несколько шпионов - не только немецких, но и английских, польских, румынских, американских - советские к этому времени уже поугомонились, так как мы объяснили руководству суть наших работ и причины нашего нежелания раньше времени раскрывать их широкому кругу людей - Сталин и сам понимал, что в их структурах есть шпионы, причем не только в плане "надо хоть в чем-то обвинить, чтобы публично не раскрывать истинные причины ареста", но и настоящие. Но из-за этого нам постоянно пеняли на недостаток секретности у нас - слишком много народа знало и пользовалось цифровыми схемами - "Ви жэ нэ думаете, что шпионы есть только у нас ?". Нет, мы так не думали, но и вводить повышенную секретность - значит застопорить работы. А я рассчитывал сейчас получить приличную фору в несколько лет - все-равно, пока на западе поймут что тут делается, пока сообразят полезность новой техники, пока запустят исследования, потом - производства, да еще сколько будут примеряться, проектировать, да пока все расползется в массы - мы шагнем далеко вперед, и при этом нам не придется тыкаться впотемках - мы будем делать "сразу правильно" - ведь главным консультантом буду я, который уже видел, что работает, а что нет, и что вообще может быть - тоже важный момент. Ну, насчет "сразу" - тут уж как получится, как позволят ресурсы.
Так что изготовить хоть какие-то транзисторы - это было не проблемой, проблемой было понять, что они вообще существуют и очень полезны - а такое понимание в это время было, пожалуй, только у меня. Для нас проблемой было улучшение характеристик и техпроцессов - после первых грандиозных успехов пошла долгая и кропотливая работа. Тут и борьба с металлизацией, и биполярные транзисторы, которые у нас пока получались хорошо если один из десятка. Надо было и дальше уменьшать размеры радиостанций - если полупроводниковые диоды применялись уже более года, то в качестве активных элементов у нас пока были лампы - их-то и надо было заменить биполярными транзисторами. Или полевыми - но они у нас стабильно работали только в режиме ключа, а в режимах усиления - раз на раз не приходится, хотя уже отлаживались схемы, где они используются в тракте УНЧ - усиливать радио- или промежуточные частоты они пока не могли, но и это было немалым подспорьем - по сравнению с конструкциями других радиостанций экономия составляла до трех вакуумных приборов, а с учетом больших объемов выпуска - уже десятки, а то и сотни тысяч ламп в год. Да и в ракетах уже испытывались полупроводники - снова и экономия производственных ресурсов, и облегчение конструкции ракет. Советские ученые - прежде всего "наши", но с привлечением и ученых большой земли - как раз и занимались больше разработкой теории полупроводников.
Но и то, чего мы достигли, частично перекрывало возможности машин шестидесятых, а может и первой половины семидесятых годов, так что задел был обеспечен на несколько лет вперед - можно и наукой позаниматься, и поэкспериментировать в практическом применении вычислительной техники для задач управления производствами и лабораторными исследованиями.
Вот под эти работы я и выделил еще одну ЭВМ, уже для лаборатории высоких давлений. По моим расчетам, ее должно было хватить на обслуживание пары десятков устройств - если на них выполнялись однотипные эксперименты, то программа - одна на всех, а параметров-то и надо десяток-другой - так что должно было хватить 256 байт, что были на ней установлены - еще на дискретных конденсаторах. Потом подумали и добавили еще один такой блок. Работа закипела, разве что я в самом начале подкорректировал связку с устройствами, а то экспериментаторы начали было вести к каждому устройству и датчику отдельные пучки проводов. Они и сами уже начинали понимать что "что-то тут не то", так что моя идея шины легла на благодатную почву. Ну а потом я еще раз их подправил, когда предложил использовать не параллельную, а последовательную шину, и не на потенциальных сигналах, а на токовой петле - по своему времени я помнил, что на такие сигналы в моем времени переводилось все что только можно - тут и помехоустойчивость, и скорость работы. Так что к началу мая на компьютере крутился бесконечный цикл, который опрашивал устройства, точнее - регистры их датчиков, отсылал нужные значения в регистры и на исполнительные устройства, и переходил на ту ветку команд, которая требовалась для конкретного устройства в зависимости от его текущего состояния и значений датчиков - тут главное было следить, чтобы время выполнения веток не мешало вовремя опрашивать последующие устройства, чтобы опрос до них добирался не позднее некоторой величины - эдакая реал-тайм псевдо-операционка, построенная на большом цикле.
Причем то, что этот компьютер был собран на рассыпухе, давало и свои плюсы. Так, исследователи добавили блок аппаратного умножения-деления - до этого эти операции выполнялись подпрограммами, а сам процессор был настолько "старым", что даже не имел проверки опкодов, поэтому любые подпрограммы, что исследователи брали из уже напрограммированных библиотек, требовалось проверять на наличие операций умножения и деления и заменять их на вызовы подпрограмм. В новых-то процессорах, даже если какая-то операция не была реализована аппаратно, выдавалось прерывание, так что компьютер мог сэмулировать ее программным путем - собственно, подобным образом мы в дальнейшем и обеспечивали совместимость сверху-вниз - с выпуском новых команд в новых процессорах для старых процессоров писались подпрограммы эмуляции этих команд. Да, работало медленнее, но работало. Хотя такое требовалось и нечасто - как правило библиотеки и программы компилировались под конкретные процессоры и программная эмуляция выстреливала только в случаях, когда что-то упустят при конфигурировании библиотек конкретной машины.
Тем более что в первые годы типов машин было немного, и поддерживать старые процессоры можно было сравнительно легко, к тому же с появлением специализированных вычислителей компиляция все-равно шла под конкретные конфигурации аппаратуры - в первые годы у нас практически не было кода, позволявшего автоматически определить набор вычислителей и раскидать по ним куски вычислений - эта работа выполнялась программистом. Скажем, написана программа моделирования тепловых потоков конкретного двигателя. В ней есть циклы интенсивных вычислений. И в программе они написаны из расчета работы на обычном процессоре. А тут - получат новую ЭВМ с двумя конвейерными вычислителями - и программисты меняют код - вместо циклов вставляют куски пересылки данных в векторные регистры каждого из вычислителей, затем - заполнение их регистров и запуск вычислений конкретного куска. А после - вставляют команды опроса регистров статуса этих вычислителей - отлавливают окончание работы, и затем - отправку новых кусков данных. Позднее перешли на прерывания, чтобы не тратить время основного процессора - а это снова перепрограммирование, причем уже на асинхронку, что всегда сложнее, так как требует разрисовки и отслеживания графа состояний и переходов.
Но в любом случае переход на вычислители означает, что из цикла расчета по каждому элементу делают цикл расчета по группе элементов - в данном случае - по двум группам. Причем если количество элементов в массиве не кратно размеру векторных регистров вычислителя, то добавляют обработку и такой ситуации - либо неполным заполнением регистров, когда в них отправляется меньше элементов, либо дополнением массива данных до размера, кратного размеру векторов. А если вычислителей будет, скажем, три, то этот же цикл будет переписан - он будет разбивать массивы на тройные куски и отправлять их в те три вычислителя, которые имеются в наличии - снова перепрограммирование циклов. Присутствует некоторая морока, но зато оборудование используется наиболее полно и "прямо сейчас", а не "когда все будет идеально".
В дальнейшем у нас так и шло - при появлении новых видов оборудования программирование под него сначала шло в таком ручном режиме, но постепенно выявляли закономерности, которые и перекладывались в код, все больше автоматизирующий перепрограммирование одних и тех же программ. А через некоторое время появились вычислители, способные брать данные сразу из памяти и туда же их возвращать - и снова было перепрограммирование - теперь основной код задавал в регистрах только начальные адреса векторов - с данными и с маской условий, количество элементов, а также адрес, куда надо помещать результат - и вычислитель сам все забирал, вычислял, помещал в память и выдавал прерывание "все готово". Причем адреса надо было указывать физические, а не виртуальные - первые вычислители не работали с виртуальной памятью, соответственно, и операционке надо было следить, чтобы ненароком не отсвопить эти блоки из памяти на жесткий диск - а это снова дополнительное программирование - на этот раз - закрепление участков памяти. Но это было делом будущего.
Так вот - разработчикам надоело проверять библиотеки на наличие операций умножения-деления и они добавили новый блок на отдельной плате, врезались проводами в схему, а плата первый месяц вообще лежала сверху на бумажке - для изоляции от металлического каркаса корпуса. Потом привели в более приличный вид - просверлили отверстия, прикрутили плату внутри корпуса и наконец закрыли его крышкой.
А месяц держали потому, что дорабатывали счетчик команд. В этом процессоре наращивание счетчика до следующей команды, а также обработка переходов выполнялись на том же сумматоре, что и обычные вычисления. То есть если в опкоде первый бит был нулем - это означало короткую команду длиной два байта - значит, после ее выполнения надо будет нарастить счетчик команд на два, а если один-ноль - это была длинная команда, и наращивать требовалось на три байта. Само значение инкремента - два или три - определялось логической схемкой на три элемента - тут никакой сложности не было, но затем, после того как выполнится сама команда, схема управления переключала входные шины сумматора с блока регистров общего назначения на блок системных регистров, выдавала на шину значение из регистра счетчика команд и вычисленную константу, складывала их и результат помещала обратно в регистр счетчика команд.
То есть по сути для выполнения одной команды требовалось выполнить две - ну, за исключением команд перехода - там счетчик команд складывался со смещением и результат помещался в счетчик команд. Работа шла почти в два раза медленнее. Вот это узкое место и расшили добавлением отдельного сумматора - теперь выполнение операций в АЛУ и вычисление адреса следующей команды шло параллельно - обработка команд АЛУ и загрузка-выгрузка регистров ускорились в два раза, а выполнение программ - минимум в полтора - все-таки некоторое количество команд было переходами. Загрузка-выгрузка также ускорились потому что теперь для инкремента счетчика команд не требовалась шина РОН-АЛУ, тогда как ранее сначала по ней шли данные в или из регистров, и только затем - вычисление адреса следующей команды. Причем этот сумматор использовался из той же схемы, что и новый блок умножения-деления - его и делали-то на сдвиговом регистре и на том самом сумматоре - если в очередном разряде множителя стоит единица - множимое и сдвинутый множитель суммируются, а если ноль - множитель просто сдвигается - мы такие схемки, помнится, рисовали в институте на третьем курсе. Работало почти так же, как и в программной реализации умножения, выигрыш был в отсутствии затрат времени на дешифрацию команд сдвига, проверки бита на ноль, суммирования с переполнением, проверки на ноль всего множителя и перехода в начало цикла, если он не ноль - все это делалось теперь аппаратно и скорость умножения многократно возросла даже при отсутствии матричного умножения. Да и деление стало работать тоже быстрее. Вот на этом сумматоре и сделали программный счетчик - при этом если выполнялась операция умножения или деления, то выигрыша от такого переноса не было, но сами эти операции были медленными, так что не страшно. А вот для остальных операций вычисление адреса и выполнялось параллельно с самой операцией.