А как насчет попользоваться, а лучше, загрузить по полной процессор Larrabee ? (Кто вдруг не знает, что это такое, может посмотреть некоторое обсуждение здесь.) А вы задумывались по-настоящему о том, как такие машины программировать, чтобы, с одной стороны, действительно получить прирост производительности, соответствующий имеющимся ресурсам (т.е., количеству ядер), а с другой стороны, не снизить, как сейчас говорят, продуктивность в программировании, т.е., возможность писать примерно такое же количество отлаженных строк кода за единицу времени, что и раньше ?Замечу, что под термином “высокоуровневое программирование” я понимаю не программирование на языке C++ (в отличие, допустим, от “низкоуровневого” программирования на языке С), а программирование, главным образом, на байт-кодовых языках (managed languages), а среди них, в первую очередь, на языке C#. Причем я не буду сильно бороться против тезиса, что байт-кодовые языки непригодны или, даже более того, несовместимы с HPC (high-performance computations). В этом отношении, мой взгляд двоякий: во-первых, мы имеем в качестве данной такую ситуацию – имеются многоядерные машины (которые теперь уже, повторюсь, есть практически у всех ), и необходимо (опять же, уже каждому разработчику, если он хочет, чтобы его приложение выполнялось эффективно и конкурировало с аналогичными разработками) писать для них параллельные программы. Не забудем также тот аспект, что и программированию студентов нужно учить теперь тоже параллельному, причем, как можно раньше, на 1-2-х курсах.
Во-вторых, шансы побороться с утверждением, что managed-языки неприменимы для HPC, все-таки есть. Конечно, чтобы выжать максимальную производительность из приложения часто даже применения языка С недостаточно, и в этом случае переходят на ассемблерные вставки в код. (Показательным примером здесь является, скажем, программа перемножения матриц, ориентированная на процессор Cell Broadband Engine, с которой можно ознакомиться здесь.) С другой стороны, взгляните на такие оценки, очень близкие к реальным: 2-х дневный прогноз погоды по Европейской части России считается на кластере с достаточным количеством процессоров 1,5 – 2 мин., где само приложение написано на C + MPI + OpenMP (аналогичные результаты по времени получаются и для связки Fortran + MPI + OpenMP). Допустим, что мы это приложение переписали (или написали заново) на языке C# с соответствующими средствами параллелизации. Если предположить, что в последнем случае производительность приложения будет в 1,5 – 2,5 раза ниже по сравнению с первым вариантом, то, тем не менее, мы тот же 2-х дневный прогноз погоды сможем получать на тех же вычислительных ресурсах за 3 – 5 мин.
С другой стороны, существуют объективные данные, что продуктивность работы программистов на высокоуровневых языках при разработке промышленных (в том числе, параллельных и распределенных) приложений в 2-10 раз выше, чем при использовании языков уровня C++. В применении к нашему примеру, это будет означать, что если на разработку параллельного варианта прогнозного приложения на языке C (или Fortran) понадобится 6 месяцев, то на C# такой вариант будет разработан, отлажен и запущен в промышленную эксплуатацию приблизительно за 1 месяц. Понятно, что здесь кроется довольно существенная экономия реальных денег. Не забудем также про то, что такого рода приложения постоянно модифицируются и дорабатываются – понятно, что на высокоуровневых языках такая процедура будет проходить значительно быстрее, качественнее, а значит, в конечном итоге, и дешевле.
Вообщем, цель этого блога – освещение возможностей высокоуровневого параллельного программирования для современных компьютеров, и мой сегодняшний пост является введением в эту проблематику с кратким перечислением всего того, что будет в нем рассмотрено в дальнейшем.
Язык C#, фактически, неотделим от платформы .NET, и в ближайших постах мы с нее и начнем рассмотрение вопросов программирования на параллельных managed-языках. Здесь только отмечу, что платформа .NET
Framework, изначально являвшаяся разработкой фирмы Microsoft, еще шире пошла в программистские массы с появлением системы Mono (www.mono-project.com ) – свободной реализации .NET для Unix-подобных систем. В этом направлении дело дошло до того, что Mono (.NET) уже работает на игровых приставках PlayStation 3 и даже на iPhone! Сам язык C# также бурно развивается. Еще недавно мы обсуждали и продолжаем осваивать средства C# 2.0, а теперь средствами регулярного программирования становятся C# 3.0 и на подходе его следующая версия C# 4.0.
Язык C# со всевозможными расширениями на основе библиотек типа Parallel FX – это, можно сказать, инженерный подход к решению проблемы параллелизма. Существует, естественно, и научный подход к этой проблеме, суть которого состоит в разработке нового языка для параллельного программирования – недаром по научным конференциям соответствующей тематики кочует слоган “It’s time for a new language”. И тотальный переход в “параллельный мир” к этому действительно побуждает. Ученые, в свою очередь, не остаются в долгу – упомянем, например, UPC, Polyhonic C#, MC#, X10, Cilk++, Chapel, Ct и др. Хотя область языков программирования, по моему мнению, является довольно консервативной - новые, по настоящему ценные, модели программирования и соответствующие языковые средства появляются довольно редко, но в этих языках постепенно прорезываются новые интересные конструкции, которые станут базовыми средствами параллельных языков будущего. Все эти языки и некоторые другие будут обозреваться в наших постах, а то как эти языки соревнуются между собой в области HPC, можно найти на сайте www.hpcchallenge.org.
Еще одной темой наших обсуждений, когда мы говорим о программировании многоядерных процессоров, конечно же, станет библиотека Parallel FX от Microsoft, состоящая из Task Parallel Library (TPL) и Parallel LINQ (PLINQ). У Microsoft есть превосходный ресурс по этой тематике - http://msdn.microsoft.com/en-us/concurrency/default.aspx, который содержит множество отличного материала, к которому мы будем часто обращаться и который будем обсуждать в этом блоге.
Вообще, фирма Microsoft (заметим, совместно с Intel) развила бурную деятельность в области параллельных вычислений, охватывающую весь спектр компьютеров – от многоядерных машин до мощнейших суперкомпьютеров (кстати, поинтересуйтесь на каком месте в Top500 – рейтинге пятисот самых мощных суперкомпьютеров в мире, находится машина, использующая новейший продукт от Microsoft – Windows HPC Server 2008, и где эта машина конкретно установлена, и вы сильно удивитесь).
В заключение, две загадки из довольно разных областей:
1) язык Ct основан на языке C, т.е., не является байт-ориентированным; тем не менее, для него существует JIT-компилятор; для чего он нужен и чем занимается этот компилятор ?
2) НПО “Сатурн” (г. Рыбинск) в сентябре 2008 г. запустило суперкомпьютер “AЛ-100”; в ноябре это НПО обанкротилось и было национализировано (см. “Коммерсант”, 3 декабря 2008 г. ); что бы это значило :-) ?
Свои ответы, а также любые предложения, замечания и комментарии оставляйте здесь. По-моему, у нас будет достаточно тем, которые надо обсудить …
Ю.Сердюк ( info ( at ) mcsharp.net, www.mcsharp.net ).
