accelerated linear algebra libraries james wynne iii nccs user assistance

Post on 30-Mar-2015

220 Views

Category:

Documents

6 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Accelerated Linear Algebra Libraries

James Wynne IIINCCS User Assistance

2

Accelerated Linear Algebra Libraries

• Collection of functions to preform mathematical operations on matrices

• Designer has re-written the standard LAPACK functions to make use of GPU accelerators to speed up execution on large matrices

3

MAGMA HOST INTERFACE

Accelerated Linear Algebra Libraries

4

MAGMA - Host

• MAGMA stands for Matrix Algebra on GPU and Multicore Architecture

• Developed by the Innovative Computing Laboratory at the University of Tennessee

• Host interface allows easy porting from CPU libraries (like LAPACK) to MAGMA’s accelerated library– Automatically manages data allocation and transfer

between CPU (Host) and GPU (Device)

5

MAGMA - Host• Fortran:– To run MAGMA functions from Fortran, an Interface block needs to be

written for each MAGMA function that’s being called. These interfaces will be defined file magma.f90

– Example:module magma

Interface Integer Function magma_sgesv(n,nrhs,…)& BIND(C,name=“magma_sgesv”)

use iso_c_binding

implicit none

integer(c_int), value :: n

integer(c_int), value :: nrhs

end Function

end Interface

end module

6

MAGMA - Host

• Pseudo-code for a simple SGESV operation in magma

Program SGESV!Include the module that hosts your interfaceuse magma use iso_c_binding!Define your arrays and variablesReal(C_FLOAT) :: A(3,3), b(3)Integer(C_INT) :: piv(3), ok, status!Fill your `A` and `b` arrays then call!MAGMA_SGESVstatus = magma_sgesv(3,1,A,3,piv,b,3,ok)!Loop through and write(*,*) the contents of !array `b`

end Program

7

MAGMA - Host

• Pseudo-code for a simple SGESV operation in magma

Program SGESV!Include the module that hosts your interfaceuse magmause iso_c_binding!Define your arrays and variablesReal(C_FLOAT) :: A(3,3), b(3)Integer(C_INT) :: piv(3), ok, status!Fill your `A` and `b` arrays then call!MAGMA_SGESVstatus = magma_sgesv(3,1,A,3,piv,b,3,ok)!Loop through and write(*,*) the contents of !array `b`

end Program

8

MAGMA - Host

• Pseudo-code for a simple SGESV operation in magma

Program SGESV!Include the module that hosts your interfaceuse magmause iso_c_binding!Define your arrays and variablesReal(C_FLOAT) :: A(3,3), b(3)Integer(C_INT) :: piv(3), ok, status!Fill your `A` and `b` arrays then call!MAGMA_SGESVstatus = magma_sgesv(3,1,A,3,piv,b,3,ok)!Loop through and write(*,*) the contents of !array `b`

end Program

9

MAGMA - Host

• Before compiling, Make sure the MAGMA module, CUDA toolkit and the GNU programming environment is loaded– magma.f90: Contains the Interface block module– sgesv.f90: Contains the Fortran source code

• To compile:$ module swap PrgEnv-pgi PrgEnv-gnu

$ module load cudatoolkit magma

$ ftn magma.f90 –lcuda –lmagma –lmagmablas sgesv.f90

10

MAGMA - Host

• C:

• In C source code, no kind of interface block is needed like in Fortran

• Simply #include<magma.h> in your code

• When declaring variables to use with MAGMA functions, use magma_int_t instead of C’s int type. Matrices for MAGMA’s SGESV are of type float

11

MAGMA - Host• Example code for C:

#include<magma.h>#include<stdio.h>

int main(){ //Define Arrays and variables for MAGMA float b[3], A[3][3]; magma_int_t m = 3, n = 1, piv[3] ok;

//Fill matrices A and b and call magma_sgesv() magma_sgesv(m,n,A,m,piv,b,m,&info); //Loop through and print out returned array b}

12

MAGMA - Host• Example code for C:

#include<magma.h>#include<stdio.h>

int main(){ //Define Arrays and variables for MAGMA float b[3], A[3][3]; magma_int_t m = 3, n = 1, piv[3] ok;

//Fill matrices A and b and call magma_sgesv() magma_sgesv(m,n,A,m,piv,b,m,&info); //Loop through and print out returned array b}

13

MAGMA - Host• Example code for C:

#include<magma.h>#include<stdio.h>

int main(){ //Define Arrays and variables for MAGMA float b[3], A[3][3]; magma_int_t m = 3, n = 1, piv[3] ok;

//Fill matrices A and b and call magma_sgesv() magma_sgesv(m,n,A,m,piv,b,m,&info); //Loop through and print out returned array b}

14

MAGMA - Host• Example code for C:

#include<magma.h>#include<stdio.h>

int main(){ //Define Arrays and variables for MAGMA float b[3], A[3][3]; magma_int_t m = 3, n = 1, piv[3] ok;

//Fill matrices A and b and call magma_sgesv() magma_sgesv(m,n,A,m,piv,b,m,&info); //Loop through and print out returned array b}

15

MAGMA - Host

• Before compiling, Make sure the MAGMA module, CUDA toolkit and the GNU programming environment is loaded

• To compile:$ module swap PrgEnv-pgi PrgEnv-gnu

$ module load cudatoolkit magma

$ cc –lcuda –lmagma –lmagmablas sgesv.c

16

MAGMA DEVICE INTERFACE

Accelerated Linear Algebra Libraries

17

MAGMA - Device

• MAGMA Device interface allows direct control over how the GPU (device) is managed– Memory allocation and transfer– Keeping matrices on the device

18

MAGMA - Device

• Fortran:– To run MAGMA device functions from Fortran, an Interface

block needs to be written for each MAGMA function that’s being called. This is not required in C source code

– Device functions suffixed with _gpu– CUDA Fortran used to manage memory on the device– All interface blocks need to be defined in a module

(module magma) • If module exists in a separate file, file extension must be .cuf, just like

the source file

19

MAGMA - Device

• Example:module magma

Interface

Integer Function magma_sgesv_gpu(n,nrhs,dA…)& BIND(C,name=“magma_sgesv_gpu”)

use iso_c_binding

use cudafor

implicit none

integer(c_int), value :: n

integer(c_int), value :: nrhs

real (c_float), device, dimension(:)::dA(*)

end Function

end Interface

20

MAGMA - Device

• Also need the MAGMA initialize function (defined in the same interface block module):

Interface

Integer Function magma_init() & BIND(C,name=“magma_init”)

use iso_c_binding

implicit none

end Function

end Interface

end module

21

MAGMA - Device

• Pseudo-code for a simple SGESV operation in magma

Program SGESV!Include the module that hosts your interfaceuse magmause cudaforuse iso_c_binding!Define your arrays and variablesReal(C_FLOAT) :: A(3,3), b(3)Real(C_FLOAT),device,dimension(:,:) :: dAReal(C_FLOAT),device,dimension(:) :: dBInteger(C_INT),value :: piv(3), ok, status

22

MAGMA - Device

• Pseudo-code for a simple SGESV operation in magma

Program SGESV!Include the module that hosts your interfaceuse magmause cudaforuse iso_c_binding!Define your arrays and variablesReal(C_FLOAT) :: A(3,3), b(3)Real(C_FLOAT),device,dimension(:,:) :: dAReal(C_FLOAT),device,dimension(:) :: dBInteger(C_INT),value :: piv(3), ok, status

23

MAGMA - Device

• Pseudo-code for a simple SGESV operation in magma

Program SGESV!Include the module that hosts your interfaceuse magmause cudaforuse iso_c_binding!Define your arrays and variablesReal(C_FLOAT) :: A(3,3), b(3)Real(C_FLOAT),device,dimension(:,:) :: dAReal(C_FLOAT),device,dimension(:) :: dBInteger(C_INT),value :: piv(3), ok, status

24

MAGMA - Device

• Pseudo-code for a simple SGESV operation in magma

!Fill your `A` and `b` arrays then initialize !MAGMA status = magma_init()!Copy filled host arrays `A` and `b` to `dA`!and `dB` using CUDA FortrandA = AdB = b!Call the device functionstatus = magma_sgesv_gpu(3,1,dA,3,piv,dB,3,ok)!Copy results back to CPUb = dB!Loop through and write(*,*) the contents of !array `b`

end Program

25

MAGMA - Device

• Pseudo-code for a simple SGESV operation in magma

!Fill your `A` and `b` arrays then initialize !MAGMA status = magma_init()!Copy filled host arrays `A` and `b` to `dA`!and `dB` using CUDA FortrandA = AdB = b!Call the device functionstatus = magma_sgesv_gpu(3,1,dA,3,piv,dB,3,ok)!Copy results back to CPUb = dB!Loop through and write(*,*) the contents of !array `b`

end Program

26

MAGMA - Device

• Pseudo-code for a simple SGESV operation in magma

!Fill your `A` and `b` arrays then initialize !MAGMA status = magma_init()!Copy filled host arrays `A` and `b` to `dA`!and `dB` using CUDA FortrandA = AdB = b!Call the device functionstatus = magma_sgesv_gpu(3,1,dA,3,piv,dB,3,ok)!Copy results back to CPUb = dB!Loop through and write(*,*) the contents of !array `b`

end Program

27

MAGMA - Device

• Pseudo-code for a simple SGESV operation in magma

!Fill your `A` and `b` arrays then initialize !MAGMA status = magma_init()!Copy filled host arrays `A` and `b` to `dA`!and `dB` using CUDA FortrandA = AdB = b!Call the device functionstatus = magma_sgesv_gpu(3,1,dA,3,piv,dB,3,ok)!Copy results back to CPUb = dB!Loop through and write(*,*) the contents of !array `b`

end Program

28

MAGMA - Device

• Before compiling, Make sure the MAGMA module, CUDA toolkit and the PGI programming environment is loaded– magma.cuf: Contains module of Interface blocks– sgesv.cuf: Contains the Fortran source

• To compile:$ module load cudatoolkit magma

$ ftn magma.cuf –lcuda –lmagma –lmagmablas sgesv.cuf

29

MAGMA - Device

• C:

• In C Device source code, no kind of interface block is needed like in Fortran

• Simply #include<magma.h> in your code

• When declaring variables to use with MAGMA functions, use magma_int_t instead of C’s int type. Matrices for MAGMA’s SGESV are of type float

• Before running any MAGMA Device code, magma_init()must be called.

30

MAGMA - Device

• C:

• To interact with the device (Allocate matrices, transfer data, etc) use the built in MAGMA functions– Allocate on the device: magma_dmalloc()– Copy matrix to device: magma_dsetmatrix()– Copy matrix to host: magma_dgetmatrix()

31

MAGMA - Device• Example code for C:

#include<magma.h>#include<stdio.h>

int main(){ //Define Arrays and variables for MAGMA float b[3], A[3][3]; float *A_d, *b_d //Device pointers magma_int_t m = 3, n = 1, piv[3] ok;

//Fill matrices A and b and allocate device //matrices magma_dmalloc(&A_d, m*m); magma_dmalloc(&b_d, m);

32

MAGMA - Device• Example code for C:

#include<magma.h>#include<stdio.h>

int main(){ //Define Arrays and variables for MAGMA float b[3], A[3][3]; float *A_d, *b_d //Device pointers magma_int_t m = 3, n = 1, piv[3] ok;

//Fill matrices A and b and allocate device //matrices magma_dmalloc(&A_d, m*m); magma_dmalloc(&b_d, m);

33

MAGMA - Device• Example code for C:

#include<magma.h>#include<stdio.h>

int main(){ //Define Arrays and variables for MAGMA float b[3], A[3][3]; float *A_d, *b_d //Device pointers magma_int_t m = 3, n = 1, piv[3] ok;

//Fill matrices A and b and allocate device //matrices magma_dmalloc(&A_d, m*m); magma_dmalloc(&b_d, m);

34

MAGMA - Device• Example code for C:

//Transfer matrices to device magma_dsetmatrix(m,m,A,m,A_d,m); magma_dsetmatrix(m,n,b,m,b_d,m); //Call the device sgesv function magma_sgesv_gpu(m,n,A_d,m,piv,b_d,m,&info); //Copy back computed matrix magma_dgetmatrix(m,n,b_d,m,b,m); //Loop through and print out returned array b}

35

MAGMA - Device• Example code for C:

//Transfer matrices to device magma_dsetmatrix(m,m,A,m,A_d,m); magma_dsetmatrix(m,n,b,m,b_d,m); //Call the device sgesv function magma_sgesv_gpu(m,n,A_d,m,piv,b_d,m,&info); //Copy back computed matrix magma_dgetmatrix(m,n,b_d,m,b,m); //Loop through and print out returned array b}

36

MAGMA - Device• Example code for C:

//Transfer matrices to device magma_dsetmatrix(m,m,A,m,A_d,m); magma_dsetmatrix(m,n,b,m,b_d,m); //Call the device sgesv function magma_sgesv_gpu(m,n,A_d,m,piv,b_d,m,&info); //Copy back computed matrix magma_dgetmatrix(m,n,b_d,m,b,m); //Loop through and print out returned array b}

37

MAGMA - Host

• Before compiling, Make sure the MAGMA module, CUDA toolkit and the GNU programming environment is loaded

• To compile:$ module swap PrgEnv-pgi PrgEnv-gnu

$ module load cudatoolkit magma

$ cc –lcuda –lmagma –lmagmablas sgesv_gpu.c

top related