Querying a Local Subdomain

While writing a distributed program, one might need to know the index set that a certain locale owns in a given distributed array, domain, or distribution. This README describes the initial support for this functionality.

For code examples using these features, see the distributions.chpl primer.

Functions Supported on Array and Domain Types

hasSingleLocalSubdomain

proc array.hasSingleLocalSubdomain() : bool;
proc domain.hasSingleLocalSubdomain() : bool;

This is a param function which returns a boolean. If true, then the index set owned by a locale can be represented by a single domain. For example:

Distribution

hasSingleLocalSubdomain()

Block

true

Cyclic

true

BlockCyclic

false

Replicated

true

This function always returns true for non-distributed arrays and domains.

To support this function on a custom domain map, write a param function named dsiHasSingleLocalSubdomain.

localSubdomain

proc array.localSubdomain(loc: locale = here) : domain;
proc domain.localSubdomain(loc: locale = here) : domain;

This function only operates on arrays and domains whose hasSingleLocalSubdomain() result is true. Otherwise, a compile-time error is issued.

This function returns a single domain that represents the index set owned by the given locale, which defaults to here. This returned domain cannot be used to modify the index set owned by the locale.

To support this function on a custom domain map, write a function named dsiLocalSubdomain. For example:

proc BlockArr.dsiLocalSubdomain(loc: locale) : domain;

localSubdomains

iter array.localSubdomains(loc: locale = here) : domain;
iter domain.localSubdomains(loc: locale = here) : domain;

This iterator yields the subdomain(s) that represent the index set owned by the given locale, which defaults to here

If the locale’s index set can be represented by a single domain, then the result of localSubdomain is yielded.

Currently, this is a serial iterator.

To support this iterator on a custom domain map, write an iterator named dsiLocalSubdomains. For example:

iter BlockCyclicArr.dsiLocalSubdomains(loc: locale) : domain;

Functions Supported on Arrays, Domains, and Distributions

targetLocales

proc array.targetLocales() : [] locale;
proc domain.targetLocales() : [] locale;
proc distribution.targetLocales() : [] locale;

This function returns an array of locales that the distribution uses as the locale grid.