9 USE iso_c_binding,
ONLY: c_null_ptr, &
12#if defined(__SPLA) && defined(__OFFLOAD_GEMM)
14 USE iso_c_binding,
ONLY: c_associated, &
16 USE spla,
ONLY: spla_pu_host, &
20 spla_op_conj_transpose, &
27 spla_ctx_set_op_threshold_gpu, &
34#include "./base/base_uses.f90"
40 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'local_gemm_api'
45 INTEGER,
PARAMETER,
PUBLIC :: &
49 INTEGER,
PRIVATE :: do_dgemm = 1
52 TYPE(c_ptr) :: spla_context = c_null_ptr
54 PROCEDURE, pass(ctx), non_overridable :: create => local_gemm_create
55 PROCEDURE, pass(ctx), non_overridable :: destroy => local_gemm_destroy
56 PROCEDURE, pass(ctx), non_overridable :: set_op_threshold_gpu => local_gemm_set_op_threshold_gpu
57 PROCEDURE, pass(ctx), non_overridable :: gemm =>
local_gemm
80 alpha, A, lda, B, ldb, &
82 CHARACTER,
INTENT(in) :: opA
83 CHARACTER,
INTENT(in) :: opB
84 INTEGER,
INTENT(in) :: m
85 INTEGER,
INTENT(in) :: n
86 INTEGER,
INTENT(in) :: k
87 REAL(KIND=
dp),
INTENT(in) :: alpha
88#if defined(__SPLA) && defined(__OFFLOAD_GEMM)
89 REAL(KIND=
dp),
DIMENSION(*),
INTENT(in),
TARGET :: a
91 REAL(KIND=
dp),
DIMENSION(:, :),
INTENT(in),
TARGET :: a
93 INTEGER,
INTENT(in) :: lda
94#if defined(__SPLA) && defined(__OFFLOAD_GEMM)
95 REAL(KIND=
dp),
DIMENSION(*),
INTENT(in),
TARGET :: b
97 REAL(KIND=
dp),
DIMENSION(:, :),
INTENT(in),
TARGET :: b
100 INTEGER,
INTENT(in) :: ldb
101 REAL(KIND=
dp),
INTENT(in) :: beta
102#if defined(__SPLA) && defined(__OFFLOAD_GEMM)
103 REAL(KIND=
dp),
DIMENSION(*),
INTENT(inout),
TARGET ::c
105 REAL(KIND=
dp),
DIMENSION(:, :),
INTENT(inout),
TARGET :: c
107 INTEGER,
INTENT(in) :: ldc
112#if defined(__SPLA) && defined(__OFFLOAD_GEMM)
113 INTEGER :: spla_op_A, spla_op_B, spla_error
115 CHARACTER(LEN=*),
PARAMETER :: routineN =
'local_gemm'
116 CALL timeset(routinen, handle)
119#if defined(__SPLA) && defined(__OFFLOAD_GEMM)
122 IF (opa ==
'N') spla_op_a = spla_op_none
123 IF (opa ==
'T') spla_op_a = spla_op_transpose
125 IF (opb ==
'N') spla_op_b = spla_op_none
126 IF (opb ==
'T') spla_op_b = spla_op_transpose
129 cpassert(is_contiguous(a))
130 cpassert(is_contiguous(b))
131 cpassert(is_contiguous(c))
135 spla_error = spla_dgemm(spla_op_a, spla_op_b, &
139 beta, c_loc(c), ldc, ctx%spla_context)
140 IF (spla_error /= spla_success) &
141 cpabort(
"spla_dgemm failed: "//
cp_to_string(spla_error))
144 CALL dgemm(opa, opb, m, n, k, alpha, &
146 b, ldb, beta, c, ldc)
147#if defined(__SPLA) && defined(__OFFLOAD_GEMM)
152 CALL timestop(handle)
161 SUBROUTINE local_gemm_create(ctx, pu)
163 INTEGER,
INTENT(in) :: pu
165#if defined(__SPLA) && defined(__OFFLOAD_GEMM)
168 IF (.NOT. c_associated(ctx%spla_context))
THEN
172 error_ = spla_ctx_create(ctx%spla_context, pu)
173 IF (error_ /= spla_success) &
174 cpabort(
"spla_ctx_create failed: "//
cp_to_string(error_))
176 ctx%spla_context = c_null_ptr
181 ctx%spla_context = c_null_ptr
183 END SUBROUTINE local_gemm_create
189 SUBROUTINE local_gemm_destroy(ctx)
192#if defined(__SPLA) && defined(__OFFLOAD_GEMM)
198 error_ = spla_ctx_destroy(ctx%spla_context)
199 IF (error_ /= spla_success) &
200 cpabort(
"spla_ctx_destroy failed: "//
cp_to_string(error_))
203 ctx%spla_context = c_null_ptr
204 END SUBROUTINE local_gemm_destroy
211 SUBROUTINE local_gemm_set_op_threshold_gpu(ctx, opThresholdGPU)
213 INTEGER,
INTENT(in) :: opThresholdGPU
215#if defined(__SPLA) && defined(__OFFLOAD_GEMM)
219 error__ = spla_ctx_set_op_threshold_gpu(ctx%spla_context, opthresholdgpu)
222 mark_used(opthresholdgpu)
224 END SUBROUTINE local_gemm_set_op_threshold_gpu
231 INTEGER,
INTENT(IN) :: dgemm_library
233 do_dgemm = dgemm_library
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
integer, parameter, public dp
subroutine, public local_gemm_set_library(dgemm_library)
...
integer, parameter, public local_gemm_pu_gpu
subroutine local_gemm(opa, opb, m, n, k, alpha, a, lda, b, ldb, beta, c, ldc, ctx)
...
integer, parameter, public local_gemm_pu_host
Fortran API for the offload package, which is written in C.
subroutine, public offload_activate_chosen_device()
Activates the device selected via offload_set_chosen_device()