Язык Charm ++
Идеология Charm++ Charm++ - объектно-ориентированный язык программирования (расширение Си++), ориентированный на вычисления, управляемые потоком данных (data-driven computations).
Историческая справка Начало работ – конец 80-х годов в лаборатории параллельного программирования университета Illionois Urbana-Campaighn Первая открытая реализация – 1993 В годах добавлены возможности динамической балансировки и перемещаемые объекты
Сущности Charm++ «Последовательные» объекты «Распределяемые» объекты (chare) Сообщения Группы объектов Массивы объектов
Составляющие Charm++ приложения Файлы с описанием интерфейса ко всем объектам, кроме последовательных. Файлы с реализацией интерфейсов на Си ++. Компилятор Charm++ транслирует модули описания интерфейсов в код на Си++.
Модель выполнения Charm ++ приложения узел процессор
Создание объектов Charm ++ RTS mainchare chare
Распределяемые объекты Charm ++ Помимо обычных методов присутствует один или более входных (entry) методов, используемых для удаленного вызова.
«Главные» объекты (mainchare) Один или несколько типов объектов должны наследовать mainchare. Они создаются системой поддержки времени выполнения в начале выполнения программы на процессоре с номером 0.
Описание в интерфейсном модуле Один или несколько типов объектов должны наследовать mainchare. В интерфейсном модуле описание выглядит так: mainchare HelloMain { entry HelloMain(); entry void printDone(); };
Реализация Конструктор главного объекта имеет параметр по- умолчанию типа CkArgMsg*, через который передаются параметры командной строки: HelloMain(CkArgMsg* m){ delete m; mCount = atoi(m->argv[1]); }
Взаимодействие объектов Взаимодействие с объектом происходит через удаленный вызов методов. При этом параметры запаковываются и пересылаются на процессор, содержащий удаленный объект. Вызов асинхронный и без ожидания результата. прокси объект
hello.ci mainmodule Hello { readonly CProxy_HelloMain mainproxy; mainchare HelloMain { entry HelloMain(); entry void printDone(); }; chare Slave { entry Slave(); entry void hello(int); } };
hello.C #include #include "Hello.decl.h CProxy_HelloMain mainproxy; class HelloMain : public Chare{ public: HelloMain(CkArgMsg* m) { delete m; mCount = atoi(m->argv[1]); ckout << "Running " << CkNumPes() << " processors on " << CkNumNodes() << " nodes " << endl; mainproxy = thishandle; for(int i = 0; i < mCount; i ++) { CProxy_Slave proxy = CProxy_Slave::ckNew(); proxy.hello(i); } }
void printDone() { mCount --; if(mCount == 0) CkExit(); } private: int mCount; }; class Slave : public Chare { public: Slave() {} void hello(int i) { ckout << "Hello from " << i << " on " << CkMyPe() << " processor " <<endl; mainproxy.printDone(); } }; #include "Hello.def.h"
Компиляция в Charm++ CHARM=/home/posypkin/UTILS/charm-5.8/bin/charmc hello: hello.o $(CHARM) -o hello hello.o -language charm++ hello.o: hello.C $(CHARM) -c hello.C hello.C: Hello.decl.h Hello.def.h touch hello.C Hello.decl.h Hello.def.h: hello.ci $(CHARM) hello.ci