Line data Source code
1 : !{\src2tex{textfont=tt}}
2 : !!****f* m_abi_linalg/abi_xaxpy
3 : !! NAME
4 : !! abi_xaxpy
5 : !!
6 : !! FUNCTION
7 : !! abi_xaxpy is the generic function for BLAS-1 AXPY (y = alpha * x + y)
8 : !! with optional GPU dispatch.
9 : !!
10 : !! COPYRIGHT
11 : !! Copyright (C) 2001-2026 ABINIT group
12 : !! This file is distributed under the terms of the
13 : !! GNU General Public License, see ~abinit/COPYING
14 : !! or http://www.gnu.org/copyleft/gpl.txt .
15 : !!
16 : !! SOURCE
17 :
18 : !!***
19 :
20 : !----------------------------------------------------------------------
21 :
22 : !!****f* m_abi_linalg/abi_daxpy
23 : !! NAME
24 : !! abi_daxpy
25 : !!
26 : !! FUNCTION
27 : !! Real AXPY: y = alpha * x + y, with real(dp) alpha and real(dp) arrays.
28 : !! On GPU, calls abi_gpu_xaxpy_cptr with cplx=1.
29 : !!
30 : !! INPUTS
31 : !!
32 : !! SOURCE
33 :
34 0 : subroutine abi_daxpy(n, alpha, x, incx, y, incy, gpu_option)
35 :
36 : !Arguments ------------------------------------
37 : integer, intent(in) :: n
38 : real(dp), intent(in) :: alpha
39 : real(dp), target, intent(in) :: x(*)
40 : integer, intent(in) :: incx
41 : real(dp), target, intent(inout) :: y(*)
42 : integer, intent(in) :: incy
43 : !Optionals -----------------------------------
44 : integer, intent(in), optional :: gpu_option
45 :
46 : !Local variables-------------------------------
47 : integer :: gpu_option_
48 :
49 : ! *********************************************************************
50 :
51 0 : gpu_option_=ABI_GPU_DISABLED ; if(PRESENT(gpu_option)) gpu_option_ = gpu_option
52 :
53 0 : call abi_d2zaxpy(n, dcmplx(alpha, 0.0_dp), x, incx, y, incy, x_cplx=1, gpu_option=gpu_option_)
54 :
55 0 : end subroutine abi_daxpy
56 : !!***
57 :
58 : !----------------------------------------------------------------------
59 :
60 : !!****f* m_abi_linalg/abi_daxpy_2d
61 : !! NAME
62 : !! abi_daxpy_2d
63 : !!
64 : !! FUNCTION
65 : !! Real AXPY: y = alpha * x + y, with real(dp) alpha and real(dp) arrays.
66 : !! On GPU, calls abi_gpu_xaxpy_cptr with cplx=1.
67 : !!
68 : !! INPUTS
69 : !!
70 : !! SOURCE
71 :
72 0 : subroutine abi_daxpy_2d(n, alpha, x, incx, y, incy, gpu_option)
73 :
74 : !Arguments ------------------------------------
75 : integer, intent(in) :: n
76 : real(dp), intent(in) :: alpha
77 : real(dp), target, intent(in) :: x(:,:)
78 : integer, intent(in) :: incx
79 : real(dp), target, intent(inout) :: y(:,:)
80 : integer, intent(in) :: incy
81 : !Optionals -----------------------------------
82 : integer, intent(in), optional :: gpu_option
83 :
84 : !Local variables-------------------------------
85 : integer :: gpu_option_
86 :
87 : ! *********************************************************************
88 :
89 0 : gpu_option_=ABI_GPU_DISABLED ; if(PRESENT(gpu_option)) gpu_option_ = gpu_option
90 :
91 0 : call abi_d2zaxpy(n, dcmplx(alpha, 0.0_dp), x, incx, y, incy, x_cplx=1, gpu_option=gpu_option_)
92 :
93 0 : end subroutine abi_daxpy_2d
94 : !!***
95 :
96 : !----------------------------------------------------------------------
97 :
98 : !!****f* m_abi_linalg/abi_d2zaxpy_2d
99 : !! NAME
100 : !! abi_d2zaxpy_2d
101 : !!
102 : !! FUNCTION
103 : !! Real AXPY: y = alpha * x + y, with real(dp) alpha and real(dp) arrays.
104 : !! On GPU, calls abi_gpu_xaxpy_cptr with cplx=1.
105 : !!
106 : !! INPUTS
107 : !!
108 : !! SOURCE
109 :
110 412274 : subroutine abi_d2zaxpy_2d(n, alpha, x, incx, y, incy, x_cplx, gpu_option)
111 :
112 : !Arguments ------------------------------------
113 : integer, intent(in) :: n
114 : complex(dp), intent(in) :: alpha
115 : real(dp), target, intent(in) :: x(:,:)
116 : integer, intent(in) :: incx
117 : real(dp), target, intent(inout) :: y(:,:)
118 : integer, intent(in) :: incy
119 : !Optionals -----------------------------------
120 : integer, intent(in), optional :: x_cplx, gpu_option
121 :
122 : !Local variables-------------------------------
123 : integer :: cplx_,gpu_option_
124 :
125 : ! *********************************************************************
126 :
127 412274 : gpu_option_=ABI_GPU_DISABLED ; if(PRESENT(gpu_option)) gpu_option_ = gpu_option
128 412274 : cplx_=1 ; if(PRESENT(x_cplx)) cplx_ = x_cplx
129 :
130 412274 : call abi_d2zaxpy(n, alpha, x, incx, y, incy, x_cplx=cplx_, gpu_option=gpu_option_)
131 :
132 412274 : end subroutine abi_d2zaxpy_2d
133 : !!***
134 :
135 :
136 : !----------------------------------------------------------------------
137 :
138 : !!****f* m_abi_linalg/abi_d2zaxpy_5d
139 : !! NAME
140 : !! abi_d2zaxpy_5d
141 : !!
142 : !! FUNCTION
143 : !! Real AXPY: y = alpha * x + y, with real(dp) alpha and real(dp) arrays.
144 : !! On GPU, calls abi_gpu_xaxpy_cptr with cplx=1.
145 : !!
146 : !! INPUTS
147 : !!
148 : !! SOURCE
149 :
150 0 : subroutine abi_d2zaxpy_5d(n, alpha, x, incx, y, incy, x_cplx, gpu_option)
151 :
152 : !Arguments ------------------------------------
153 : integer, intent(in) :: n
154 : complex(dp), intent(in) :: alpha
155 : real(dp), target, intent(in) :: x(:,:,:,:,:)
156 : integer, intent(in) :: incx
157 : real(dp), target, intent(inout) :: y(:,:,:,:,:)
158 : integer, intent(in) :: incy
159 : !Optionals -----------------------------------
160 : integer, intent(in), optional :: x_cplx, gpu_option
161 :
162 : !Local variables-------------------------------
163 : integer :: cplx_,gpu_option_
164 :
165 : ! *********************************************************************
166 :
167 0 : gpu_option_=ABI_GPU_DISABLED ; if(PRESENT(gpu_option)) gpu_option_ = gpu_option
168 0 : cplx_=1 ; if(PRESENT(x_cplx)) cplx_ = x_cplx
169 :
170 0 : call abi_d2zaxpy(n, alpha, x, incx, y, incy, x_cplx=cplx_, gpu_option=gpu_option_)
171 :
172 0 : end subroutine abi_d2zaxpy_5d
173 : !!***
174 :
175 :
176 : !----------------------------------------------------------------------
177 :
178 : !!****f* m_abi_linalg/abi_d2zaxpy
179 : !! NAME
180 : !! abi_d2zaxpy
181 : !!
182 : !! FUNCTION
183 : !! Real AXPY: y = alpha * x + y, with real(dp) alpha and real(dp) arrays.
184 : !! On GPU, calls abi_gpu_xaxpy_cptr with cplx=1.
185 : !!
186 : !! INPUTS
187 : !!
188 : !! SOURCE
189 :
190 412274 : subroutine abi_d2zaxpy(n, alpha, x, incx, y, incy, x_cplx, gpu_option)
191 :
192 : !Arguments ------------------------------------
193 : integer, intent(in) :: n
194 : complex(dp), intent(in) :: alpha
195 : real(dp), target, intent(in) :: x(*)
196 : integer, intent(in) :: incx
197 : real(dp), target, intent(inout) :: y(*)
198 : integer, intent(in) :: incy
199 : !Optionals -----------------------------------
200 : integer, intent(in), optional :: x_cplx, gpu_option
201 :
202 : !Local variables-------------------------------
203 : integer :: cplx_,gpu_option_
204 :
205 : ! *********************************************************************
206 :
207 412274 : gpu_option_=ABI_GPU_DISABLED ; if(PRESENT(gpu_option)) gpu_option_ = gpu_option
208 412274 : cplx_=1 ; if(PRESENT(x_cplx)) cplx_ = x_cplx
209 :
210 : #if defined(DEBUG_VERBOSE) && defined(HAVE_OPENMP_OFFLOAD)
211 : if ( gpu_option_ == ABI_GPU_OPENMP ) then
212 : ABI_CHECK(xomp_target_is_present(c_loc(x)), "Array isn't mapped on GPU")
213 : ABI_CHECK(xomp_target_is_present(c_loc(y)), "Array isn't mapped on GPU")
214 : end if
215 : #endif
216 :
217 412274 : if(gpu_option_/=ABI_GPU_DISABLED) then
218 0 : if(gpu_option_==ABI_GPU_OPENMP) then
219 : #ifdef HAVE_OPENMP_OFFLOAD
220 : !$OMP TARGET DATA USE_DEVICE_ADDR(x,y)
221 : call abi_gpu_xaxpy_cptr(cplx_, n, alpha, c_loc(x), incx, c_loc(y), incy)
222 : !$OMP END TARGET DATA
223 : #endif
224 : else
225 0 : call abi_gpu_xaxpy_cptr(cplx_, n, alpha, c_loc(x), incx, c_loc(y), incy)
226 : end if
227 : else
228 412274 : if(cplx_==1) then
229 412274 : call daxpy(n, alpha, x, incx, y, incy)
230 : else
231 0 : call zaxpy(n, alpha, x, incx, y, incy)
232 : end if
233 : end if
234 :
235 412274 : end subroutine abi_d2zaxpy
236 : !!***
237 :
238 : !----------------------------------------------------------------------
239 :
240 : !!****f* m_abi_linalg/abi_zaxpy
241 : !! NAME
242 : !! abi_zaxpy
243 : !!
244 : !! FUNCTION
245 : !! Complex AXPY: y = alpha * x + y, with complex(dp) alpha and complex(dp) arrays.
246 : !! On GPU, calls abi_gpu_xaxpy_cptr with cplx=2.
247 : !!
248 : !! INPUTS
249 : !!
250 : !! SOURCE
251 :
252 673983 : subroutine abi_zaxpy(n, alpha, x, incx, y, incy, gpu_option)
253 :
254 : !Arguments ------------------------------------
255 : integer, intent(in) :: n
256 : complex(dp), intent(in) :: alpha
257 : complex(dp), target, intent(in) :: x(*)
258 : integer, intent(in) :: incx
259 : complex(dp), target, intent(inout) :: y(*)
260 : integer, intent(in) :: incy
261 : !Optionals -----------------------------------
262 : integer, intent(in), optional :: gpu_option
263 :
264 : !Local variables-------------------------------
265 : integer :: gpu_option_
266 :
267 : ! *********************************************************************
268 :
269 673983 : gpu_option_=ABI_GPU_DISABLED ; if(PRESENT(gpu_option)) gpu_option_ = gpu_option
270 :
271 : #if defined(DEBUG_VERBOSE) && defined(HAVE_OPENMP_OFFLOAD)
272 : if ( gpu_option_ == ABI_GPU_OPENMP ) then
273 : ABI_CHECK(xomp_target_is_present(c_loc(x)), "Array isn't mapped on GPU")
274 : ABI_CHECK(xomp_target_is_present(c_loc(y)), "Array isn't mapped on GPU")
275 : end if
276 : #endif
277 :
278 673983 : if(gpu_option_/=ABI_GPU_DISABLED) then
279 0 : if(gpu_option_==ABI_GPU_OPENMP) then
280 : #ifdef HAVE_OPENMP_OFFLOAD
281 : !$OMP TARGET DATA USE_DEVICE_ADDR(x,y)
282 : call abi_gpu_xaxpy_cptr(2, n, alpha, c_loc(x), incx, c_loc(y), incy)
283 : !$OMP END TARGET DATA
284 : #endif
285 : else
286 0 : call abi_gpu_xaxpy_cptr(2, n, alpha, c_loc(x), incx, c_loc(y), incy)
287 : end if
288 : else
289 673983 : call zaxpy(n, alpha, x, incx, y, incy)
290 : end if
291 :
292 673983 : end subroutine abi_zaxpy
293 : !!***
294 :
295 : !----------------------------------------------------------------------
296 :
297 : !!****f* m_abi_linalg/abi_zaxpy_2d
298 : !! NAME
299 : !! abi_zaxpy_2d
300 : !!
301 : !! FUNCTION
302 : !! Complex AXPY: y = alpha * x + y, with complex(dp) alpha and complex(dp) arrays.
303 : !! On GPU, calls abi_gpu_xaxpy_cptr with cplx=2.
304 : !!
305 : !! INPUTS
306 : !!
307 : !! SOURCE
308 :
309 673983 : subroutine abi_zaxpy_2d(n, alpha, x, incx, y, incy, gpu_option)
310 :
311 : !Arguments ------------------------------------
312 : integer, intent(in) :: n
313 : complex(dp), intent(in) :: alpha
314 : complex(dp), target, intent(in) :: x(:,:)
315 : integer, intent(in) :: incx
316 : complex(dp), target, intent(inout) :: y(:,:)
317 : integer, intent(in) :: incy
318 : !Optionals -----------------------------------
319 : integer, intent(in), optional :: gpu_option
320 :
321 : !Local variables-------------------------------
322 : integer :: gpu_option_
323 :
324 : ! *********************************************************************
325 :
326 673983 : gpu_option_=ABI_GPU_DISABLED ; if(PRESENT(gpu_option)) gpu_option_ = gpu_option
327 :
328 673983 : call abi_zaxpy(n, alpha, x, incx, y, incy, gpu_option=gpu_option_)
329 :
330 673983 : end subroutine abi_zaxpy_2d
331 : !!***
332 :
333 : !----------------------------------------------------------------------
334 :
335 : !!****f* m_abi_linalg/abi_zaxpy_3d
336 : !! NAME
337 : !! abi_zaxpy_3d
338 : !!
339 : !! FUNCTION
340 : !! Complex AXPY: y = alpha * x + y, with complex(dp) alpha and complex(dp) arrays.
341 : !! On GPU, calls abi_gpu_xaxpy_cptr with cplx=2.
342 : !!
343 : !! INPUTS
344 : !!
345 : !! SOURCE
346 :
347 0 : subroutine abi_zaxpy_3d(n, alpha, x, incx, y, incy, gpu_option)
348 :
349 : !Arguments ------------------------------------
350 : integer, intent(in) :: n
351 : complex(dp), intent(in) :: alpha
352 : complex(dp), target, intent(in) :: x(:,:,:)
353 : integer, intent(in) :: incx
354 : complex(dp), target, intent(inout) :: y(:,:,:)
355 : integer, intent(in) :: incy
356 : !Optionals -----------------------------------
357 : integer, intent(in), optional :: gpu_option
358 :
359 : !Local variables-------------------------------
360 : integer :: gpu_option_
361 :
362 : ! *********************************************************************
363 :
364 0 : gpu_option_=ABI_GPU_DISABLED ; if(PRESENT(gpu_option)) gpu_option_ = gpu_option
365 :
366 0 : call abi_zaxpy(n, alpha, x, incx, y, incy, gpu_option=gpu_option_)
367 :
368 0 : end subroutine abi_zaxpy_3d
369 : !!***
|