Transcript Document
Расширение языков
параллельного программирования
для многопроцессорных и
распределенных систем
Гузев Вадим Борисович, [email protected]
2009
Цель работы
Разработка синтактико-семантической
модели (специального исчисления),
расширяющей семейство объектноориентированных языков программирования.
Программная реализация модели на примере
языка Parallel C#, расширяющего язык C#.
Проведение экспериментальных
исследований на
кластерных/многопроцессорных установках.
2
Структура доклада
Формальный базис для языка Parallel C#
(«||-исчисление»)
Практическая составляющая: реализация
языка Parallel C#
3
5 дополнительных базовых
конструкций к объектноориентированным языкам
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
Логика развития
языков программирования
Объектноориентированный язык
программирования
Асинхронный
параллельный язык
программирования
+
+
Асинхронные методы
Перемещаемые методы
+
+
Связки
Автоматическая генерация
прокси-функций
+
+
Функциональные типы /
функции высшего порядка
Распределенная система
исполнения
Распределенный
параллельный язык
программирования
+
Локальная система
исполнения
6
And here comes ||-calculus…
||-исчисление – модификация формального
исчисления для языка MC# 2.0 [Y.Serdyuk, “A
formal basis for the MC# programming
language”]. Основные отличия:
Отправка сообщений => вызовы методов
Каналы => асинхронные методы
Хендлеры => синхронные методы
7
Обозначения
TODO:
8
Грамматика
TODO:
9
Распределенная абстрактная
химическая машина
В абстрактных химических машинах можно выделить два вида
вычислительных правил:
Правила редукции (обозначаются оператором ‘→’) описывают
фактические «химические» взаимодействия между молекулами.
Данный вид реакции необратим, если нет соответствующего
обратного правила редукции.
Правила разогрева (heating steps, обозначаются оператором ‘⇀’)
описывают, как молекула взаимодействует с химическим решением.
Шаги разогрева всегда можно отменить с помощью соответствующих
правил охлаждения (cooling steps, обозначаются оператором ‘⇁’).
Часто эти виды правил совмещают – в этом случае используется
оператор ‘⇌’.
10
Распределенная химическая
машина ||-исчисления
11
Распределенная химическая
машина ||-исчисления
12
Пример редукции процесса
13
Пример редукции процесса
на языке Parallel C#:
Данный пример многошаговой редукции равносилен выполнению
следующей программы на языке 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);
}
}
14
Сравнение различных типов
методов
Синхронный метод
Асинхронный метод
Перемещаемый метод
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
15
Связки
Связки – средство синхронизации потоков вычисления
Связка срабатывает только тогда, когда все методы объявленные в
связке были вызваны! В данном примере для срабатывания связки
должны быть вызваны методы Get(), c1() и c2()
16
Функциональные типы
объектов
Предположим, что у нас есть некоторая функция:
long fun( int x ) {
return x * x;
}
В Parallel C# мы можем передать её в другую функцию (в т.ч. перемещаемую):
movable fun2( (int) => long fun ) {
Console.WriteLine( fun( 2 ) );
}
…
fun2( fun );
Мы можем присвоить её переменной и потом её вызвать:
(int) => long myfun = fun;
Console.WriteLine( myfun( 2 ) );
fun2( myfun );
17
Автоматическая генерация
прокси-функций
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
}
18
Реализация
File1.pcs
...
File2.pcs
FileN.pcs
.Net библиотеки
C# файлы
AST дерево (Parallel C#)
AST дерево (C#)
Код C#
Distributed Language
Runtime
+
.Net сборки (.dll, .exe)
= Выполнение программы
19
Реализация
На данный момент на сайте проекта доступны два вида систем
исполнения:
Parallel C# Many Core Edition – система программирования,
позволяющая компилировать и исполнять программы,
написанные на языке программирования Parallel C# в
локальном режиме (в т.ч. на SMP-машинах). На данный
момент существует версия для Windows, которая
предназначена для написания и отладки параллельных
программ на локальных машинах программистов.
Parallel C# Cluster Edition – система программирования,
позволяющая компилировать и исполнять программы,
написанные на языке программирования Parallel C# на
Linux-кластерах.
20
Примеры: перемножение
матриц
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; }
}
21
Примеры: перемножение
матриц
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
22
Примеры: поиск вхождений
слов в текст
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] );
}
}
23
Примеры: поиск вхождений
слов в текст
800
700
Time (seconds)
600
500
400
300
200
100
0
1
2
4
8
16
32
Num ber of processors
Поиск 32 слов в тексте размером 64 Mb на
разных количествах процессоров
24
Особенности синтаксиса MC#
Синтаксис 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 и нужно
всегда создавать инстансы объектов
Хендлеры и каналы имеют разный синтаксис
заголовков, что только путает программиста, хотя это в
принципе одно и то же (канал – это асинхронный
хендлер, не возвращающий значений)
Синтаксис вызова хендлеров и отправки сообщений по
каналам различен, что затрудняет понимание языка.
При вызове хендлера необходимо использовать
явное приведение типов!
25
Сравнение синтаксисов
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() );
}
}
26
Основные выводы (1/2)
Предложена
формализованная
языковая
модель
(||-исчисление), в которой впервые скомбинированы
функциональные типы/функции высшего порядка и связки
асинхронных и синхронных методов, служащих средством
синхронизации потоков. Данная модель позволяет
расширять
существующие
объектно-ориентированные
языки до языков со встроенной поддержкой параллельного
программирования (в т.ч. распределенного).
Разработаны правила трансляции новых синтаксических
конструкций в языки низшего уровня и представлена в
качестве демонстрации практическая реализация данных
правил на примере языка Parallel C# (расширение
существующего языка C#). Стоит отметить, что с помощью
данных конструкций можно легко расширить многие другие
языки программирования, например, Java, Nemerle и др.,
т.е. представленная модель рассчитана не только на один
конкретный язык программирования.
27
Основные выводы (2/2)
Разработаны компилятор и две системы исполнения для
языка Parallel C# - для многопроцессорных и кластерных
архитектур. Реализованы тестовые программы и произведены
замеры производительности этих программ на кластере,
показавших приемлемый уровень ускорения на разном числе
процессоров.
Разработанная в диссертации модель расширения
существующих языков программирования для поддержки
параллельного программирования позволяет повысить
эффективность работы программистов при написании
параллельных программ за счет компактного, удобного и
понятного синтаксиса, а также автоматической генерации кода
при трансляции в языки более низкого уровня.
28
Апробация работы
Материалы исследования базируются на тезисах докладов и
опубликованных статьях, получивших положительную оценку в
различных научных форумах/журналах:
“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
29
Основные публикации
30
Спасибо за внимание!
Более подробная информация доступна на сайте проекта:
31
Научная новизна
результатов исследования
Достоверность новизны технического решения, а также полученных результатов была
подтверждена присуждением в 2006г. автору работы награды “Best Student Paper” (лучшая
студенческая работа) от организаторов (DARPA High Productivity Computing Systems Program и
IDC) международного конкурса языков программирования HPC Challenge Award Competition
(www.hpcchallenge.org).
32