Начну с цитаты: "Чем занимается компания Microsoft? Она старается работать с перспективными технологиями и выходить на рынки в нужный момент, когда технология становится понятной. Microsoft упаковывает технологии в программные продукты и доносит их до сотен миллионов пользователей. Мы очень заинтересованы в рынке высокопроизводительных вычислений". Это сказал Кирилл Фаенов, руководитель группы High Performance Computing, которая была открыта в Microsoft в начале этого года для разработки систем высокопроизводительных вычислений, в частности, кластеров высокопроизводительных вычислений на базе Windows Server 2003.

Почему в Microsoft всерьез занялись этим направлением, как Microsoft собирается развивать это направление, какие в первой версии нового продукта будут архитектурные и технические особенности, какие будут использоваться технологии - об этом Кирилл пообещал рассказать в своем докладе.

Проблема высокопроизводительных вычислений в принципе неисчерпаема, и Кирилл отметил, что данные, представленные на Слайдах, уже несколько устарели. На сегодня ситуация такова, что за одну неделю, например, полностью проанализировать аэродинамику строящегося самолета на самом мощном суперкомпьютере не получается. И очевидно, что развитие высокопроизводительных вычислений будет продолжаться.

Почему специалисты Microsoft занялась этим? Традиционно данная область называлась "рынком размером в ноль миллиардов долларов". Потому что проблемы гигантские, они исключительно "длинные" - протяженные во времени, но, с другой стороны, эти решения поддерживаются только ограниченным количеством лабораторий и, в основном, за счет финансирования государственных учреждений. Иными словами, большого рынка для того, чтобы окупить гигантские вложения, необходимые для развития проблем высокопроизводительных вычислений, не было. Полтора десятка лет тому назад произошло нечто, казалось бы, фатальное, но, в конце концов, оказавшееся очень полезным: в конце 90-х годов после окончания холодной войны финансирование государственных проектов разработки суперкомпьютеров в Америке почти прекратилось, поскольку необходимость в моделировании ядерного оружия стала гораздо меньше.

И это "смыло" с рынка практически все компании, создающие суперкомпьютеры. Практически единственной компанией на рынке осталась Tera, которая позднее была переименована в Cray. Но что интересно: в 1995 году начались разработки по замене суперкомпьютеров сетями из обыкновенных серверов (так называемая программа Beowulf). Что произошло в итоге, показано на Слайде 1.

На графике справа представлены последние данные, которые дважды в год рассчитываются для 500 самых быстрых суперкомпьютеров в мире. Видно, что с начала 2000 года количество кластеров растет экспоненциально, их уже более 300 в списке 500 самых быстрых суперкомпьютеров в мире. В Microsoft полагают, что через пару лет в списке не останется ни одного, или, быть может, останется один-два специально созданных суперкомпьютера, а все остальные позиции займут кластеры из обычных серверов. И еще важный момент: использование самых быстрых компьютеров, суперкомпьютеров, повсеместно растет. Суперкомпьютеры начинают выходить из рамок государственных учреждений и оказывать влияние на промышленность.

За 15 лет наблюдений была выявлена следующая тенденция: сегодняшний самый быстрый суперкомпьютер через 5-10 лет оказывается в списке 500 самых быстрых, а еще через 5-10 лет такая же скорость оказывается доступной обычному потребителю или, по крайней мере, потребителю, которому это нужно для инженерных или исследовательских работ. Другими словами, каждые 5-10 лет скорость будет увеличиваться, причем быстрее, чем скорость просто одиночных процессоров. Происходит это из-за того, что здесь мы имеем дело с системами, состыкованными из узлов многопроцессорных систем. Развитие скорости этих систем происходит гораздо быстрее, чем даже предусматривает закон Мура.

Реально существует три тенденции, благодаря которым высокопроизводительные системы начинают внедряться в промышленность. Это увеличение скорости и снижение цены стандартного оборудования (64-разрядные процессоры, гигабитный Internet, совершенствование графических процессоров и т.д.), это появление стандартных приложений для расчета большинства инженерных и научных задач, и третья тенденция - стандартизация установки и управление этими системами. Сегодня более или менее понятно, как правильно устанавливать высокопроизводительные системы и как их собирать.

Кирилл Фаенов подчеркнул, что Microsoft очень заинтересована в развитии рынка высокопроизводительных вычислений.

Второй аспект, который изменяет путь развития высокопроизводительных систем, заключается в том, что за последние 10-20 лет основные усилия были направлены на создание новых моделей и их расчет. Например, моделей климатических изменений, моделей конструирования автомобилей и самой главной задачей считалось создание как можно более быстрого компьютера для максимально быстрого расчета модели. На самом же деле эта задача, хотя и одна из самых сложных, является только частью более общей проблемы. Во-первых, сегодня растет важность не только собственно моделирования, но и обработки данных, которые получают в процессе эксперимента. Большая часть данных собирается с помощью лабораторных исследований, например, в биологии и фармакологии, а не с помощью моделирования. В обоих случаях - физического и компьютерного моделирования - накапливаются гигантские базы данных, которые нужно обрабатывать, извлекать из них полезную информацию, создавать гипотезы, которые потом проверяются. Иными словами, становится важна не столько скорость самого расчета, а скорость, с которой исследователи и инженеры могут (1) провести расчет, (2) понять, как это отражается - сходится или не сходится - с их представлениями о том, что они воссоздают, (3) изменить и (4) повторить расчет еще раз. И вот та скорость, с которой можно замкнуть этот круг, и есть самое главное, а не просто скорость собственно расчета.

И третий интересный момент. Если представить себе, что количество моделей, количество программ, которые исполняются в реальном времени, теперь распылены по организации или даже вне организации, очевидный следующий шаг - попытаться связать их в более сложные системы. Например, сканируются двухмерные снимки человеческого тела, потом они состыковываются, из них строится трехмерная пространственная модель сердца, например, затем просчитывается поверхность сердца, измеряется скорость и качество кровотока по сосудам. Хирург может в реальном времени моделировать изменения или хирургию, которая изменяет ткани сердца, а затем снова просчитать воздействие планируемых изменений на характер течения крови.

Для того чтобы это сделать, нужно в реальном времени состыковать несколько моделей. Для этого требуется решить несколько задач - не просто состыковать модели и их присутствие параллельно в разных системах, но и произвести обмен данными. Именно обмен данными проявляется как одна из самых важных задач. Сегодня все программы, которые используются в высокопроизводительных вычислениях, регистрируют результаты своей работы как хотят - кто-то пишет огромный текстовый файл, кто-то выдает собственный бинарный код и т.д. Реально состыковать программы невозможно. Для решения этой проблемы привлекается технология XML, которая уже используется сегодня для состыковки бизнес-программ, но и в данной сфере сможет принести пользу.

Теперь более подробно о том, что в Microsoft могут продемонстрировать сегодня в области высокопроизводительных вычислений и каковы перспективы развития, см. Слайд 3.

Для того чтобы построить компьютерный кластер, нужно состыковать несколько узлов. Каждый из узлов состоит обычно из пары процессоров, на сегодняшний день 32-разрядных. Появляются 64-разрядные процессоры, которые связаны между собой довольно быстрыми сетями - 100 Мбит, 1 Гбит. Эти системы отличаются скоростью передачи данных, до 10 Гбит/с, но главное - возможностью передавать информацию прямо из программы, исполняющейся на одном узле, в память программы, исполняющейся на другом узле. При этом не происходит передача данных в ядро операционной системы, чтобы она потом пересылала данные по сети. Эта технология называется RDMA (Remote Direct Memory Access). С ее помощью происходит прямой доступ в память другого компьютера. Реально это в десятки и сотни раз снижает время, необходимое для пересылки небольшого количества информации на другой компьютер, что важно для синхронизации программ. Например, если программа разбивается на несколько частей, каждая из которых выполняет свой объем работы, в какой-то момент весь процесс требуется синхронизировать.

Исключительно важно, чтобы все происходило как можно быстрее. И тут имеет значение не столько объем информации, который можно передать, не мегабиты и гигабиты, а скорость, с которой происходит синхронизация. И этому помогает технология RDMA, а значит, требуется специальная технологическая поддержка. Microsoft, используя стандартную версию Windows, активно привлекает партнеров, которые дополняют части операционной системы, чтобы из них можно было составлять кластеры.

Обычно требуются три подсистемы (по числу типов пользователей: программисты, обычные пользователи и инженеры, которые управляют созданием и эксплуатацией кластеров). Для них нужны специальные системы поддержки. Программистам необходима система, которая позволит разбить программу на несколько частей и организовать обмен информацией между ними. Интерфейс передачи сообщений (Message Passing Interface - MPI) оказался одним из самых популярных пакетов в этом роде, для Windows существовало несколько версий. Также выпускались системы распределения ресурсов в кластере и системы для установки и эксплуатации кластеров. Но их было очень много, зачастую они плохо поддерживались, и, в конце концов, Microsoft занялась и этими задачами.

Сегодня технологии высокопроизводительных вычислений Microsoft используются практически во всех сферах человеческой деятельности, включая область финансов и нефтяную промышленность, где применяется один из самых больших Windows-кластеров (более чем на 17 000 узлов). Это компании, которые производят мультфильмы или фильмы. В частности, фильм "Матрица" был сделан на кластере из 2 000 Windows-серверов.

К концу следующего года (см. Слайд 4) Microsoft планирует выпустить первую версию Windows Server 2003 HPC Edition. Основной упор в ней будет сделан не столько на инновации в области высокопроизводительных систем, сколько на дополнение имеющихся приложений Windows системами, благодаря которым станет возможным создание кластеров для существующих программ. Для прикладных систем потребуется специальное программное обеспечение, и оно уже появляется на рынке. Кроме того, предстоит максимально упростить процесс построения и эксплуатации кластеров.

Вторую версию Windows HPC планируется выпустить на рынок в начале 2007 года. Она будет значительно усовершенствована. В первую очередь, упростится разработка параллельных программ с использованием .NET. Появится возможность построения параллельных программ с помощью управляемого кода (Managed Code); будет реализован API для Managed Code; появится новая система компиляторов, которые будут поставляться как часть Visual Studio и позволят в зависимости от архитектуры процессора, на котором программа исполняется, осуществлять ее оптимизацию. Компиляторы и сегодня производят оптимизацию, но Managed Code позволит оставить в коде специальную информацию, с помощью которой можно дополнительно оптимизировать работу программы в зависимости от среды работы. Другое направление работ - использование рабочих станций, бездействующих по ночам, в виде частей кластера. И, наконец, появится возможность автоматически настраивать большие базы данных и запускать программы, производящие расчеты над данными в кластерах, или же использовать вычислительные ресурсы, расположенные максимально близко к источникам данных.

Когда речь заходит об HPC, часто не принимается во внимание, что самый главный ресурс - это не процессор и не архитектура. Самый главный ресурс - это данные и скорость, с которой их можно пересылать. Например, в Нью-Йорке у Microsoft есть много клиентов в финансовых компаниях, которые отмечают, что в Лондоне, например, у них есть масса незадействованных настольных систем, и как было бы выгодно привлечь эти системы к работе в кластере. Но если при этом придется перекачивать десятки терабайт информации по Internet - это представляется нереальным. Гораздо дешевле в этом случае купить и установить системы рядом с данными. Таким образом, место запуска расчета становится очень важным фактором и зависит от того, откуда и в каком объеме приходят данные для расчета. Этим специалисты Microsoft и собираются заниматься в процессе разработки второй версии Windows HPC.

Третья версия Windows HPC - это акцент на новых языках программирования, первая область концентрации усилий Microsoft. Сейчас это направление становится очень перспективным, поскольку создатели всех современных языков программирования в основном сфокусированы на облегчении работы с большими объектами в памяти, они не стараются упростить работу и координацию между отдельными процессорами, между отдельными частями программ. А это очень важно в параллельном и в любом асинхронном программировании, поскольку очень легко попасть в ситуацию, когда возникает остановка программы из-за того, что отдельные ее части ждут результатов друг от друга. Это одна из наиболее простых ошибок, которые существуют в распределенных системах, и возможность автоматически определить корректность таких программ становится очень перспективной областью.

Вторая область, в которой будет работать Microsoft, и об этом упоминалось на открытии конференции "Платформа 2005" - это System Definition Model (SDM). SDM - это модель описания программ, которую Microsoft собирается развивать с тем, чтобы можно было не только описывать параллельные программы, но и автоматически устанавливать их и, главное, изменять количество ресурсов, выделенных этим программам после того, как они запущены в работу. Например, запущено вычисление, которое занимает неделю. Через какое-то время понадобилось сделать еще одно вычисление, для которого приходится подвинуть первую программу. Необходимо научиться остановить программу, зафиксировать ее результат (используя, например, Virtual Server), забрать у нее часть ресурсов, продолжить, а через какое-то время вновь занять для нее больше ресурсов, если они становятся доступными. Иными словами, речь идет о возможности изменения программы и динамическом использовании ресурсов.

Третья область приложения усилий более практическая - это применение помимо обычного процессора и других процессоров, существующих в системе. Речь идет о графических процессорах, которым доступны сложные параллельные вычисления. Для каждого пиксела на экране графические процессоры просчитывают довольно сложную комбинацию плавающих чисел, и для многих вычислений вполне достаточно было бы задействовать эти возможности, чтобы параллельно рассчитывать большое количество информации. Этот ресурс сегодня никак не используется. И было бы очень актуально создать системы, программные модели и языки, которые сегодня возможны в Windows, чтобы задействовать и подогнать их для обработки графическими процессорами.

Затем Кирилл Фаенов рассказал о том, как будет выглядеть архитектура кластера (см. Слайд 5) после того, как в нее будет добавлено все то, над чем сейчас работает группа HPC. Кластер состоит из основного узла, который занимается распределением ресурсов и "знает", какие ресурсы находятся в кластере, и некоторого количества узлов. Размер кластера, на котором сейчас фокусируется Microsoft, - не более 64 узлов. Реально это тот размер, где ожидается наибольшее количество кластеров. Конечно, такой кластер не будет самым скоростным, возможно, он даже не появится в списке 500 самых быстрых систем. Но сегодня реально покупается и устанавливается в кластере от 8 до 64 узлов. На узлах и на центральном сервере будет использоваться обычная версия сервера Windows 2003. На следующий год Microsoft планирует выпустить версию для 64-разрядных процессоров.

Группа High Performance Computing также создает систему MPI. Это система для разработки параллельных программ. Она позволяет запускать части параллельных программ на узлах, выделенных для данной цели, и в ходе расчета обмениваться необходимой информацией. Также в архитектуре будет присутствовать служба под названием Node Manager, задача которой - информировать центральный узел о тех ресурсах, которые узел может представить для кластера (количество процессоров, их скорость, количество памяти). В то же время Node Manager принимает команды от центрального распределителя для запуска параллельных программ. На главном узле будет находиться версия SQL Server вида MSDE, которая в своих таблицах сохранит информацию о ресурсах, существующих в кластере, о задачах, поступающих на обработку, а с помощью команд SQL можно будет выбирать ресурсы, удовлетворяющие поступившим запросам. Появится возможность использовать кластер-сервер (это еще одна технология, которая в случае потери одного из узлов перекидывает операции на другой узел). Понятно, что эксплуатация такого кластера зависит от присутствия главного узла: если он теряется, то теряется доступ ко всему кластеру. Для повышения надежности кластера можно будет иметь вторую копию, которая в случае потери главного узла сможет его заменить. Имеющиеся на сегодня технологии копирования информации, а также возможности SQL Server уже сейчас позволяют автоматически перекидывать главный узел в случае его отказа на резервный.

В будущей архитектуре Microsoft планирует использовать технологию Active Directory для определения прав доступа к ресурсам кластера. Представим себе программу, которая запущена потребителем. Если программе нужно получить данные из сетевого файла или базы данных, то к ним можно обратиться, зная имя и пароль пользователя. Сохранить эту информацию можно либо закодировав ее и передав по сети, что небезопасно, либо воспользовавшись системой Kerberos, встроенной в AD, и просто предать нужный токен через главный узел на узел кластера и потом с помощью этого токена получать доступ к сетевым ресурсам. Две основные технологии, которые разрабатываются в группе HPC, - это центральный распределитель (Scheduler) и MPI. Все остальные работы в группе связаны с интеграцией всех компонентов в единый пакет.

Как происходит запуск задачи на кластере? Сначала выполняется резервирование ресурсов. Клиент сообщает, сколько ресурсов ему потребуется для исполнения задачи и на какое время. Например, клиент сообщает, что ему нужно 64 процессора, все они должны быть одинаковой скорости, потому что программа не поддерживает ресурсы с разной скоростью работы, и ресурсы занимаются на два дня. Ресурсы резервируются (будем полагать, что они есть в наличии и не используются) и конкретная задача передается для исполнения. Эта задача передается на один из узлов и исполняется, причем данные может передать сам пользователь, или они могут быть скопированы по сети, или поступить как часть выполнения отдельной задачи с центрального узла, или данные уже присутствуют на узле, где производится расчет задачи. В принципе эту ситуацию может описать и пользователь, когда формулирует свою задачу. Когда задача выполнена, центральный узел об этом информируется. Поскольку ресурс кластера освободился, он теперь может быть использован для чего-либо еще. Пользователь и его программа будут уведомлены об окончании операции.

На аналогичной базе можно построить выполнение многих программ. Пример: у нас есть некоторая модель и необходимо просчитать ее на различных исходных данных. Их можно задавать одни за другими на разные узлы и по очереди получать разные результаты. В этом случае говорят о последовательном выполнении работ (Serial Job Execution), т.е. используется не параллельный, а последовательный параллелизм, см. Слайд 6.

Другой вариант, когда параллельная программа должна в один и тот же момент исполняться на разных узлах. Происходит примерно то же самое, что и в предыдущем примере. Единственное, что изменяется, - вместо запуска самой программы запускается команда MPI (MPI на этих узлах уже присутствует), которая потом информирует одну из служб Node Manager о том, что нужно начать исполнение программы. Программа запускается, в тот же момент дается команда другим узлам, на этих узлах программа также запускается и т.д. Между запущенными программами устанавливается система связей и обмена - они теперь знают, как друг к другу обращаться, где они находятся, и параллельная программа продолжает исполнение. В данном случае говорят о параллельном параллелизме (MPI Job Execution), см. Слайд 7.

Каким образом клиент может описать эти задачи для центрального узла кластера? Есть три варианта. Первый вариант - через программное обеспечение, используя С++ или Фортран. Для этого пишется несколько COM- и .NET Framework-объектов, использующих Web-службы и позволяющих описывать задания в программном режиме. Либо применяется сценарий, который описывает то же самое, только без написания самостоятельной программы - просто из окна командной строки задается программа, которую нужно исполнить на узле кластера. И, наконец, можно воспользоваться Web-интерфейсом и написать Web-сценарий. С его помощью гораздо легче посмотреть, какие программы на кластере запущены в данный момент, какие ресурсы можно еще задействовать и указать программу для исполнения.

В программном режиме все делается с помощью довольно простой коллекции методов, изображенных на Слайде 8. Сначала создается Job Session. Ей передается два параметра: первый параметр - это имя самого узла, второй параметр - это описание ресурса в формате XML. Интересно, что, используя XML, можно сначала задать определенное количество параметров, например, установить, что в первой версии задается количество процессоров и время, на которое они нужны. По мере развития системы это довольно простое описание ресурсов можно дополнять новыми характеристиками. Также существуют дополнительные методы - задать саму работу; задать XML-описание работы; получить статус ее выполнения - либо она находится в очереди, либо реально используется; остановить эту работу.

В режиме командной строки поддерживаются практически такие же возможности. В автономном режиме или в режиме сценариев можно задать открытие сессии, зарезервировать ресурсы, задать работу и получить информацию о ходе ее выполнения, см. Слайд 9.

Параллельное программирование используется тогда, когда задача настолько сложная, что не укладывается в имеющиеся ресурсы - ресурсы памяти, процессорные, либо ресурсы носителя. В основном параллельные программы делятся на два типа: когда параллельно используются данные и когда параллельно используются сами инструкции. Большая часть программ на сегодняшний день - это параллелирование данных. Например, если нужно рассчитать погоду на пять дней вперед, то для того, чтобы решить эту задачу как можно быстрее, поверхность разбивается на области, каждая часть считается отдельно и потом происходит обмен информацией на границах областей, и расчет продолжается уже для всей поверхности.

Для обмена информацией между отдельными частями используется либо общая память, как это делается в SMP (и как неоднократно пытались реализовать в кластерах, используя виртуальную общую память между узлами), либо это делается с помощью Message-Passing Model. В последнем случае программа, если нужно обмениваться данными и синхронизироваться с другими, вместо того чтобы использовать локальную память, просто задействует другую команду и она обменивается данными с другими процессорами.

Message-Passing Library Specification - это стандарт, который, образно говоря, смог выиграть десятилетнюю войну за то, как должны быть написаны программы, использующие MPI. Ранее существовала практика, когда каждый производитель суперкомпьютера следовал одним спецификациям для написания программ, запускаемых на суперкомпьютерах под управлением Windows, другим - для Cray, и их было невозможно использовать на других системах. Сначала в исследовательской среде предпринимались попытки создать спецификацию, которая бы унифицировала систему разработки параллельных программ. Но поначалу ничего не вышло, потому что ни один из больших производителей суперкомпьютеров не выбрал и не поддержал ни одну из этих систем.

В 1992 году по инициативе инженеров из Аргонской лаборатории (Argonne National Laboratory) был созван MPI-форум в городе Чикаго. Было собрано несколько десятков представителей компаний, лабораторий, университетов, и был разработан стандарт, который был опубликован и получил название MPI. В течение следующих 18 месяцев он был написан полностью, см. Слайд 10.

Что представлял собой MPI? Это библиотека, которая дает программистам, пишущим на С, С++ и Фортране, набор команд, который позволяет запускать, делать несколько копий программы, устанавливать между ними синхронизацию, обмениваться данными, а также система обмена данными. Почему это так важно, почему нельзя задействовать TCP/IP, например? Во-первых, не все суперкомпьютеры поддерживают TCP/IP между своими узлами. Во-вторых, система определения адресов процессоров может оказаться разной, если программа или ее части были написаны различными авторами. Нужны также специальные операции, с помощью которых можно суммировать или рассылать данные в виде широковещательных сообщений (broadcast). На системах обмена информацией отсутствовала специальная оптимизация, которая учитывала специфику суперкомпьютеров, и нужен был совершенно новый стандарт.

Вслед за первой версией MPI появилась версия стандарта MPI, созданная Аргонской лабораторией, MPICH. Перед сотрудниками лаборатории стояла задача исследования параллельных программ и создания пакета, который мог бы использоваться коммерческими компаниями и университетами для построения кластеров.

Разработчики Microsoft пришли к заключению, что вместо того, чтобы писать собственную версию MPI, целесообразно действовать в тесном сотрудничестве с группой из Аргонской лаборатории, взять за основу вторую версию MPICH, MPICH 2, и "подогнать" ее для работы в среде Windows при сетевой поддержке, которая в Windows реализована гораздо лучше и быстрее, см. Слайд 11.

Как это будет встраиваться в Windows? На сегодня существует WinSock, который позволяет задействовать TCP/IP. Переход из пользовательского режима в режим ядра, во-первых, занимает время, а, во-вторых, проходит через оформление большого количества информации для TCP/IP, прежде чем пакет будет послан по сети. Сегодня уже используется WinSock Direct, так называемый прямой WinSock, и если существует встроенная сеть, которая поддерживает WinSock Direct, то для такого класса программ информационная поддержка транспорта TCP/IP не применяется.

Это означает, что создается блок памяти в режиме пользователя, на одном и на другом компьютере, затем он фиксируется в физической памяти - теперь уже не как виртуальный объект, и благодаря поддержке WinSock Direct по сети передается информация об имени этого блока. Теперь программа может сказать: "положите эти данные в блок ХХХ, который находится на данном узле". Что происходит? Находясь в режиме пользователя, вы "перепрыгиваете" режим ядра, и информация попадает в сетевую поддержку, а затем копируется в память программой, которая уже находится на другом узле. То же самое происходит с MPI. Microsoft сотрудничает с компаниями, которые поддерживают такие системы. Именно они будут писать доработки MPI "снизу", что позволит программам напрямую пересылать данные в режим пользователя на соседних узлах кластера.

Одна из самых больших проблем, которую предстоит решить в следующей версии Windows Server 2003 HPC, - понять, чем довольно сложная параллельная программа занимается в данный момент, что она рассчитывает, каких данных ожидает. На Слайде 11 наглядно показано, что система трассировки уже встроена в MPI - видно, как обмениваются информацией отдельные процессы. Теперь нам понятно - ждут ли они, или производят вычисления, или занимаются обменом информации. И, следовательно, видна эффективность параллельной программы, что показано на Слайде 12.

Ну и в заключение своего доклада Кирилл Фаенов предоставил слушателям сведения о том, где можно получить дополнительную информацию о кластерах и высокопроизводительных вычислениях, см. Слайд 13.

Олег Лохин - Администратор, занимается сетями на базе Windows NT c 1994 года.