Preface : Co-array, a segmented container tied to a SPMD Multidimensional View

As mentioned before, a co-array is a distributed array whose segments are accessible through an array-inspired access mode. We have previously seen that it is possible to reproduce such access mode using the concept of views. Nevertheless, the user must pre-create a segmented container to instanciate this view. We illustrate below how a single constructor call can perform those two operations :

#include <hpx/components/containers/coarray/coarray.hpp>
#include <hpx/lcos/spmd_block.hpp>

// The following code generates all necessary boiler plate to enable the
// co-creation of 'coarray'

// Parallel section (suppose 'block' an spmd_block instance)
    using hpx::container::placeholders::_;

    std::size_t height=32, width=4, segment_size=10;

    hpx::coarray<double,3> a(block, "a", {height,width,_}, segment_size);

    /* Do some code */

Unlike segmented containers, a co-array object can only be instantiated within a parallel section; Here is the description of the parameters to provide to the coarray constructor :

Table 40. Parameters of coarray constructor




Reference to a spmd_block object


Symbolic name of type std::string


Dimensions of the coarray object


Size of a co-indexed element (i.e. size of the object referenced by the expression a(i,j,k))

Note that the "last dimension size" cannot be set by the user. It only accepts the constexpr variable hpx::container::placeholders::_. This size, which is considered private, is equal to the number of current images (value returned by block.get_num_images())

[Note] Note

An important constraint to remember about coarray objects is that all segments sharing the same "last dimension index" are located in the same image