rtsIDe (1158448), страница 25
Текст из файла (страница 25)
for (it = 1; it <= itmax; it++)
{
/* Parallel loop to calculate maximal deviation
of the grid function in variable eps
(parallel loop with base array Ahdr) */
plref = crtpl_ (&Rank2);
iiniti[0] = 1;
iiniti[1] = 1;
ilasti[0] = k - 2;
ilasti[1] = k - 2;
mappl_ (&plref, (PatternRef *)Ahdr, axis, coeff, cnst, lvaddr,
lvtype, iiniti, ilasti, istep, oiniti, olasti, ostep);
eps = 0.;
while (dopl_ (&plref))
for ( j = oiniti[0]; j <= olasti[0]; j += ostep[0] )
for ( i = oiniti[1]; i <= olasti[1]; i += ostep[1] )
{ eps = max(eps, dvm_abs( DAElm2(Bhdr,float,j,i) -
DAElm2(Ahdr,float,j,i) ));
DAElm2(Ahdr, float, j, i) =
DAElm2(Bhdr, float, j, i);
}
endpl_ (&plref);
/* Calculation of reductional maximum */
strtrd_ (&rgref);
waitrd_ (&rgref);
/* Shadow edges exchange */
strtsh_ (&shgref);
waitsh_ (&shgref);
/* Parallel loop to calculate new values
of the grid function in array bhdr
(parallel loop with base array Bhdr) */
plref = crtpl_ (&Rank2);
mappl_ (&plref, (PatternRef *)Bhdr, axis, coeff, cnst, lvaddr,
lvtype, iiniti, ilasti, istep, oiniti, olasti, ostep);
while (dopl_ (&plref))
for ( j = oiniti[0]; j <= olasti[0]; j += ostep[0] )
for ( i = oiniti[1]; i <= olasti[1]; i += ostep[1] )
DAElm2(Bhdr, float, j, i) =
( DAElm2(Ahdr, float, j, i-1) +
DAElm2(Ahdr, float, j-1, i) +
DAElm2(Ahdr, float, j, i+1) +
DAElm2(Ahdr, float, j+1, i) ) / 4.f;
endpl_ (&plref);
/* Printing current deviation of grid function */
dvm_printf("IT = %ld EPS = %e\n", it, eps);
if(eps < maxeps)
break; /* exit, if specified precision is achieved */
}
/* END OF MAIN ITERATION LOOP */
/* Writing solution in the file
and end of work with Run-Time System */
OutFile = dvm_fopen("jacobi.out", "w+b");
if(OutFile)
{ dvm_dfwrite(Bhdr, 0, OutFile);
dvm_fclose(OutFile);
}
lexit_ (&UserRes);
return (int)UserRes;
}
19.2Parallel loop with regular data dependence between iterations
The (C and Fortran) programs, considered below, are the examples of implementation of parallel loop with data (flow) dependence and anti-dependence between iterations using Run-Time System functions. The parallel loop is two-dimensional loop of the form
| for( | j = 1; j <= k-2; j++ ) | ||||
| for( | i = 1; i <= k-2; i++ ) | ||||
| A[j,i] = ( | A[jFDL1, i] | /* flow dependence on dimension 1 */ | |||
| A[jADL1, i] | /* anti-dependence on dimension 1 */ | ||||
| A[j, iFDL2] | /* flow dependence on dimension 2 */ | ||||
| A[j, iADL2] | /* anti-dependence on dimension 2 */ | ||||
| ) | / 4; | ||||
Where:
| k | – | size of A array dimensions; |
| FDL1 | – | dependence length for dimension 1; |
| ADL1 | – | anti-dependence length for dimension 1; |
| FDL2 | – | dependence length for dimension 2; |
| ADL2 | – | anti-dependence length for dimension 2. |
PROGRAM IN FORTRAM LANGUAGE
program across
integer linit, lexit,getam, getps, crtamv, distr, crtda, align,
+ crtpl, dvmadr, mappl, endpl, dopl,
+ crtshg, inssh, insshd, strtsh, recvsh, sendsh, waitsh
real bptr(1)
integer dvm
integer amref, psref, mvref, plref, shgref
integer amdim(2), disaxs(2), dispar(2)
integer lshwd(2), hshwd(2), shsign(2), axis(2), coeff(2),
+ const(2)
integer lvaddr(2), lvtype(2), iiniti(2), ilasti(2), istep(2)
integer oiniti(2), olasti(2), ostep(2)
integer FDL1, FDL2, ADL1, ADL2, finssh
C Size of each array dimension
C with regular data dependence
parameter (k = 200)
C Header of array with regular data dependence
integer ahdr(6)
ahdr(5) = 1
ahdr(6) = 1
C Length of data dependence for dimension 1
FDL1 = 4
C Length of data dependence for dimension 2
FDL2 = 3
C Length of data anti-dependence for dimension 1
ADL1 = 2
C Length of data anti-dependence for dimension 2
ADL2 = 1
C Flag to use inssh_ function to registrate array
C in shadow edge group;
C If finssh=0, insshd_ function is used
finssh = 0
C Run-Time System initialization
dvm = linit (1)
C Creating abstract machine representation and
C its mapping on processor subsystem
amref = getam ()
psref = getps (amref)
amdim(1) = k
amdim(2) = k
mvref = crtamv (amref, 2, amdim,0)
disaxs(1) = 1
disaxs(2) = 2
dispar(1) = 0
dispar(2) = 0
dvm = distr (mvref, psref, 2, disaxs, dispar)
C Creation and distribution of array
C with regular data dependence
C Width of low shadow edge for dimension 1 is
C length of data dependence for dimension 1
lshwd(1) = FDL1
C Width of low shadow edge for dimension 2 is
C length of data dependence for dimension 2
lshwd(2) = FDL2
C Width of high shadow edge for dimension 1 is
C length of data anti-dependence for dimension 1
hshwd(1) = ADL1
C Width of high shadow edge for dimension 2 is
C length of data anti-dependence for dimension 2
hshwd(2) = ADL2
dvm = crtda (ahdr, 1, bptr, 2, 4, amdim, 0, 0, lshwd, hshwd)
axis(1) = 1
axis(2) = 2
coeff(1) = 1
coeff(2) = 1
const(1) = 0
const(2) = 0
dvm = align (ahdr, mvref, axis, coeff, const)
C Parallel loop of array initialization
C with regular data dependence
plref = crtpl (2)
lvaddr(1) = dvmadr (j)
lvaddr(2) = dvmadr (i)
lvtype(1) = 1
lvtype(2) = 1
iiniti(1) = 0
iiniti(2) = 0
ilasti(1) = k - 1
ilasti(2) = k - 1
istep(1) = 1
istep(2) = 1
dvm = mappl (plref, ahdr, axis, coeff, const, lvaddr, lvtype
+ iiniti, ilasti, istep, oiniti, olasti, ostep)
2 if (dopl (plref) .eq. 0) goto 3
do 1 j = oiniti(1), olasti(1), ostep(1)
do 1 i = oiniti(2), olasti(2), ostep(2)
bptr( ahdr(3) + 1 + i + ahdr(2) * j ) = 1.
1 continue
goto 2
3 dvm = endpl (plref)
C Creation of shadow edge group to supply
C data anti-dependence
shgref = crtshg (0)
C Zero width of low shadow edge for dimension 1
lshwd(1) = 0
C Zero width of low shadow edge for dimension 2
lshwd(2) = 0
C Width of high shadow edge for dimension 1 is
C length of data anti-dependence for dimension 1
hshwd(1) = ADL1
C Width of high shadow edge for dimension 2 is
C length of data anti-dependence for dimension 2
hshwd(2) = ADL2
dvm = inssh (shgref, ahdr, lshwd, hshwd, 0)
C Initialization of shadow edges to support
C data anti-dependence
dvm = strtsh (shgref)
dvm = waitsh (shgref)
C Creation of shadow edge group to support
C data dependence
shgref = crtshg (0)
C Width of low shadow edge for dimension 1 is
C length of data dependence for dimension 1
lshwd(1) = FDL1
C Width of low shadow edge for dimension 2 is
C length of data dependence for dimension 2
lshwd(2) = FDL2
C Zero width of high shadow edge for dimension 1
hshwd(1) = 0
C Zero width of high shadow edge for dimension 2
hshwd(2) = 0
if (finssh .eq. 0) goto 4
C inssh_ is used to registrate array in shadow edge group
dvm = inssh (shgref, ahdr, lshwd, hshwd, 0)
goto 5
C insshd_ is used to registrate array in shadow edge group
C Only low edge is used for dimensions 1 and 2
4 shsign(1) = 3
shsign(2) = 3
dvm = insshd (shgref, ahdr, lshwd, hshwd, 1, shsign)
goto 5
C Receiving imported elements
C to support data dependence
5 dvm = recvsh (shgref)
dvm = waitsh (shgref)
C PARALLEL LOOP WITH DATA DEPENDENCE AND
C ANTI-DEPENDENCE BETWEEN ITERATIONS
plref = crtpl (2)
iiniti(1) = 1
iiniti(2) = 1
ilasti(1) = k - 2
ilasti(2) = k - 2
dvm = mappl (plref, ahdr, axis, coeff, const, lvaddr, lvtype,
+ iiniti, ilasti, istep, oiniti, olasti, ostep)
6 if (dopl (plref) .eq. 0) goto 7
do 8 j = oiniti(1), olasti(1), ostep(1)
do 8 i = oiniti(2), olasti(2), ostep(2)
bptr(ahdr(3) + 1 + i + ahdr(2) * j) =
+ ( bptr(ahdr(3) + 1 + (i - FDL2) + ahdr(2) * j) +
+ bptr(ahdr(3) + 1 + i + ahdr(2) * (j - FDL1)) +
+ bptr(ahdr(3) + 1 + (i + ADL2) + ahdr(2) * j) +
+ bptr(ahdr(3) + 1 + i + ahdr(2) * (j + ADL1)) ) / 4.
8 continue
goto 6
7 dvm = endpl (plref)
C Sending exported elements
C to support data dependence
dvm = sendsh (shgref)
dvm = waitsh (shgref)
C Run-Time System termination
dvm = lexit (0)
end
PROGRAM IN C LANGUAGE
#include "dvmlib.h"
int main(int argc, char *argv[])
{
long InitPar = 0, UserRes = 0;
long StaticMV = 0, StaticDA = 0, ReDistrDA = 0,
StaticShG = 0, FullShd = 0, MaxShdCount = 1;
long ShdSignArray[2];
long i, j, Rank2 = 2, TypeSize = sizeof(float);
AMRef amref;
PSRef psref;
AMViewRef mvref;
LoopRef plref;
ShadowGroupRef fshgref, ashgref;
AddrType lvaddr[2];
long lvtype[2] = {0,0};
long amdim[2], disaxs[2], dispar[2];
long lshwdth[2], hshwdth[2], axis[2], coeff[2], cnst[2];
long iiniti[2], ilasti[2], istep[2];
long oiniti[2], olasti[2], ostep[2];
long ExtHdrSign = 0;
DVMFILE *OutFile;
long k = 200; /* size of each array dimension
with regular data dependence */
long FDL1 = 4; /* прямой зависимости length of data
dependence for dimension 1 */
long FDL2 = 3; /* length of data dependence
for dimension 2 */
long ADL1 = 2; /* length of data anti-dependence
for dimension 1 */
long ADL2 = 1; /* length of data anti-dependence
for dimension 2 */
int f_inssh = 0; /* flag to use inssh_ function to registrate
array in the shádow edge group if f_inssh = 0,
insshd_ function is used */
long Ahdr[3]; /* header of array with
regular data dependence */
rtl_init(InitPar, argc, argv); /* Run-Time System initialization */
/* Creation of abstract machine representation
and its mapping on processor subsystem */
amref = getam_ ();
psref = getps_ (&amref);
amdim[0] = k;
amdim[1] = k;
mvref = crtamv_ (&amref, &Rank2, amdim, &StaticMV);
disaxs[0] = 1;
disaxs[1] = 2;
dispar[0] = 0;
dispar[1] = 0;
distr_ (&mvref, &psref, &Rank2, disaxs, dispar);
/* Creation and distribution of array
with regular data dependence */
lshwdth[0] = FDL1; /* width of low shadow edge for dimension 1 is















