15 USE iso_c_binding,
ONLY: c_char,&
30#include "./base/base_uses.f90"
35 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'parallel_gemm_api'
40 MODULE PROCEDURE parallel_gemm_fm
41 MODULE PROCEDURE parallel_gemm_cfm
65 SUBROUTINE parallel_gemm_fm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, &
66 matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, &
67 c_first_col, c_first_row)
68 CHARACTER(LEN=1),
INTENT(IN) :: transa, transb
69 INTEGER,
INTENT(IN) :: m, n, k
70 REAL(KIND=
dp),
INTENT(IN) :: alpha
71 TYPE(
cp_fm_type),
INTENT(IN) :: matrix_a, matrix_b
72 REAL(kind=
dp),
INTENT(IN) :: beta
74 INTEGER,
INTENT(IN),
OPTIONAL :: a_first_col, a_first_row, b_first_col, &
75 b_first_row, c_first_col, c_first_row
77 CHARACTER(len=*),
PARAMETER :: routinen =
'parallel_gemm_fm'
79 INTEGER :: cfc, cfr, handle, my_multi
86 SELECT CASE (my_multi)
88 CALL timeset(routinen//
"_gemm", handle)
89 CALL cp_fm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, &
90 a_first_col=a_first_col, &
91 a_first_row=a_first_row, &
92 b_first_col=b_first_col, &
93 b_first_row=b_first_row, &
94 c_first_col=c_first_col, &
95 c_first_row=c_first_row)
98 CALL timeset(routinen//
"_cosma", handle)
102 IF (beta == 0.0_dp)
THEN
105 IF (
PRESENT(c_first_row)) cfr = c_first_row
106 IF (
PRESENT(c_first_col)) cfc = c_first_col
110 CALL cosma_pdgemm(transa=transa, transb=transb, m=m, n=n, k=k, alpha=alpha, &
111 matrix_a=matrix_a, matrix_b=matrix_b, beta=beta, matrix_c=matrix_c, &
112 a_first_col=a_first_col, &
113 a_first_row=a_first_row, &
114 b_first_col=b_first_col, &
115 b_first_row=b_first_row, &
116 c_first_col=c_first_col, &
117 c_first_row=c_first_row)
119 cpabort(
"CP2K compiled without the COSMA library.")
122 CALL timestop(handle)
124 END SUBROUTINE parallel_gemm_fm
145 SUBROUTINE parallel_gemm_cfm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, &
146 matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, &
147 c_first_col, c_first_row)
148 CHARACTER(LEN=1),
INTENT(IN) :: transa, transb
149 INTEGER,
INTENT(IN) :: m, n, k
150 COMPLEX(KIND=dp),
INTENT(IN) :: alpha
151 TYPE(
cp_cfm_type),
INTENT(IN) :: matrix_a, matrix_b
152 COMPLEX(KIND=dp),
INTENT(IN) :: beta
154 INTEGER,
INTENT(IN),
OPTIONAL :: a_first_col, a_first_row, b_first_col, &
155 b_first_row, c_first_col, c_first_row
157 CHARACTER(len=*),
PARAMETER :: routineN =
'parallel_gemm_cfm'
159 INTEGER :: handle, handle1, my_multi
161 CALL timeset(routinen, handle)
165 SELECT CASE (my_multi)
167 CALL timeset(routinen//
"_gemm", handle1)
168 CALL cp_cfm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, &
169 a_first_col=a_first_col, &
170 a_first_row=a_first_row, &
171 b_first_col=b_first_col, &
172 b_first_row=b_first_row, &
173 c_first_col=c_first_col, &
174 c_first_row=c_first_row)
175 CALL timestop(handle1)
178 CALL timeset(routinen//
"_cosma", handle1)
180 CALL cosma_pzgemm(transa=transa, transb=transb, m=m, n=n, k=k, alpha=alpha, &
181 matrix_a=matrix_a, matrix_b=matrix_b, beta=beta, matrix_c=matrix_c, &
182 a_first_col=a_first_col, &
183 a_first_row=a_first_row, &
184 b_first_col=b_first_col, &
185 b_first_row=b_first_row, &
186 c_first_col=c_first_col, &
187 c_first_row=c_first_row)
188 CALL timestop(handle1)
190 cpabort(
"CP2K compiled without the COSMA library.")
193 CALL timestop(handle)
195 END SUBROUTINE parallel_gemm_cfm
218 SUBROUTINE cosma_pdgemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, &
219 a_first_col, a_first_row, b_first_col, b_first_row, &
220 c_first_col, c_first_row)
221 CHARACTER(LEN=1),
INTENT(IN) :: transa, transb
222 INTEGER,
INTENT(IN) :: m, n, k
223 REAL(KIND=
dp),
INTENT(IN) :: alpha
224 TYPE(
cp_fm_type),
INTENT(IN) :: matrix_a, matrix_b
225 REAL(kind=
dp),
INTENT(IN) :: beta
227 INTEGER,
INTENT(IN),
OPTIONAL :: a_first_col, a_first_row, b_first_col, &
228 b_first_row, c_first_col, c_first_row
230 INTEGER :: i_a, i_b, i_c, j_a, j_b, j_c
232 SUBROUTINE cosma_pdgemm_c(transa, transb, m, n, k, alpha, a, ia, ja, desca, &
233 b, ib, jb, descb, beta, c, ic, jc, descc) &
234 BIND(C, name="cosma_pdgemm")
235 IMPORT :: c_ptr, c_int, c_double, c_char
236 CHARACTER(KIND=C_CHAR) :: transa
237 CHARACTER(KIND=C_CHAR) :: transb
238 INTEGER(KIND=C_INT) :: m
239 INTEGER(KIND=C_INT) :: n
240 INTEGER(KIND=C_INT) :: k
241 REAL(kind=c_double) :: alpha
242 TYPE(c_ptr),
VALUE :: a
243 INTEGER(KIND=C_INT) :: ia
244 INTEGER(KIND=C_INT) :: ja
245 TYPE(c_ptr),
VALUE :: desca
246 TYPE(c_ptr),
VALUE :: b
247 INTEGER(KIND=C_INT) :: ib
248 INTEGER(KIND=C_INT) :: jb
249 TYPE(c_ptr),
VALUE :: descb
250 REAL(KIND=c_double) :: beta
251 TYPE(c_ptr),
VALUE :: c
252 INTEGER(KIND=C_INT) :: ic
253 INTEGER(KIND=C_INT) :: jc
254 TYPE(c_ptr),
VALUE :: descc
255 END SUBROUTINE cosma_pdgemm_c
258 IF (
PRESENT(a_first_row))
THEN
263 IF (
PRESENT(a_first_col))
THEN
268 IF (
PRESENT(b_first_row))
THEN
273 IF (
PRESENT(b_first_col))
THEN
278 IF (
PRESENT(c_first_row))
THEN
283 IF (
PRESENT(c_first_col))
THEN
289 CALL cosma_pdgemm_c(transa=transa, transb=transb, m=m, n=n, k=k, &
291 a=c_loc(matrix_a%local_data(1, 1)), ia=i_a, ja=j_a, &
292 desca=c_loc(matrix_a%matrix_struct%descriptor(1)), &
293 b=c_loc(matrix_b%local_data(1, 1)), ib=i_b, jb=j_b, &
294 descb=c_loc(matrix_b%matrix_struct%descriptor(1)), &
296 c=c_loc(matrix_c%local_data(1, 1)), ic=i_c, jc=j_c, &
297 descc=c_loc(matrix_c%matrix_struct%descriptor(1)))
299 END SUBROUTINE cosma_pdgemm
321 SUBROUTINE cosma_pzgemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, &
322 a_first_col, a_first_row, b_first_col, b_first_row, &
323 c_first_col, c_first_row)
324 CHARACTER(LEN=1),
INTENT(IN) :: transa, transb
325 INTEGER,
INTENT(IN) :: m, n, k
326 COMPLEX(KIND=dp),
INTENT(IN) :: alpha
327 TYPE(
cp_cfm_type),
INTENT(IN) :: matrix_a, matrix_b
328 COMPLEX(KIND=dp),
INTENT(IN) :: beta
330 INTEGER,
INTENT(IN),
OPTIONAL :: a_first_col, a_first_row, b_first_col, &
331 b_first_row, c_first_col, c_first_row
333 INTEGER :: i_a, i_b, i_c, j_a, j_b, j_c
334 REAL(KIND=
dp),
DIMENSION(2),
TARGET :: alpha_t, beta_t
336 SUBROUTINE cosma_pzgemm_c(transa, transb, m, n, k, alpha, a, ia, ja, desca, &
337 b, ib, jb, descb, beta, c, ic, jc, descc) &
338 BIND(C, name="cosma_pzgemm")
339 IMPORT :: c_ptr, c_int, c_char
340 CHARACTER(KIND=C_CHAR) :: transa
341 CHARACTER(KIND=C_CHAR) :: transb
342 INTEGER(KIND=C_INT) :: m
343 INTEGER(KIND=C_INT) :: n
344 INTEGER(KIND=C_INT) :: k
345 TYPE(c_ptr),
VALUE :: alpha
346 TYPE(c_ptr),
VALUE :: a
347 INTEGER(KIND=C_INT) :: ia
348 INTEGER(KIND=C_INT) :: ja
349 TYPE(c_ptr),
VALUE :: desca
350 TYPE(c_ptr),
VALUE :: b
351 INTEGER(KIND=C_INT) :: ib
352 INTEGER(KIND=C_INT) :: jb
353 TYPE(c_ptr),
VALUE :: descb
354 TYPE(c_ptr),
VALUE :: beta
355 TYPE(c_ptr),
VALUE :: c
356 INTEGER(KIND=C_INT) :: ic
357 INTEGER(KIND=C_INT) :: jc
358 TYPE(c_ptr),
VALUE :: descc
359 END SUBROUTINE cosma_pzgemm_c
362 IF (
PRESENT(a_first_row))
THEN
367 IF (
PRESENT(a_first_col))
THEN
372 IF (
PRESENT(b_first_row))
THEN
377 IF (
PRESENT(b_first_col))
THEN
382 IF (
PRESENT(c_first_row))
THEN
387 IF (
PRESENT(c_first_col))
THEN
393 alpha_t(1) = real(alpha, kind=
dp)
394 alpha_t(2) = real(aimag(alpha), kind=
dp)
395 beta_t(1) = real(beta, kind=
dp)
396 beta_t(2) = real(aimag(beta), kind=
dp)
398 CALL cosma_pzgemm_c(transa=transa, transb=transb, m=m, n=n, k=k, &
399 alpha=c_loc(alpha_t), &
400 a=c_loc(matrix_a%local_data(1, 1)), ia=i_a, ja=j_a, &
401 desca=c_loc(matrix_a%matrix_struct%descriptor(1)), &
402 b=c_loc(matrix_b%local_data(1, 1)), ib=i_b, jb=j_b, &
403 descb=c_loc(matrix_b%matrix_struct%descriptor(1)), &
404 beta=c_loc(beta_t), &
405 c=c_loc(matrix_c%local_data(1, 1)), ic=i_c, jc=j_c, &
406 descc=c_loc(matrix_c%matrix_struct%descriptor(1)))
408 END SUBROUTINE cosma_pzgemm
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, c_first_col, c_first_row)
Performs one of the matrix-matrix operations: matrix_c = alpha * op1( matrix_a ) * op2( matrix_b ) + ...
Represents a complex full matrix distributed on many processors.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_gemm(transa, transb, m, n, k, alpha, matrix_a, matrix_b, beta, matrix_c, a_first_col, a_first_row, b_first_col, b_first_row, c_first_col, c_first_row)
computes matrix_c = beta * matrix_c + alpha * ( matrix_a ** transa ) * ( matrix_b ** transb )
represent a full matrix distributed on many processors
integer function, public cp_fm_get_mm_type()
...
subroutine, public cp_fm_set_all_submatrix(fm, new_value, start_row, start_col, n_rows, n_cols)
sets a submatrix of a full matrix to a given value fm(start_row:start_row+n_rows,start_col:start_col+...
Defines the basic variable types.
integer, parameter, public dp
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()
basic linear algebra operations for full matrixes
Represent a complex full matrix.