A parallel application in CHARM++ consists of a number of relatively small, self-contained parallel objects. These objects communicate via remote method invocation, similar to Java RMI or RPC3.1, but asynchronous. Because each processor houses several objects, while one object is waiting for data, other local objects can use the CPU.
This data-driven approach thus automatically and transparently overlaps communication and computation, leading to better performance and easier application development. This approach compares quite favorably with the lower-level primitives provided by MPI, the dominant distributed memory parallel programming interface.
Parallel objects are implemented as ordinary C++ classes. They communicate with other parallel objects using a local communication proxy object, another regular C++ class. Proxies are automatically generated from an interface file that lists each classes' remote methods.
In this sense, CHARM++ has much the same interface as CORBA. However, CHARM++ targets tightly coupled parallel machines and aims for extremely efficient intra-process communication. The software messaging and scheduling overhead for CHARM++ is only a few microseconds.
The CHARM++ array framework, presented by the author in [#!ArrayMigISCOPE01!#], supports parallel objects called array elements that can be dynamically created and destroyed, participate in reductions and broadcasts, and migrate from one processor to another. Array elements are identified across the parallel machine by an array index, which need not be a contiguous range of integers- it can be a sparse user-defined data structure such as a multidimensional location, bitvector, or string.
Since array elements are migrateable, CHARM++ can improve load balance by occasionally migrating some objects from heavily loaded processors to less loaded processors. Migration-based load balancing can automatically compensate for application-induced load imbalance, minimize communication volume, handle variation among machines, or accommodate background load. The system is described in [#!AdaptLBSFMPC99!#].
CHARM++ is an excellent foundation for parallel programming design, research and implementation. Several major, highly scalable parallel applications have been developed using CHARM++, including [#!NamdJCP!#].