We present efficient support for generalized arrays of parallel
data driven objects. Array elements are regular C++ objects, and
are scattered across the parallel machine. An individual element is
addressed by its index , which can be an arbitrary object rather
than a simple integer. For example, an array index can be a series
of numbers, supporting multidimensional sparse arrays; a bit
vector, supporting collections of quadtree nodes; or a string.
Methods can be invoked on any individual array element from any
processor, and the elements can participate in reductions and
broadcasts. Individual elements can be created or deleted
dynamically at any time. Most importantly, the elements can migrate
from processor to processor at any time. The paper discusses
support for message delivery and collective operations in face of
such dynamic behavior. The migration capabilities of array elements
have proven extremely useful, for example, in implementing flexible
load balancing strategies and for exploiting workstation clusters
adaptively. We present the design, an implementation, and
performance results.