Charm++ − це об'єктно-орієнтована мова програмування, яка є надмножиною C++. Розроблена Лабораторією Паралельних Обчислень Університету Іллінойсу. Charm++ була розроблена з метою підсилення продуктивності розробників шляхом надання високорівневих абстракцій для паралельних програм. В той же час вона забезпечує хорошу продуктивність, яка покладена в основу платформ апаратного забезпечення. Програми, які написані на Charm++, діляться на керовані повідомленнями об'єкти — чари (chares), які взаємодіють між собою. Коли розробник викликає метод об'єкта, середовище виконання Charm++ відправляє до нього повідомлення. Такий об'єкт може розміщуватися в локальному або віддаленому процесорі паралельних обчислень. Повідомлення запускає на виконання код в межах чара, що забезпечує асинхронність операцій.

Charm++
Парадигма Кероване повідомленнями паралельне програмування, migratable objects, об'єктно-орієнтоване програмування
Творці Laxmikant Kale
Розробник Parallel Programming Laboratory
Мова реалізації C++, Python
Платформа Cray XC, XK, XE, XT, IBM Blue Gene L/P/Q, Infiniband, TCP, UDP, MPI
Операційна система Linux, Windows і macOS
Вебсайт charmplusplus.org

Чари можуть бути організовані як колекції (масиви чарів), в той же час, повідомлення можна відправляти індивідуально кожному чару або всій колекції одночасно.

Чари в програмі зіставляються з фізичними процесорами за допомогою адаптивного середовища виконання. Зіставлення чарів з процесорами є прозорим для розробника, що дозволяє середовищу виконання динамічно змінювати їх призначення для процесора під час виконання програми, це надає паралельним програмам такі переваги: можливість робити виміри на основі балансування навантаження, відмовостійкість, автоматичне створення точок відновлення, здатність звужувати та розширювати набір процесів для паралельної програми.

Інструменти моделювання молекулярної динаміки NAMD[en] та OpenAtom[en] реалізовані за допомогою Charm++.

Adaptive MPI (AMPI)[1] є реалізацією стандарту інтерфейсу передачі повідомлень (MPI) середовища виконання Charm++, який надає сумісність з багатьма традиційними MPI моделями програмування. AMPI інкапсулює всі MPI процеси в межах доступного для міграції потоку з користувацьким рівнем доступу, який обмежується Charm++ об'єктом. Для інтеграції кожного потоку з чаром, AMPI може автоматично визначати перевагу, використовуючи середовище виконання Charm++ з незначними змінами (або взагалі без змін) основи MPI програми.

Історія ред.

Мова Charm++ була розроблена в Лабораторії Паралельних Обчислень Університету Іллінойсу, Вені Шу (Wennie Shu) та Кевіном Немурою (Kevin Nomura) в співробітництві з Лаксімікент Кейлом (Laxmikant Kale) з Теоретичної та обчислювальної групи біофізики. . біофізика Шультена. Схожа за назвою програма CHARMM[en], пов'язана з методами класичної молекулярної динаміки, розроблена в Гарварді Карплусом, що займався дослідженнями властивостей молекул біологічних об'єктів.

Другий прототип мови з назвою Chare Kernel(2.0) був написаний Манішом Гуптою (Manish Gupta). Charm(3.0) мала суттєві зміни в проектуванні. Новий транслятор написав Nimish Shah. Реалізація Charm++ була зроблена Sanjeev Krishnan. Charm(4.0) включав в себе Charm++. Реліз був випущений в 1993. Charm(4.5) розробили Attila Gürsoy, Sanjeev Krishnan, Milind Bhandarkar, Joshua Yelon, Narain Jagathesan, and Laxmikant Kale. Цією ж командою була розроблена Charm(4.8), що включала Converse — паралельне середовище виконання, яке дозволяє взаємодіяти між модулями, які написані, використовуючи різні парадигми, в межах одного додатку. Після цього середовище виконання Charm++ було переорієнтовано на Converse. Синтаксичні розширення забрали, а натомість розробили простий інтерфейс транслятора Charm++, котрий став мовою. Версія 5.8 ревізії 1 включала в себе:

  1. повністю переписане середовище виконання та інтерфейс транслятора
  2. нові можливості (наприклад: масиви чарів)
  3. різні бібліотеки

Після цього, мова координацій “Structured Dagger” була імплементована для Charm++ і була включена до поточної версії. До Converse було додано декілька нових особливостей: динамічне балансування навантаження (додано Terry Wilmarth і Joshua Yelon), клієнт-серверний інтерфейс для Converse, підтримка зневадження (Parthasarathy Ramachandran, Jeff Wright, and Milind Bhandarkar). Converse було портовано на платформи ASCI Red (Joshua Yelon), Cray T3E (Robert Brunner) та SGI Origin2000 (Milind Bhandarkar). Також були написані тести для Charm++ (Jackie WangFтаang Hu). Прогнозування, візуалізація продуктивності та інструменти аналітики були перепроектовані та переписані на Java (Michael Denardo). Orion Lawlor, Gengbin Zheng та Milind Bhandarkar були відповідальними за зміни до системи останнього релізу.[2]

Приклади ред.

Лістинги коду на Charm++:[3]

Header file (hello.h)
#ifndef __HELLO_H__
#define __HELLO_H__

class Hello : public CBase_Hello {

 public:

  /// Constructors ///
  Hello();
  Hello(CkMigrateMessage *msg);

  /// Entry Methods ///
  void sayHi(int from);
};

#endif //__HELLO_H__
Interface file (hello.ci)
module hello {

  array [1D] Hello {
    entry Hello();
    entry void sayHi(int);
  };

};
Source file (hello.C)
#include "hello.decl.h"

#include "hello.h"
#include "main.decl.h"

extern /* readonly */ CProxy_Main mainProxy;
extern /* readonly */ int numElements;

Hello::Hello() {
  // Nothing to do when the Hello chare object is created.
  // This is where member variables would be initialized
  // just like in a C++ class constructor.
}

// Constructor needed for chare object migration (ignore for now)
// NOTE: This constructor does not need to appear in the ".ci" file
Hello::Hello(CkMigrateMessage *msg) { }

void Hello ::sayHi(int from) {

  // Have this chare object say hello to the user.
  CkPrintf("\"Hello\" from Hello chare # %d on "
           "processor %d (told by %d).\n",
           thisIndex, CkMyPe(), from);

  // Tell the next chare object in this array of chare objects
  // to also say hello. If this is the last chare object in
  // the array of chare objects, then tell the main chare
  // object to exit the program.
  if (thisIndex < (numElements - 1))
    thisProxy[thisIndex + 1].sayHi(thisIndex);
  else
    mainProxy.done();
}

#include "hello.def.h"

Див. також ред.

Примітки ред.

  1. AMPI - Adaptive Message Passing Interface [Архівовано 5 грудня 2006 у Wayback Machine.](англ.)
  2. Charm++ Programming Language Manual (PDF). http://cs.illinois.edu/: University of Illinois at Urbana-Champaign, Department of Computer Science. Архів оригіналу (PDF) за 26 вересня 2011. Процитовано 12 серпня 2011.(англ.)
  3. Array "Hello World": A Slightly More Advanced "Hello World" Program: Array "Hello World" Code. http://charm.cs.uiuc.edu/: PPL - UIUC PARALLEL PROGRAMMING LABORATORY. Архів оригіналу за 29 вересня 2011. Процитовано 12 серпня 2011.(англ.)

Джерела ред.

Посилання ред.