<< Chapter < Page Chapter >> Page >

Two-dimensional distributions

This figure shows two grids of numbered boxes. Both are titled with two lines of code. The grid on the left, with code (Block, Block), has sixteen boxes, four boxes each numbered 1, 2, 3, and 4, and the numbers are organized in quadrants. The grid on the right, with code (*, block), has sixteen boxes, four boxes each numbered 1, 2, 3, and 4, and the numbers are organized in columns.

When dealing with more than one data structure to perform a computation, you can either separately distribute them or use the ALIGN directive to ensure that corresponding elements of the two data structures are to be allocated together. In the following example, we have a plate array and a scaling factor that must be applied to each column of the plate during the computation:


DIMENSION PLATE(200,200),SCALE(200) !HPF$ DISTRIBUTE PLATE(*,BLOCK)!HPF$ ALIGN SCALE(I) WITH PLATE(J,I)

Or:


DIMENSION PLATE(200,200),SCALE(200) !HPF$ DISTRIBUTE PLATE(*,BLOCK)!HPF$ ALIGN SCALE(:) WITH PLATE(*,:)

In both examples, the PLATE and the SCALE variables are allocated to the same processors as the corresponding columns of PLATE . The * and : syntax communicate the same information. When * is used, that dimension is collapsed, and it doesn't participate in the distribution. When the : is used, it means that dimension follows the corresponding dimension in the variable that has already been distributed.

You could also specify the layout of the SCALE variable and have the PLATE variable "follow" the layout of the SCALE variable:


DIMENSION PLATE(200,200),SCALE(200) !HPF$ DISTRIBUTE SCALE(BLOCK)!HPF$ ALIGN PLATE(J,I) WITH SCALE(I)

You can put simple arithmetic expressions into the ALIGN directive subject to some limitations. Other directives include:

  • PROCESSORS Allows you to create a shape of the processor configuration that can be used to align other data structures.
  • REDISTRIBUTE and REALIGN Allow you to dynamically reshape data structures at runtime as the communication patterns change during the course of the run.
  • TEMPLATE Allows you to create an array that uses no space. Instead of distributing one data structure and aligning all the other data structures, some users will create and distribute a template and then align all of the real data structures to that template.

The use of directives can range from very simple to very complex. In some situations, you distribute the one large shared structure, align a few related structures and you are done. In other situations, programmers attempt to optimize communications based on the topology of the interconnection network (hypercube, multi-stage interconnection network, mesh, or toroid) using very detailed directives. They also might carefully redistribute the data at the various phases of the computation.

Hopefully your application will yield good performance without too much effort.

Hpf control structures

While the HPF designers were in the midst of defining a new language, they set about improving on what they saw as limitations in FORTRAN 90. Interestingly, these modifications are what is being considered as part of the new FORTRAN 95 standard.

The FORALL statement allows the user to express simple iterative operations that apply to the entire array without resorting to a do-loop (remember, do-loops force order). For example:


FORALL (I=1:100, J=1:100) A(I,J) = I + J

This can be expressed in native FORTRAN 90 but it is rather ugly, counterintuitive, and prone to error.

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, High performance computing. OpenStax CNX. Aug 25, 2010 Download for free at http://cnx.org/content/col11136/1.5
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'High performance computing' conversation and receive update notifications?

Ask