Transcript Document
Расширение языков параллельного программирования для многопроцессорных и распределенных систем Гузев Вадим Борисович, [email protected] 2009 Цель работы Разработка синтактико-семантической модели (специального исчисления), расширяющей семейство объектноориентированных языков программирования. Программная реализация модели на примере языка Parallel C#, расширяющего язык C#. Проведение экспериментальных исследований на кластерных/многопроцессорных установках. 2 Структура доклада Практическая составляющая: реализация языка Parallel C# Формальный базис для языка Parallel C# («||-исчисление») 3 5 дополнительных базовых конструкций к языку C# 1) 2) 3) 4) 5) Асинхронные методы Связки Функциональные типы объектов / функции высшего порядка Перемещаемые методы Автоматическая генерация проксифункций 4 Предшественники языка Parallel C# Язык Parallel C# - результат длинной цепи эволюции языков программирования: C++ π-исчисление Java (R. Milner, 1992) Join-исчисление C# (С. Fournet, G.Gonthier, 1996) T++ Polyphonic C# (N.Benton, L.Cardelli, C.Fournet, 2002) MC# Функциональные языки (ML) (2004) Parallel C# 5 Сравнение различных типов методов Синхронный метод Асинхронный метод Перемещаемый метод void fun() { // Бизнес-логика 1 } … void main() { // Бизнес-логика 2 fun(); // Бизнес-логика 3 } async fun() { // Бизнес-логика 1 } … void main() { // Бизнес-логика 2 fun(); // Бизнес-логика 3 } movable fun() { // Бизнес-логика 1 } … void main() { // Бизнес-логика 2 fun(); // Бизнес-логика 3 } Компьютер 1 Компьютер 1 Поток 1 Поток 1 Компьютер 1 Компьютер 2 Поток 1 Поток 2 fun fun Поток 2 fun 6 Связки Связки – средство синхронизации потоков вычисления Связка срабатывает только тогда, когда все методы объявленные в связке были вызваны! В данном примере для срабатывания связки должны быть вызваны методы Get(), c1() и c2() 7 Функциональные типы объектов Предположим, что у нас есть некоторая функция: long square( int x ) { return x * x; } В Parallel C# мы можем передать её в другую функцию (в т.ч. перемещаемую): movable calculateSquare( (int) => long square ) { Console.WriteLine( square( 2 ) ); } … calculateSquare( square ); Мы можем присвоить её переменной и потом её вызвать: (int) => long myfun = square; Console.WriteLine( myfun( 2 ) ); calculateSquare( square ); 8 Автоматическая генерация прокси-функций movable fun( (int) => long Square, (int) => async Result ) { // Бизнес-логика 1 long x = Square( 2 ); // Бизнес-логика 2 Result( x ); } Компьютер 1 main fun long Square( int x ) { // Бизнес-логика 3 return x * x; } int GetResult() & async Result( int x ) { return x; } Компьютер 2 Square Вызов GetResult() Result (x) void main() { // Бизнес-логика 4 fun( this.Square, this.Result ); // Бизнес-логика 5 Console.WriteLine( “Received: “ + this.GetResult() ); // Бизнес-логика 6 } 9 Реализация File1.pcs ... File2.pcs FileN.pcs .Net библиотеки C# файлы AST дерево (Parallel C#) AST дерево (C#) Код C# Distributed Language Runtime + .Net сборки (.dll, .exe) = Выполнение программы 10 Реализация На данный момент на сайте проекта доступны два вида систем исполнения (в т.ч. их исходный код): Parallel C# Many Core Edition – система программирования, позволяющая компилировать и исполнять программы, написанные на языке программирования Parallel C# в локальном режиме (в т.ч. на SMP-машинах). На данный момент существует версия для Windows, которая предназначена для написания и отладки параллельных программ на локальных машинах программистов. Parallel C# Cluster Edition – система программирования, позволяющая компилировать и исполнять программы, написанные на языке программирования Parallel C# на Linux-кластерах. 11 Примеры: перемножение матриц public async Multiply( int N, double[,] A, double[,] B, double[,] C, int from, int to, () => async stop ) { for ( int i = from; i < to; i++ ) for ( int j = 0; j < N; j++ ) for ( int k = 0; k < N; k++ ) C [i, j] += A [i, k] * B [k, j]; stop(); } … public class Program { public static void Main( string[] args ) { int N = System.Convert.ToInt32( args [0] ); double[,] A = new double [N, N], B = new double [N, N], C = new double [N, N]; ReadMatrix( A, B ); Program p = new Program(); int N2 = N / 2; p.Multiply( N, A, B, C, 0, N2, p.stop ); p.Multiply( N, A, B, C, N2, N, p.stop ); p.getStop(); p.getStop(); WriteMatrix(C); } public void getStop() & async stop() { return; } } 12 Примеры: перемножение матриц 100.00 90.00 Time (seconds) 80.00 70.00 60.00 50.00 40.00 30.00 20.00 10.00 0.00 500 600 700 800 900 1000 1100 1200 1300 1400 1500 Matrix size (N x N) C# Parallel C# Перемножение матриц на одном и двух ядрах процессора Intel Core 2 CPU 6400 @2.13GHz 13 Примеры: поиск вхождений слов в текст public class Program { static void Main( string[] args ) { Program p = new Program(); … movable Map(string fileName, string[] words, // число используемых процессоров в кластере (string[], int[]) => async Reduce) int np = CommWorld.Size; { string[] words = ReadTheWords( args [0] ); int[] counts = new int [words.Length]; int n = Math.Min( words.Length, np ); using ( FileStream file = new FileStream( fileName, int portion = words.Length / n; FileMode.Open, FileAccess.Read ) ) { // отправка порции слов на обработку TextReader tr = (TextReader) new StreamReader( file ); for( int i = 0; i < n; i++ ) { string line = tr.ReadLine(); string[] chunkOfWords = new string [portion]; while ( line != null ) { Array.Copy( words, i * portion, for ( int j = 0; j < words.Length; j++ ) chunkOfWords, 0, portion); counts[j] += Regex.Matches( line, words[j] ).Count; p.Map( args [1], chunkOfWords, p.Reduce ); line = tr.ReadLine(); } } for ( int i = 0; i < n; i++ ) } p.Pulse(); Reduce( words, counts ); PrintTheResult( p.dic ); } } Hashtable dic = new Hashtable(); … void Pulse() & async Reduce( string[] words, int[] counts ) { for ( int i = 0; i < words.Length; i++ ) dic.Add( words [i] , counts [i] ); } } 14 Примеры: поиск вхождений слов в текст 800 700 Time (seconds) 600 500 400 300 200 100 0 1 2 4 8 16 32 Num ber of processors Поиск 32 слов в тексте размером 64 Mb на разных количествах процессоров 15 Схема совершенствования языков программирования Объектноориентированный язык программирования Асинхронный параллельный язык программирования + + Асинхронные методы Перемещаемые методы + + Связки Автоматическая генерация прокси-функций + + Функциональные типы / функции высшего порядка Распределенная система исполнения Распределенный параллельный язык программирования + Локальная система исполнения 16 And here comes ||-calculus… ||-исчисление – модификация формального исчисления для языка MC# 2.0 [Y.Serdyuk, “A formal basis for the MC# programming language”]. Основные отличия: Отправка сообщений => вызовы методов Каналы => асинхронные методы Хендлеры => синхронные методы 17 Исчисления формализуются: Грамматикой (с помощью формы BNF) Описанием операционной семантики (с помощью абстрактной химической машины) 18 Грамматика (обозначения) o – имена объектов sm – синхронные методы, am – асинхронные методы, mm – перемещаемые методы s, r – имена сайтов конечный список выражений обозначается ~ как: E 19 Грамматика (1/2) 20 Грамматика (2/2) 21 Распределенная абстрактная химическая машина 22 Абстрактная химическая машина В абстрактных химических машинах можно выделить два вида вычислительных правил: Правила редукции (обозначаются оператором ‘→’) описывают фактические «химические» взаимодействия между молекулами. Данный вид реакции необратим, если нет соответствующего обратного правила редукции. Правила разогрева (heating steps, обозначаются оператором ‘⇀’) описывают, как молекула взаимодействует с химическим решением. Шаги разогрева всегда можно отменить с помощью соответствующих правил охлаждения (cooling steps, обозначаются оператором ‘⇁’). Часто эти виды правил совмещают – в этом случае используется оператор ‘⇌’. 23 Распределенная абстрактная химическая машина 24 Распределенная абстрактная химическая машина ||-исчисления (обозначения) 25 Распределенная абстрактная химическая машина ||-исчисления (1/2) 26 Распределенная абстрактная химическая машина ||-исчисления (2/2) 27 Пример редукции процесса 28 Пример редукции процесса Данный пример многошаговой редукции равносилен выполнению следующей программы на языке Parallel C#: class MyProgram { // Определение D1 movable mm( () => async am ) { am(“Hello world”); } string sm() & async am(string x) { return x; } // Определение D2 void sprint(string x) { // Просто ничего не делаем… } // Запуск процесса P void P() { mm(am); sprint(sm); } } 29 Основные выводы (1/2) Предложена формализованная языковая модель (||-исчисление), в которой впервые скомбинированы функциональные типы/функции высшего порядка и связки асинхронных и синхронных методов, служащих средством синхронизации потоков. Данная модель позволяет расширять существующие объектно-ориентированные языки до языков со встроенной поддержкой параллельного программирования (в т.ч. распределенного). Разработаны правила трансляции новых синтаксических конструкций в языки низшего уровня и представлена в качестве демонстрации практическая реализация данных правил на примере языка Parallel C# (расширение существующего языка C#). Стоит отметить, что с помощью данных конструкций можно легко расширить многие другие языки программирования, например, Java, Nemerle и др., т.е. представленная модель рассчитана не только на один конкретный язык программирования. 30 Основные выводы (2/2) Разработаны компилятор и две системы исполнения для языка Parallel C# - для многопроцессорных и кластерных архитектур. Реализованы тестовые программы и произведены замеры производительности этих программ на кластере, показавших приемлемый уровень ускорения на разном числе процессоров. Разработанная в диссертации модель расширения существующих языков программирования для поддержки параллельного программирования позволяет повысить эффективность работы программистов при написании параллельных программ за счет компактного, удобного и понятного синтаксиса, а также автоматической генерации кода при трансляции в языки более низкого уровня. 31 Апробация работы Материалы исследования базируются на тезисах докладов и опубликованных статьях, получивших положительную оценку в различных научных форумах/журналах: “C# and .NET Technologies'2003, 1st International Workshop on C# and .NET Technologies on Algorithms, Computer Grafics, Visualilization, Distributed and WEB Computing”, University of West Bohemia, Plzen, Czech Republic, 5-7 February, 2003 “Технологии Microsoft в научных исследованиях и высшем образовании”, Научнотехническая конференция по программированию, Москва, 15-17 июня, 2003 г. “Международная конференция PACT'2003”, Нижний Новгород, Россия, 15-19 сентября 2003 “XII-ой международной конференции по вычислительной механике и современным прикладным программным системам”, г. Владимир, Россия, 30 июня - 5 июля 2003 г. “II-й Белорусский космический конгресс”, 25-27 октября 2005 г., Минск “Всероссийская научная конференция "Научный сервис в сети Интернет: технологии распределенных вычислений”, г. Новороссийск, 19-24 сентября 2005 г. “Журнал “Информационные технологии” (входит в список ВАК), №4, 2008 г. “XLIV Всероссийской Конференции по Проблемам Математики, Информатики, Физики и Химии, секция “Программные Системы”, г. Москва, Российский Университет Дружбы Народов, 21-25 апреля 2008 г. “PDPTA'08 - The 2008 International Conference on Parallel and Distributed Processing Techniques and Applications”, Monte Carlo Resort, Las Vegas, Nevada, USA, July 14-17, 2008 32 Основные публикации Гузев, В.Б. Parallel C#: The usage of chords and higher-order functions in the design of parallel programming languages / В.Б. Гузев // In proceedings of PDPTA’08 – The 2008 International Conference on Parallel and Distributed Processing Techniques and Applications. – Las Vegas, Nevada, USA. – 2008. – С. 833-837. Гузев, В.Б. Использование связок и функций высшего порядка для разработки языков параллельного программирования. / В.Б. Гузев // Труды XLIV Всероссийской Конференции по Проблемам Математики, Информатики, Физики и Химии, секция "Программные Системы". – Москва: Российский Университет Дружбы Народов. – 2008. – С. 5-14. 33 Спасибо за внимание! Более подробная информация доступна на сайте проекта: 34 Сравнение синтаксисов MC# и Parallel C# Синтаксис MC#: class Program { functional movable Fun( int x, handler long (int) square, channel(long) sendResult ) { sendResult ! ( (long) square ? ( x ) ); } handler Square long( int x ) { return x * x; } handler GetResult long() & channel SendResult( long result ) { return result; } public static void Main() { Program p = new Program(); p.Fun( 2, p.Square, p.SendResult ); Console.WriteLine( p.GetResult() ); } } Т.к. в MC# отсутствует возможность определения статических перемещаемых методов, то было введено дополнительное ключевое слово functional и нужно всегда создавать инстансы объектов Хендлеры и каналы имеют разный синтаксис заголовков, что только путает программиста, хотя это в принципе одно и то же (канал – это асинхронный хендлер, не возвращающий значений) Синтаксис вызова хендлеров и отправки сообщений по каналам различен, что затрудняет понимание языка. При вызове хендлера необходимо использовать явное приведение типов! 35 Сравнение синтаксисов MC# и Parallel C# Синтаксис MC#: Синтаксис Parallel C#: class Program { functional movable Fun( int x, handler long (int) square, channel(long) sendResult ) { sendResult ! ( (long) square ? ( x ) ); } class Program { static movable Fun( int x, (int) => long square, (long) => async sendResult ) { sendResult( square( x ) ); } handler Square long( int x ) { return x * x; } handler GetResult long() & channel SendResult( long result ) { return result; } public static void Main() { Program p = new Program(); p.Fun( 2, p.Square, p.SendResult ); Console.WriteLine( p.GetResult() ); } } static long Square( int x ) { return x * x; } static long GetResult() & static async SendResult( long result ) { return result; } public static void Main() { Program.Fun( 2, Program.Square, Program.SendResult ); Console.WriteLine( p.GetResult() ); } } 36 Научная новизна результатов исследования Достоверность новизны технического решения, а также полученных результатов была подтверждена присуждением в 2006г. автору работы награды “Best Student Paper” (лучшая студенческая работа) от организаторов (DARPA High Productivity Computing Systems Program и IDC) международного конкурса языков программирования HPC Challenge Award Competition (www.hpcchallenge.org). 37