Plan of lectures 1. Development of data parallel programming. Historical view of languages up to HPF. 2. Issues in translation of HPF. Simple examples. Distributed array descriptors. 3. Communication in data parallel languages. Communication patterns. Runtime libraries. 4. An “HPspmd” programming model. Motivations. Introduction to HPJava. 5. Java for HP computing. Java Grande. mpiJava. Lecture materials http://www.npac.syr.edu/projects/pcrc/HPJava/beijing.html Development of Data-Parallel Programming Bryan Carpenter NPAC at Syracuse University Syracuse, NY 13244 firstname.lastname@example.org Goals of this lecture Review the historical development of data-parallel programming, up to and including emergence of High Performance Fortran. Illustrate evolution of ideas by describing some major practical programming languages for data parallelism. Contents of Lecture Overview. Early data-parallel languages. ILLIAC IV CFD and DAP FORTRAN. Later SIMD languages. Need for massive parallelism: SIMD, MIMD, SPMD. Fortran 90 Connection Machine Fortran, related languages. High Performance Fortran. Multi-processing and distributed data Processor arrangements and templates, alignment Programming examples. Moore’s law and massive parallelism Microprocessors double in speed every eighteen months. To outpace growth in power of sequential computers, parallelism better offer orders of magnitude better performance. Moderate parallelism cannot give this speedup—massive parallelism or bust! Niches for massive parallelism today Dedicated clusters of commodity processors. Government labs, internet servers, Pixar Renderfarm, … Harvesting cycles of processors distributed over the internet. Two principal forms of massive parallelism: task farming, and data parallelism. Data parallelism Large data structures, typically arrays, split across computational nodes. Each node computes local patch of arrays. Typically need some intermediate results from other nodes, but communication should not dominate. Logical model of fine-grained parallelism—at level of array elements, rather than tasks. Programming languages for massive parallelism Task farming adequately expressed in conventional languages task = function call libraries handle communication + load-balancing Data parallelism can be expressed in conventional languages + MPI (say), but historically higher level languages have been quite successful Potentially avoid the problems of general concurrent programming (non-determinism, synchronization, deadlock, …) Why special languages for data-parallelism? Originally devised for Single Instruction, Multiple Data (SIMD) computers. Specialized architectures demanded special language features. New abstraction: distributed array. Central control avoided problems of concurrent programming—concentrate on expressing parallel algorithms. Advent of MIMD computers. By 90s, SIMD lost ground—general purpose microprocessors too cheap, powerful. Multiple Instruction, Multiple Data (MIMD) computers could be built from commodity components. Still want to avoid complexity of general concurrent programming. Single Program, Multiple Data (SPMD)—now a programming model rather than computer architecture. Similarities to SIMD programming suggest similar language ideas should apply. The road to HPF High Performance Fortran took ideas from SIMD languages—embedded them in a standardized language for programming MIMD computers in SPMD style. Next section of this lecture will review historically important SIMD languages— learn where the ideas came from. ILLIAC IV ILLIAC IV development started late 60s. Fully operational 1975. Illinois then NASA Ames. SIMD computer for array processing. Control Unit + 64 Processing elements. 2K words memory per PE. CU can access all memory. PEs can access local memory and communicate with neighbours. CU reads program text—broadcasts instructions to PEs. Architecture of the ILLIAC IV ILLIAC IV CFD Software problematic for ILLIAC. CFD language developed at Computational Fluid Dynamics Branch of Ames. “Fortran-like” rather than a true FORTRAN dialect. Deliberately no attempt to hide hardware peculiarities—on contrary, tried to give programmer direct access to all features of the hardware. Data types in CFD Basic types included CU REAL, CU INTEGER, PE REAL, PE INTEGER. Ordinary arrays can be in PE or CU memory: CU REAL A, B(100) PE INTEGER I PE REAL D(25), E(1000) Vector-aligned arrays in PE memory: PE INTEGER J(*) PE REAL X(*,4), Y(*,2,8) Vector aligned arrays in CFD Early language instantiation of Distributed Array concept. Only first dimension can be distributed. Extent of distributed dimension exactly 64. J(1) stored on first PE, J(2) on second PE, etc. X(1,1),…,X(1,4) on first PE, X(2,1),…, X(2,4) on second PE, etc. Parallel computation in CFD Parallel computation only in vector assignments. Subscript is *. Communication between PEs by adding shift to *: DIFP(*) = P(* + 1) – P(* - 1) Conditional vector assignment: IF(A(*) .LT. 0) A(*) = -A(*) PEs can locally access different locations: DIAG(*) = RHO(*, X(*)) Vector subscript must be in sequential dimension. Other ILLIAC languages Glypnir Algol-like rather than Fortran-like. swords (“super-words”) rather than explicit parallel arrays. IVTRAN Higher-level Fortran dialect. Scheme for mapping general arrays to PEs. Parallel loop similar to FORALL. Compiler never fully debugged. ICL DAP FORTRAN ICL DAP (Distributed Array Processor)—early commercial parallel computer. Available early 80s. Trend to many, simple PEs: 64 × 64 grid of 4096 bit-serial processors. FP performance much lower than ILLIAC, but good performance in other domains. Module of ICL 2900 mainframe computer— shared memory and other facilities with host. Programmed in DAP FORTRAN. Constrained arrays in DAP FORTRAN First one or two extents could be omitted: DIMENSION A(), BB(,) INTEGER II(,) REAL AA(,3), BBB(,,5) A is a vector. BB and II are matrices. AA an array of vectors. BBB an array of matrices. Extents of constrained dimensions 64 again (vectors of 4096 also possible). Array assignments in DAP Fortran Leave subscripts empty for array expression. + or – subscript used for nearest neighbour access: U(,) = 0.25 * (U(,-) + U(,+) + U(-,) + U(+,)) Masked assignment by using logical matrix as subscript: LOGICAL L(,) ... L(,) = BB(,) .LT. 0 B(L) = -B(,) Standardized array processing: Fortran 90 By the mid 80s SIMD and vector computers looked well-established. The Fortran 8X committee saw a need to make array assignments standard language features. Fortran 90 (as it eventually became) added many new features to support modern software engineering. It also added new “array syntax”, including array assignments, array sections, transformational intrinsics. Fortran 90 array assignments Rank-2 arrays, shape (5, 10): REAL A(5, 10), B(5, 10), C(5, 10) Array expressions involve conforming arrays: A + B, B * C, A + (B * C) Arrays conform if they have same shape. B * C, for example, stands for B(1,1) * C(1,1) . . . · · B(5,1) * C(5,1) . . . B(1,10) * C(1,10) · B(5,10) * C(5,10) Scalars in array expressions Scalars conform with any array: REAL D Expression C + D stands for: C(1,1) + D . . . · · C(5,1) + D . . . C(1,10) + D · C(5,10) + D Array sections Array subscripts can be triplets: X(1:10:3) stands for the subarray: (X(1), X(4), X(7), X(10)) Special cases of triplets: X(1:4), stride defaults to 1: (X(1), X(2), X(3), X(4)) X(:) selects whole of array dimension, as originally declared. Most useful for multi-dimensional arrays—here X(:) just equivalent to X. Array assignments Simple assignment: U(2:N-1) = 0.5 * (U(1:N-2) + U(3:N)) Right-hand-side expression must conform with left-hand-side variable. Conditional assignment: WHERE (A .LT. 0.0) A = -A The condition must be a logical array that conforms with the left-hand-side of the assignment. Array intrinsics Fortran 90 added many transformational intrinsics—operations on whole arrays. CSHIFT, EOSHIFT shift arrays in a dimension. TRANSPOSE transposes array. RESHAPE: general reshaping of array. SUM, PRODUCT, MAXVAL, MINVAL, . . . : reduction operations that take an array and return scalar or reduced-rank array. The Connection Machine Thinking Machines Corp founded 1983 to supply connectionist computers for AI. In practise, their Connection Machine series was used largely for scientific computing. CM-2 launched 1986: SIMD architecture, bit-serial PE like DAP. Up to 65536 PEs connected on a hypercube network. Floating point coprocessors could give peak performance 28 GFLOPS. Programmed initially in *LISP, then C*. By 1990 there was a CM Fortran compiler. CM Fortran Extended from FORTRAN 77. Included all the new array syntax of Fortran 90. FORALL statement. Array distribution directives. Mapping arrays in CM Fortran Arrays can be allocated on front-end (VAX, Sun,etc) or on the CM itself. By default an array is a CM array if it ever used in a F90 array assignment in the current procedure; it is a front-end array if it is only ever used in F77 style. Distributed arrays (“CM arrays”) can have any shape. Layout of CM arrays Arrays mapped to Virtual Processor sets (VP sets), one array element per VP. By default VP set has minimal shape s.t.: VP grid is large enough to hold the array, Extents of VP grid are powers of 2, Total number VPs is a multiple of number PEs. Map first array element to first VP. Disable or ignore VPs unneeded to hold elements. LAYOUTdirectives in CM Fortran Layout directive can override defaults. Serial dimensions can be elected: REAL A(10, 64, 100) CMF$ LAYOUT A(:SERIAL, :NEWS, :NEWS) A aligned with B: REAL B(64, 100) CMF$ LAYOUT B(:NEWS, :NEWS) All dimensions serial implies front-end array. LAYOUT directives can appear in procedure interface blocks. ALIGN directives in CM Fortran Can explicitly specify alignment relations: REAL V(100), B(64, 100) CMF$ ALIGN V(I) WITH B(1, I) Offset alignments also allowed: REAL C(32, 50) CMF$ ALIGN C(I, J) WITH B(I+5, J+2) More general alignments, eg transposed, not allowed. Layouts and alignments in CM Fortran FORALL Parallelism must be explicit. Eg in F90 style: U(2:N-1, 2:N-1) = & 0.25 * (U(2:N-1, 1:N-2) + U(2:N-1, 3:N) & + U(1:N-2, 2:N-1) + U(3:N, 2:N-1)) When array syntax unwieldy, can use FORALL statement: FORALL (I = 2:N-1, J = 2:N-1) & U(I, J) = 0.25 * (U(I, J-1) + U(I, J+1) + & U(I-1, J) + U(I+1, J)) Languages related to CM Fortran MasPar Fortran. Contemporary SIMD computer corporation. Language very similar to CM Fortran. Slightly different syntax for directives. *LISP. Original language of CM. Data parallel dialect of Common LISP. pvars rather than distributed arrays. C*. CM version of C, extended with syntax for distributed arrays. Introduced shape concept, similar to templates in later HPF. The High Performance Fortran Forum By early 90s, value of portable, standardized languages universally acknowledged. Goal of HPF Forum—a single language for High Performance programming. Effective across architectures—vector, SIMD, MIMD, though SPMD a focus. Supported by most major vendors then: Cray, DEC, Fujitsu, HP, IBM, Intel, MasPar, Meiko, nCube, Sun, Thinking Machines HPF 1.0 standard published 1993. Multiprocessing and Distributed Data Contemporary parallel computers are built from autonomous processors with some local memory. Processors access their local memory rapidly, or other processors memory much more slowly. Programs should be arranged to minimize non-local accesses. Processors Memory areas Excessive communication Computation divided into parallel subcomputations, each computation involving operands from multiple processors. Bad load balancing All parallel subcomputations access operands on the same processor. Ideal decomposition All operands of individual subcomputation on single processor; operands for different tasks on different processors. Placement of data and computation HPF allows intricate control over placement of array elements, through mapping directives. HPF 1.0 allows no direct control over placement of computation. Compiler should infer good place to compute, according to location of operands (eg, “owner computes” heuristic). Stages of data mapping in HPF Processor arrangements Abstract, program-level representation of processor set over which data is distributed. Directive syntax similar to Fortran array declaration: !HPF$ PROCESSORS P(10) Set P contains 10 processors. Processor arrangements can be multidimensional: !HPF$ PROCESSORS Q(4, 4) Templates Abstract array shape, to which actual data can be aligned. (Usually much finer grain than processor arrangements.) Declaration syntax: !HPF$ TEMPLATE T(50, 50, 50) Templates distributed over processor arrangements using DISTRIBUTE directive. Following examples assume: !HPF$ PROCESSORS P1(4) !HPF$ TEMPLATE T1(17) Simple block distribution !HPF$ DISTRIBUTE T1(BLOCK) ONTO P1 Simple cyclic distribution !HPF$ DISTRIBUTE T1(CYCLIC) ONTO P1 Block distribution with specified block-size !HPF$ DISTRIBUTE T1(BLOCK(6)) ONTO P1 Block-cyclic distribution !HPF$ DISTRIBUTE T1(CYCLIC(3)) ONTO P1 Distributing a multidimensional template Distribution formats can be mixed: !HPF$ PROCESSORS P2(4, 3) !HPF$ TEMPLATE T2(17, 20) !HPF$ DISTRIBUTE T2(CYCLIC, BLOCK) ONTO P2 Some dimensions may be serial, or collapsed: !HPF$ DISTRIBUTE T2(BLOCK, *) ONTO P1 LU Decomposition algorithm REAL A(N, N) DO K = 1, N – 1 DO J = K + 1, N A(K, J) = A(K, J) / A(K, K) DO I = K + 1, N A(I, J) = A(I, J) – A(I, K) * A(K, J) ENDDO ENDDO ENDDO Parallel LU Decomposition REAL A(N, N) REAL COL(N), ROW(N) DO K = 1, N – 1 COL(K:N) = A(K:N, K) A(K, K+1:N) = A(K, K+1:N) / COL(K) ROW(K+1:N) = A(K, K+1:N) FORALL (I = K+1:N, J = K+1:N) & A(I, J) = A(I, J) – COL(I) * ROW(J) ENDDO Simple align directive Create template matching principal array (A), then ALIGN the array to the template: !HPF$ TEMPLATE T(N, N) !HPF$ ALIGN A(I, J) WITH T(I, J) Aligning auxiliary arrays Want to minimize communication in largest parallel loop: FORALL (I = K+1:N, J = K+1:N) & A(I, J) = A(I, J) – COL(I) * ROW(J) Suggests replicated alignments for COL and ROW: !HPF$ ALIGN COL(I) WITH T(I, *) !HPF$ ALIGN COL(J) WITH T(*, J) Alignment of arrays in LU example Communication in LU example The statement COL(K:N) = A(K:N, K) broadcasts Kth column of A. The statement A(K, K+1:N) = A(K, K+1:N) / COL(K) needs no communication (reason for using COL(K) rather than A(K, K)). The statement ROW(K+1:N) = A(K, K+1:N) broadcasts Kth row of A. Distribution in LU example Block-wise distribution unattractive due to poor load balancing. Cyclic distribution preferable: !HPF$ PROCESSORS P(NP, NP) !HPF$ DISTRIBUTE T(CYCLIC, CYCLIC) ONTO P LU example with directives !HPF$ PROCESSORS P(NP, NP) !HPF$ TEMPLATE T(N, N) !HPF$ DISTRIBUTE T(CYCLIC, CYCLIC) ONTO P REAL A(N, N) !HPF$ ALIGN A(I, J) WITH T(I, J) REAL COL(N), ROW(N) !HPF$ ALIGN COL(I) WITH T(I, *) !HPF$ ALIGN COL(J) WITH T(*, J) DO K = 1, N – 1 COL(K:N) = A(K:N, K) A(K, K+1:N) = A(K, K+1:N) / COL(K) ROW(K+1:N) = A(K, K+1:N) FORALL (I = K+1:N, J = K+1:N) & A(I, J) = A(I, J) – COL(I) * ROW(J) ENDDO Other alignment options Permuted dimensions: DIMENSION B(N, N) !HPF$ ALIGN B(I, J) WITH T(J, I) Affine intra-dimensional alignment: DIMENSION C(N/2, N/2) !HPF$ ALIGN C(I, J) WITH T(N/2 + I, 2*J) Intra-dimensional alignment example Next Lecture: Issues in translation of High Performance Fortran Translation of simple HPF programs to SPMD (MPI) programs. Design of a runtime Distributed Array Descriptor.