m_cuda_backend Module



Interfaces

public interface cuda_backend_t

  • public function init(mesh, allocator) result(backend)

    Arguments

    Type IntentOptional Attributes Name
    class(mesh_t), intent(inout), target :: mesh
    class(allocator_t), intent(inout), target :: allocator

    Return Value type(cuda_backend_t)


Derived Types

type, public, extends(base_backend_t) ::  cuda_backend_t

Components

Type Visibility Attributes Name Initial
real(kind=dp), public :: nu
class(mesh_t), public, pointer :: mesh
class(allocator_t), public, pointer :: allocator
class(poisson_fft_t), public, pointer :: poisson_fft
integer, public :: MPI_FP_PREC = dp
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: u_recv_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: u_recv_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: u_send_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: u_send_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: v_recv_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: v_recv_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: v_send_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: v_send_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: w_recv_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: w_recv_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: w_send_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: w_send_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: du_send_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: du_send_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: du_recv_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: du_recv_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: dud_send_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: dud_send_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: dud_recv_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: dud_recv_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: d2u_send_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: d2u_send_e_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: d2u_recv_s_dev
real(kind=dp), public, device, allocatable, dimension(:, :, :) :: d2u_recv_e_dev
type(dim3), public :: xblocks
type(dim3), public :: xthreads
type(dim3), public :: yblocks
type(dim3), public :: ythreads
type(dim3), public :: zblocks
type(dim3), public :: zthreads

Constructor

public function init (mesh, allocator)

Type-Bound Procedures

procedure, public :: base_init
procedure, public :: get_field_data
procedure, public :: set_field_data
procedure, public :: alloc_tdsops => alloc_cuda_tdsops
procedure, public :: transeq_x => transeq_x_cuda
procedure, public :: transeq_y => transeq_y_cuda
procedure, public :: transeq_z => transeq_z_cuda
procedure, public :: tds_solve => tds_solve_cuda
procedure, public :: reorder => reorder_cuda
procedure, public :: sum_yintox => sum_yintox_cuda
procedure, public :: sum_zintox => sum_zintox_cuda
procedure, public :: vecadd => vecadd_cuda
procedure, public :: scalar_product => scalar_product_cuda
procedure, public :: copy_data_to_f => copy_data_to_f_cuda
procedure, public :: copy_f_to_data => copy_f_to_data_cuda
procedure, public :: init_poisson_fft => init_cuda_poisson_fft
procedure, public :: transeq_cuda_dist
procedure, public :: transeq_cuda_thom
procedure, public :: tds_solve_dist

Functions

public function init(mesh, allocator) result(backend)

Arguments

Type IntentOptional Attributes Name
class(mesh_t), intent(inout), target :: mesh
class(allocator_t), intent(inout), target :: allocator

Return Value type(cuda_backend_t)

public function scalar_product_cuda(self, x, y) result(s)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(in) :: x
class(field_t), intent(in) :: y

Return Value real(kind=dp)


Subroutines

public subroutine alloc_cuda_tdsops(self, tdsops, dir, operation, scheme, n_halo, from_to, bc_start, bc_end, sym, c_nu, nu0_nu)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(tdsops_t), intent(inout), allocatable :: tdsops
integer, intent(in) :: dir
character(len=*), intent(in) :: operation
character(len=*), intent(in) :: scheme
integer, intent(in), optional :: n_halo
character(len=*), intent(in), optional :: from_to
character(len=*), intent(in), optional :: bc_start
character(len=*), intent(in), optional :: bc_end
logical, intent(in), optional :: sym
real(kind=dp), intent(in), optional :: c_nu
real(kind=dp), intent(in), optional :: nu0_nu

public subroutine transeq_x_cuda(self, du, dv, dw, u, v, w, dirps)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(inout) :: du
class(field_t), intent(inout) :: dv
class(field_t), intent(inout) :: dw
class(field_t), intent(in) :: u
class(field_t), intent(in) :: v
class(field_t), intent(in) :: w
type(dirps_t), intent(in) :: dirps

public subroutine transeq_y_cuda(self, du, dv, dw, u, v, w, dirps)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(inout) :: du
class(field_t), intent(inout) :: dv
class(field_t), intent(inout) :: dw
class(field_t), intent(in) :: u
class(field_t), intent(in) :: v
class(field_t), intent(in) :: w
type(dirps_t), intent(in) :: dirps

public subroutine transeq_z_cuda(self, du, dv, dw, u, v, w, dirps)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(inout) :: du
class(field_t), intent(inout) :: dv
class(field_t), intent(inout) :: dw
class(field_t), intent(in) :: u
class(field_t), intent(in) :: v
class(field_t), intent(in) :: w
type(dirps_t), intent(in) :: dirps

public subroutine transeq_cuda_dist(self, du, dv, dw, u, v, w, dirps, blocks, threads)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(inout) :: du
class(field_t), intent(inout) :: dv
class(field_t), intent(inout) :: dw
class(field_t), intent(in) :: u
class(field_t), intent(in) :: v
class(field_t), intent(in) :: w
type(dirps_t), intent(in) :: dirps
type(dim3), intent(in) :: blocks
type(dim3), intent(in) :: threads

public subroutine transeq_cuda_thom(self, du, dv, dw, u, v, w, dirps)

Thomas algorithm implementation. So much more easier than the distributed algorithm. It is intended to work only on a single rank so there is no MPI communication.

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(inout) :: du
class(field_t), intent(inout) :: dv
class(field_t), intent(inout) :: dw
class(field_t), intent(in) :: u
class(field_t), intent(in) :: v
class(field_t), intent(in) :: w
type(dirps_t), intent(in) :: dirps

public subroutine tds_solve_cuda(self, du, u, tdsops)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(inout) :: du
class(field_t), intent(in) :: u
class(tdsops_t), intent(in) :: tdsops

public subroutine tds_solve_dist(self, du, u, tdsops, blocks, threads)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(inout) :: du
class(field_t), intent(in) :: u
class(tdsops_t), intent(in) :: tdsops
type(dim3), intent(in) :: blocks
type(dim3), intent(in) :: threads

public subroutine reorder_cuda(self, u_o, u_i, direction)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(inout) :: u_o
class(field_t), intent(in) :: u_i
integer, intent(in) :: direction

public subroutine sum_yintox_cuda(self, u, u_y)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(inout) :: u
class(field_t), intent(in) :: u_y

public subroutine sum_zintox_cuda(self, u, u_z)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(field_t), intent(inout) :: u
class(field_t), intent(in) :: u_z

public subroutine vecadd_cuda(self, a, x, b, y)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
real(kind=dp), intent(in) :: a
class(field_t), intent(in) :: x
real(kind=dp), intent(in) :: b
class(field_t), intent(inout) :: y

public subroutine copy_into_buffers(u_send_s_dev, u_send_e_dev, u_dev, n)

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(out), device, dimension(:, :, :) :: u_send_s_dev
real(kind=dp), intent(out), device, dimension(:, :, :) :: u_send_e_dev
real(kind=dp), intent(in), device, dimension(:, :, :) :: u_dev
integer, intent(in) :: n

public subroutine copy_data_to_f_cuda(self, f, data)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t), intent(inout) :: self
class(field_t), intent(inout) :: f
real(kind=dp), intent(inout), dimension(:, :, :) :: data

public subroutine copy_f_to_data_cuda(self, data, f)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t), intent(inout) :: self
real(kind=dp), intent(out), dimension(:, :, :) :: data
class(field_t), intent(in) :: f

public subroutine init_cuda_poisson_fft(self, mesh, xdirps, ydirps, zdirps)

Arguments

Type IntentOptional Attributes Name
class(cuda_backend_t) :: self
class(mesh_t), intent(in) :: mesh
type(dirps_t), intent(in) :: xdirps
type(dirps_t), intent(in) :: ydirps
type(dirps_t), intent(in) :: zdirps

public subroutine resolve_field_t(u_dev, u)

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(out), device, pointer, dimension(:, :, :) :: u_dev
class(field_t), intent(in) :: u