(j3.2006) Integration of co-arrays with the intrinsic shift functions

Craig Rasmussen crasmussen
Mon Jul 16 15:54:48 EDT 2007


On Jul 13, 2007, at 11:00 AM, Aleksandar Donev wrote:

> On Friday 13 July 2007 07:59, Bill Long wrote:
>
>>  If Aleks wants to think of the co-dimensions as additional planes  
>> in a
>> higher dimension array, that's also fine.
> Just to make it clear: The standard clearly does not look at them  
> in any
> particular way and I prefer it that way. I mentioned the  
> "additional planes"
> view because it emphasizes the independence of the different co- 
> arrays on
> each image. In Fortran different dimensions of an array are  
> independent. Of
> course, we have ways to convert contiguous arrays into a different  
> rank
> view---this would not be appropriate for co-arrays.
>
> Early on there was discussion of co-triplet specifications. I want  
> to see them
> eventually, but they had complications too big for this revision.  
> One of the
> issues is that it would need to be settled how to view such arrays  
> when they
> are actual arguments. For example, what is the shape of A(1:5,2:4) 
> [1:5]?
> Since we have not added them in this revision we don't need to  
> fight over
> "global" views of co-arrays...there simply isn't one in the  
> standard at all.
>

Like you and Bill, I had thought that we could punt on the "global  
view" of a co-array declaration.  However, I have identified at least  
one point in the standard that requires a global view, that is the  
shift intrinsics.  The beauty of the data-parallel model is that all  
elements are independent, thus, operations on a data-parallel object  
can be fulfilled without regard to component ordering or storage  
location.  So a reduction or where mask doesn't depend on the array  
global view.

But as pointed out, the shift intrinsics require a global view so we  
have to, at the very least, start thinking about a global view, or  
frankly we should just deprecate the data-parallel features of  
Fortran 90.

To start off, I'll define a couple of terms and then present one  
possible global view of a co-array declaration.  The definitions have  
been borrowed from the very thorough paper, "An Approach to Data  
Distributions in Chapel" by Diaconescu and Zima.

TERMS

global index set: The finite set of names identifying the components  
of an array.

distribution: A specification of the global mapping from the index  
set of an array to individual images, as well as the local  
arrangement of indices and data within the images.

So what we need to define is essentially the inverse of a  
distribution.  That is, a standard mapping from a co-array  
declaration to a global index set.  But consider for now the index  
set {1:12}  (I'm using {} notation to indicate the "global view").   
What should the distribution be for a co-array of rank 1 and co-rank  
1, assuming local size of 3 and num_images() of 4?  A very natural  
distribution is

     {1:3} -> (1:3)[1], {4:6} -> (1:3)[2], ... {10:12} -> (1:3)[4]

Complications arise when the rank and co-rank are not the same.   
After thinking about this for awhile, I propose the following mapping  
(shown for 2D but easily extended to other dimensions):

     For A(m,n)[mp,np], the global index set ("global view") is  
{1:m*mp,1:n*np}.  Should the rank and co-rank differ, expand the rank  
of the smaller by adding additional dimensions of size 1 and apply  
the standard mapping as before.  For example,

     A(m)[mp,np] -> A(m,1)[mp,np]

The challenge for the next standard is to figure out how to allow for  
user-defined distributions.  (Alek's, if you have a better idea than  
the one I've just described please suggest it.)

The alternative is to ignore the issue altogether and allow Fortran  
to degenerate into an assembly language for parallel programming.  I  
suggest that this is counter to the spirit of Fortran.  By simply  
defining a standard distribution (perhaps the one I've suggested  
above) and applying it to the shift intrinsics, we can maintain the  
spirit of Fortran as a high level programming language, but now a  
high-level parallel programming language.  The essential beauty of  
what we can provide to the programmer is really the best of both  
worlds: the ability to program at a high level of abstraction or to  
drop down to the "assembly level", if it is required to explicitly  
manage separate images and the data residing on them (just as  
assembly programmers explicitly manage data transfer between  
registers and the local store).

Regards,
Craig




More information about the J3 mailing list