LU
1
2018 1 10 10:25-12:10
2018/1/10
1. 9 27 ( )
2. 10 4
l
3. 10 11
l
4. 10 18
l
5. 10 25
l 2
6. 11 1
l -
2018/1/10
7. 11 8
l
8. 11 29
l
-
9. 12 6
l
10. 12 13
l l
11. 12 20
l
12. 1 10
l
13. 1 16
l
RB-H
2018 2 12 24
2
LU
1.
•
2.
• LU
3.
• LU
3
2018/1/10
1.
2.
4
2018/1/10
LU C
5
2018/1/10
LU (1)
•
ib = n/numprocs;
istart = myid * ib;
iend = (myid+ )* ib;
/* LU decomposition --- */
for (k=0; k<iend; k++) { idiagPE = k / ib;
if (idiagPE == myid) { /* PE */
dtemp = 1.0 / A[k][k];
buf[ ]
for (i=myid+ ; i<numprocs; i++) { /* */
MPI_Send(&buf[…], … , MPI_DOUBLE, i, k, MPI_COMM_WORLD);
}
istart = k+ ; /* */
} else { /* PE */
MPI_Recv(&buf[…], …, MPI_DOUBLE, idiagPE, k, MPI_COMM_WORLD,
&istatus);
}
2018/1/10
6
LU (2)
/* */
for (j=k+ ; j<n; j++) { dtemp = buf[j];
for (i=istart; i<iend; i++) { A[j][i] = A[j][i] - A[k][i]*dtemp;
} }
} /* End of k-loop --- */
/* --- */
MPI_Barrier(MPI_COMM_WORLD);
2018/1/10
7
(1)
• istart = myid * ib; iend = (myid+ ) * ib; /* */
/* Forward substitution --- */
for (k=0; k<n; k++)
c[k] = 0.0; /* c */
for (k=0; k<n; k+=ib) { /* */
if (k >= istart) { /* */
idiagPE = k / ib;
if (myid != 0)
/* PE */
MPI_Recv(&c[k], ib, MPI_DOUBLE, myid- , k, MPI_COMM_WORLD,
&istatus);
if (myid == idiagPE) { /* PE*/
/* */
for (kk=0; kk<ib; kk++) {
c[k+kk] = b[k+kk] + c[k+kk];/* */
for (j=istart; j<istart+kk; j++) c[k+kk] -= A[k+kk][ j ] * c[j];
}
2018/1/10
8
(2)
} else { /* PE */
/* */
for (kk=0; kk<ib; kk++) for (j=istart; j<iend; j++)
c[k+kk] -= A[k+kk][j]*c[j];
/* PE */
if (myid != numprocs- )
MPI_Send(&c[k], ib, MPI_DOUBLE, myid+ , k, MPI_COMM_WORLD);
}
} /* End of if( ) --- */
} /* End of k-loop --- */
2018/1/10
9
LU
FORTRAN
10
2018/1/10
LU (1)
•
ib = n/numprocs istart = myid * ib + iend = (myid+ )* ib
c --- LU decomposition --- do k= , iend
idiagPE = (k- ) / ib
c --- PE
if (idiagPE .eq. myid) then dtemp = 1.0 / A(k, k)
c ---
do i=myid+ , numprocs –
call MPI_Send(A(k,k)), … , MPI_DOUBLE_PRECISION, i, k, MPI_COMM_WORLD, ierr )
enddo c ---
istart = k + else
c --- PE
call MPI_Recv(A(k,k)), …, MPI_DOUBLE_PRECISION idiagPE, k, MPI_COMM_WORLD, istatus, ierr)
endif
2018/1/10
11
LU (2)
c ---
do j=istart, iend dtemp = A( k, j ) do i=k+ , n
A(i , j) = A(i , j) – A(i , k) * dtemp enddo
enddo enddo
c --- End of k-loop ---
c --- ---
call MPI_Barrier(MPI_COMM_WORLD, ierr)
2018/1/10
12
(1)
c ---
istart = myid * ib + iend = (myid+ ) * ib
c --- Forward substitution --- c --- c
do k= , n
c[k] = 0.0 enddo c ---
do k= , n, ib
if (k .le. istart) then idiagPE = (k- ) / ib c ---
if (myid .ne. 0) then
c --- PE
call MPI_Recv(c(k), ib,
& MPI_DOUBLE_PRECISION,
& myid- , k, MPI_COMM_WORLD,
& istatus, ierr)
2018/1/10
13
if (myid .eq. idiagPE) then
c --- PE
do kk= , ib
c ---
c(k+kk- ) = b(k+kk- ) + c(k+kk- )
c ---
do j=istart, istart+kk-2
c(k+kk- ) = c(k+kk- ) - A(k+kk- , j ) * c( j ) enddo
enddo
(2)
else
c --- PE
do kk= , ib
do j=istart, iend-
c(k+kk- ) = c(k+kk- ) – A(k+kk- , j ) * c( j ) enddo
enddo c ---
if (myid .ne. numprocs- ) then c --- PE
call MPI_Send(c(k), ib, MPI_DOUBLE_PRECISION, myid+ ,
& k, MPI_COMM_WORLD, ierr) endif
endif endif
c --- End of if ---
enddo
c --- End of k-loop ---
2018/1/10
14
15
2018/1/10