Octopus
accel_blas.F90
Go to the documentation of this file.
1!! Copyright (C) 2016 X. Andrade
2!!
3!! This program is free software; you can redistribute it and/or modify
4!! it under the terms of the GNU General Public License as published by
5!! the Free Software Foundation; either version 2, or (at your option)
6!! any later version.
7!!
8!! This program is distributed in the hope that it will be useful,
9!! but WITHOUT ANY WARRANTY; without even the implied warranty of
10!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11!! GNU General Public License for more details.
12!!
13!! You should have received a copy of the GNU General Public License
14!! along with this program; if not, write to the Free Software
15!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16!! 02110-1301, USA.
17!!
18
19#include <global.h>
20
22 use accel_oct_m
23#ifdef HAVE_CUDA
24 use cuda_oct_m
25#endif
26 use debug_oct_m
27 use global_oct_m
28 use iso_c_binding
30 use types_oct_m
31
32 implicit none
33
34 private
35
36 public :: &
37 daccel_dot, &
38 zaccel_dot, &
51
52#if defined(HAVE_CUDA)
53 integer, parameter, public :: &
54 ACCEL_BLAS_LEFT = cublas_side_left, &
56
57 integer, parameter, public :: &
58 ACCEL_BLAS_LOWER = cublas_fill_mode_lower, &
60
61 integer, parameter, public :: &
62 ACCEL_BLAS_N = cublas_op_n, &
65
66 integer, parameter, public :: &
67 ACCEL_BLAS_DIAG_NON_UNIT = cublas_diag_non_unit, &
69#else
70 integer, parameter, public :: &
71 ACCEL_BLAS_LEFT = 0, &
73
74 integer, parameter, public :: &
75 ACCEL_BLAS_LOWER = 0, &
77
78 integer, parameter, public :: &
79 ACCEL_BLAS_N = 0, &
80 accel_blas_t = 1, &
81 accel_blas_c = 2
82
83 integer, parameter, public :: &
84 ACCEL_BLAS_DIAG_NON_UNIT = 0, &
86
87#endif
88
89 ! DOT
90 interface
91 subroutine cuda_blas_ddot(handle, n, x, offx, incx, y, offy, incy, res, offres)
92 use iso_c_binding
93 use, intrinsic :: iso_fortran_env
94
95 implicit none
96
97 type(c_ptr), intent(in) :: handle
98 integer(int64), intent(in) :: n
99 type(c_ptr), intent(in) :: x
100 integer(int64), intent(in) :: offx
101 integer(int64), intent(in) :: incx
102 type(c_ptr), intent(in) :: y
103 integer(int64), intent(in) :: offy
104 integer(int64), intent(in) :: incy
105 type(c_ptr), intent(inout) :: res
106 integer(int64), intent(in) :: offres
107 end subroutine cuda_blas_ddot
108
109 subroutine cuda_blas_zdotc(handle, n, x, offx, incx, y, offy, incy, res, offres)
110 use iso_c_binding
111 use, intrinsic :: iso_fortran_env
112
113 implicit none
114
115 type(c_ptr), intent(in) :: handle
116 integer(int64), intent(in) :: n
117 type(c_ptr), intent(in) :: x
118 integer(int64), intent(in) :: offx
119 integer(int64), intent(in) :: incx
120 type(c_ptr), intent(in) :: y
121 integer(int64), intent(in) :: offy
122 integer(int64), intent(in) :: incy
123 type(c_ptr), intent(inout) :: res
124 integer(int64), intent(in) :: offres
125 end subroutine cuda_blas_zdotc
126
127 subroutine cuda_blas_zdotu(handle, n, x, offx, incx, y, offy, incy, res, offres)
128 use iso_c_binding
129 use, intrinsic :: iso_fortran_env
130
131 implicit none
132
133 type(c_ptr), intent(in) :: handle
134 integer(int64), intent(in) :: n
135 type(c_ptr), intent(in) :: x
136 integer(int64), intent(in) :: offx
137 integer(int64), intent(in) :: incx
138 type(c_ptr), intent(in) :: y
139 integer(int64), intent(in) :: offy
140 integer(int64), intent(in) :: incy
141 type(c_ptr), intent(inout) :: res
142 integer(int64), intent(in) :: offres
143 end subroutine cuda_blas_zdotu
144 end interface
145
146 ! NRM2
147 interface
148 subroutine cuda_blas_dnrm2(handle, n, x, offx, incx, res, offres)
149 use iso_c_binding
150 use, intrinsic :: iso_fortran_env
152 implicit none
153
154 type(c_ptr), intent(in) :: handle
155 integer(int64), intent(in) :: n
156 type(c_ptr), intent(in) :: x
157 integer(int64), intent(in) :: offx
158 integer(int64), intent(in) :: incx
159 type(c_ptr), intent(inout) :: res
160 integer(int64), intent(in) :: offres
161 end subroutine cuda_blas_dnrm2
162
163 subroutine cuda_blas_znrm2(handle, n, x, offx, incx, res, offres)
164 use iso_c_binding
165 use, intrinsic :: iso_fortran_env
166
167 implicit none
169 type(c_ptr), intent(in) :: handle
170 integer(int64), intent(in) :: n
171 type(c_ptr), intent(in) :: x
172 integer(int64), intent(in) :: offx
173 integer(int64), intent(in) :: incx
174 type(c_ptr), intent(inout) :: res
175 integer(int64), intent(in) :: offres
176 end subroutine cuda_blas_znrm2
177 end interface
178
179 ! GEMM
180 interface
181 subroutine cuda_blas_dgemm(handle, transa, transb, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc)
182 use iso_c_binding
183 use, intrinsic :: iso_fortran_env
184
185 implicit none
187 type(c_ptr), intent(in) :: handle
188 integer, intent(in) :: transa
189 integer, intent(in) :: transb
190 integer(int64), intent(in) :: m
191 integer(int64), intent(in) :: n
192 integer(int64), intent(in) :: k
193 type(c_ptr), intent(in) :: alpha
194 type(c_ptr), intent(in) :: A
195 integer(int64), intent(in) :: lda
196 type(c_ptr), intent(in) :: B
197 integer(int64), intent(in) :: ldb
198 type(c_ptr), intent(in) :: beta
199 type(c_ptr), intent(inout) :: C
200 integer(int64), intent(in) :: ldc
201 end subroutine cuda_blas_dgemm
202
203 subroutine cuda_blas_zgemm(handle, transa, transb, m, n, k, alpha, A, lda, B, ldb, beta, C, ldc)
204 use iso_c_binding
205 use, intrinsic :: iso_fortran_env
206
207 implicit none
208
209 type(c_ptr), intent(in) :: handle
210 integer, intent(in) :: transa
211 integer, intent(in) :: transb
212 integer(int64), intent(in) :: m
213 integer(int64), intent(in) :: n
214 integer(int64), intent(in) :: k
215 type(c_ptr), intent(in) :: alpha
216 type(c_ptr), intent(in) :: A
217 integer(int64), intent(in) :: lda
218 type(c_ptr), intent(in) :: B
219 integer(int64), intent(in) :: ldb
220 type(c_ptr), intent(in) :: beta
221 type(c_ptr), intent(inout) :: C
222 integer(int64), intent(in) :: ldc
223 end subroutine cuda_blas_zgemm
224 end interface
226
227 ! GEMV
228 interface
229 subroutine cuda_blas_dgemv(handle, transa, m, n, alpha, A, lda, x, incx, beta, y, incy)
230 use iso_c_binding
231 use, intrinsic :: iso_fortran_env
232
233 implicit none
234
235 type(c_ptr), intent(in) :: handle
236 integer, intent(in) :: transa
237 integer(int64), intent(in) :: m
238 integer(int64), intent(in) :: n
239 type(c_ptr), intent(in) :: alpha
240 type(c_ptr), intent(in) :: A
241 integer(int64), intent(in) :: lda
242 type(c_ptr), intent(in) :: x
243 integer(int64), intent(in) :: incx
244 type(c_ptr), intent(in) :: beta
245 type(c_ptr), intent(inout) :: y
246 integer(int64), intent(in) :: incy
247 end subroutine cuda_blas_dgemv
248
249 subroutine cuda_blas_zgemv(handle, transa, m, n, alpha, A, lda, x, incx, beta, y, incy)
250 use iso_c_binding
251 use, intrinsic :: iso_fortran_env
252
253 implicit none
254
255 type(c_ptr), intent(in) :: handle
256 integer, intent(in) :: transa
257 integer(int64), intent(in) :: m
258 integer(int64), intent(in) :: n
259 type(c_ptr), intent(in) :: alpha
260 type(c_ptr), intent(in) :: A
261 integer(int64), intent(in) :: lda
262 type(c_ptr), intent(in) :: x
263 integer(int64), intent(in) :: incx
264 type(c_ptr), intent(in) :: beta
265 type(c_ptr), intent(inout) :: y
266 integer(int64), intent(in) :: incy
267 end subroutine cuda_blas_zgemv
268 end interface
269 ! SYRK/HERK
270 interface
271 subroutine cuda_blas_dsyrk(handle, uplo, trans, n, k, alpha, A, lda, beta, C, ldc)
272 use iso_c_binding
273 use, intrinsic :: iso_fortran_env
274
275 implicit none
276
277 type(c_ptr), intent(in) :: handle
278 integer, intent(in) :: uplo
279 integer, intent(in) :: trans
280 integer(int64), intent(in) :: n
281 integer(int64), intent(in) :: k
282 type(c_ptr), intent(in) :: alpha
283 type(c_ptr), intent(in) :: A
284 integer(int64), intent(in) :: lda
285 type(c_ptr), intent(in) :: beta
286 type(c_ptr), intent(inout) :: C
287 integer(int64), intent(in) :: ldc
288 end subroutine cuda_blas_dsyrk
289
290 subroutine cuda_blas_zherk(handle, uplo, trans, n, k, alpha, A, lda, beta, C, ldc)
291 use iso_c_binding
292 use, intrinsic :: iso_fortran_env
293
294 implicit none
295
296 type(c_ptr), intent(in) :: handle
297 integer, intent(in) :: uplo
298 integer, intent(in) :: trans
299 integer(int64), intent(in) :: n
300 integer(int64), intent(in) :: k
301 type(c_ptr), intent(in) :: alpha
302 type(c_ptr), intent(in) :: A
303 integer(int64), intent(in) :: lda
304 type(c_ptr), intent(in) :: beta
305 type(c_ptr), intent(inout) :: C
306 integer(int64), intent(in) :: ldc
307 end subroutine cuda_blas_zherk
308 end interface
309
310 ! TRSM
311 interface
312 subroutine cuda_blas_dtrsm(handle, side, uplo, trans, diag, m, n, alpha, A, lda, B, ldb)
313 use iso_c_binding
314 use, intrinsic :: iso_fortran_env
315
316 implicit none
317
318 type(c_ptr), intent(in) :: handle
319 integer, intent(in) :: side
320 integer, intent(in) :: uplo
321 integer, intent(in) :: trans
322 integer, intent(in) :: diag
323 integer(int64), intent(in) :: m
324 integer(int64), intent(in) :: n
325 type(c_ptr), intent(in) :: alpha
326 type(c_ptr), intent(in) :: A
327 integer(int64), intent(in) :: lda
328 type(c_ptr), intent(inout) :: B
329 integer(int64), intent(in) :: ldb
330 end subroutine cuda_blas_dtrsm
331
332 subroutine cuda_blas_ztrsm(handle, side, uplo, trans, diag, m, n, alpha, A, lda, B, ldb)
333 use iso_c_binding
334 use, intrinsic :: iso_fortran_env
335
336 implicit none
337
338 type(c_ptr), intent(in) :: handle
339 integer, intent(in) :: side
340 integer, intent(in) :: uplo
341 integer, intent(in) :: trans
342 integer, intent(in) :: diag
343 integer(int64), intent(in) :: m
344 integer(int64), intent(in) :: n
345 type(c_ptr), intent(in) :: alpha
346 type(c_ptr), intent(in) :: A
347 integer(int64), intent(in) :: lda
348 type(c_ptr), intent(inout) :: B
349 integer(int64), intent(in) :: ldb
350 end subroutine cuda_blas_ztrsm
351 end interface
352
353contains
354
355#include "undef.F90"
356#include "complex.F90"
357#include "accel_blas_inc.F90"
358
359#include "undef.F90"
360#include "real.F90"
361#include "accel_blas_inc.F90"
362
363end module accel_blas_oct_m
integer, parameter, public accel_blas_diag_unit
Definition: accel_blas.F90:160
subroutine, public zaccel_trsm(side, uplo, trans, diag, m, n, alpha, a, offa, lda, b, offb, ldb)
Definition: accel_blas.F90:526
subroutine, public daccel_gemv(transa, m, n, alpha, A, lda, x, incx, beta, y, incy)
Definition: accel_blas.F90:890
subroutine, public daccel_dot(n, x, offx, incx, y, offy, incy, res, offres)
Definition: accel_blas.F90:832
subroutine, public daccel_gemm(transa, transb, m, n, k, alpha, A, offa, lda, B, offb, ldb, beta, C, offc, ldc, async)
Definition: accel_blas.F90:801
subroutine, public daccel_nrm2(n, x, offx, incx, res, offres)
Definition: accel_blas.F90:870
subroutine, public daccel_trsm(side, uplo, trans, diag, m, n, alpha, a, offa, lda, b, offb, ldb)
Definition: accel_blas.F90:766
subroutine, public zaccel_nrm2(n, x, offx, incx, res, offres)
Definition: accel_blas.F90:630
integer, parameter, public accel_blas_right
Definition: accel_blas.F90:147
subroutine, public daccel_dotu(n, x, offx, incx, y, offy, incy, res, offres)
Definition: accel_blas.F90:851
subroutine, public daccel_herk(uplo, trans, n, k, alpha, a, offa, lda, beta, c, offc, ldc)
Definition: accel_blas.F90:740
subroutine, public zaccel_gemv(transa, m, n, alpha, A, lda, x, incx, beta, y, incy)
Definition: accel_blas.F90:650
subroutine, public zaccel_dotu(n, x, offx, incx, y, offy, incy, res, offres)
Definition: accel_blas.F90:611
integer, parameter, public accel_blas_upper
Definition: accel_blas.F90:151
integer, parameter, public accel_blas_t
Definition: accel_blas.F90:155
subroutine, public zaccel_gemm(transa, transb, m, n, k, alpha, A, offa, lda, B, offb, ldb, beta, C, offc, ldc, async)
Definition: accel_blas.F90:561
integer, parameter, public accel_blas_c
Definition: accel_blas.F90:155
subroutine, public zaccel_herk(uplo, trans, n, k, alpha, a, offa, lda, beta, c, offc, ldc)
Definition: accel_blas.F90:500
subroutine, public zaccel_dot(n, x, offx, incx, y, offy, incy, res, offres)
Definition: accel_blas.F90:592
integer, parameter, public cublas_side_left
Definition: cuda.F90:189
integer, parameter, public cublas_fill_mode_upper
Definition: cuda.F90:180
integer, parameter, public cublas_op_n
Definition: cuda.F90:169
integer, parameter, public cublas_op_c
Definition: cuda.F90:169
integer, parameter, public cublas_diag_non_unit
Definition: cuda.F90:160
integer, parameter, public cublas_op_t
Definition: cuda.F90:169
integer, parameter, public cublas_fill_mode_lower
Definition: cuda.F90:180
integer, parameter, public cublas_side_right
Definition: cuda.F90:189
integer, parameter, public cublas_diag_unit
Definition: cuda.F90:160