IBM Parallel ESSL subroutines cover the following computational areas: 

GLYPH<SM590000> Level 2 Parallel Basic Linear Algebra Subprograms (PBLAS) 

GLYPH<SM590000> Level 3 PBLAS 

GLYPH<SM590000> Linear algebraic equations 

GLYPH<SM590000> Eigensystem analysis and singular value analysis 

GLYPH<SM590000> Fourier transforms 

GLYPH<SM590000> Random number generation 

IBM Parallel ESSL uses calls of the IBM ESSL subroutines for computational purposes. 

For communication, Basic Linear Algebra Communications Subprograms (BLACS) is included, which is based on MPI. 

## 7.4.1 Program development 

During the development process of your program, the BLACS subroutines must be used. To include IBM Parallel ESSL calls into the code of the program, complete the following steps: 

1. Start the process grid by using the BLACS subroutines ( BLACS_GET  call and BLACS_GRIDINIT or BLACS_GRIDMAP  after it). 

2. Distribute data across the process grid. Try to use different block sizes to improve the performance of the program. For example, some IBM Parallel ESSL subroutines use a GPU for large sizes of blocks (about 2000 by 2000). 

3. Call the IBM Parallel ESSL subroutine on all processes of the BLACS process grid. 

4. Aggregate the results of IBM Parallel ESSL runs from all processes. 

5. Call the BLACS subroutines to clean the process grid and exit, such as BLACS_GRIDEXIT  or BLACS_EXIT . 

Example 7-7 shows a sample Fortran dgemm implementation that uses the IBM Parallel ESSL version of the PDGEMM subroutine for a 20000 by 20000 matrix size. PDGEMM works by using the following formula: 

C = α [A] x [B] + β [C} 

A lpha  and beta  are real scalar values , and A , B , and C  are matrixes of conforming shape. 

The algorithm is shown in Example 7-7. 

program pdgemm_sample implicit none real*8, allocatable, dimension(:) :: a,b,c integer, dimension(9) :: desca,descb,descc integer m,n,k integer np,nr,nc,mr,mc,icontxt,numroc,iam,nnodes integer acol, bcol, ccol real*8, parameter :: alpha = 2.d0 real*8, parameter :: beta = 3.d0 integer, parameter :: ia = 1, ib = 1, ic = 1 integer, parameter :: ja = 1, jb = 1, jc = 1 integer, parameter :: nb = 200 ! Bigger size for CUDA runs ! integer, parameter :: nb = 3000 

