13 USE iso_c_binding,
ONLY: &
14 c_associated, c_char, c_funloc, c_funptr, c_f_pointer, c_int, c_null_char, c_null_ptr, &
19#include "../base/base_uses.f90"
25 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'offload_api'
36 REAL(kind=
dp),
DIMENSION(:),
CONTIGUOUS,
POINTER :: host_buffer => null()
37 TYPE(c_ptr) :: c_ptr = c_null_ptr
50 INTEGER(C_SIZE_T),
VALUE :: length
54 FUNCTION offload_malloc_pinned_mem_c(buffer, length) &
55 BIND(C, name="offload_host_malloc")
56 IMPORT c_size_t, c_ptr, c_int
58 INTEGER(C_SIZE_T),
VALUE :: length
59 INTEGER(KIND=C_INT) :: offload_malloc_pinned_mem_c
60 END FUNCTION offload_malloc_pinned_mem_c
63 res = offload_malloc_pinned_mem_c(buffer, length)
72 TYPE(c_ptr),
VALUE :: buffer
76 FUNCTION offload_free_pinned_mem_c(buffer) &
77 BIND(C, name="offload_host_free")
79 INTEGER(KIND=C_INT) :: offload_free_pinned_mem_c
80 TYPE(c_ptr),
VALUE :: buffer
81 END FUNCTION offload_free_pinned_mem_c
84 res = offload_free_pinned_mem_c(buffer)
94 SUBROUTINE offload_init_c() &
95 BIND(C, name="offload_init")
96 END SUBROUTINE offload_init_c
112 FUNCTION offload_get_device_count_c() &
113 BIND(C, name="offload_get_device_count")
115 INTEGER(KIND=C_INT) :: offload_get_device_count_c
116 END FUNCTION offload_get_device_count_c
119 count = offload_get_device_count_c()
129 INTEGER,
INTENT(IN) :: device_id
132 SUBROUTINE offload_set_chosen_device_c(device_id) &
133 BIND(C, name="offload_set_chosen_device")
135 INTEGER(KIND=C_INT),
VALUE :: device_id
136 END SUBROUTINE offload_set_chosen_device_c
139 CALL offload_set_chosen_device_c(device_id=device_id)
152 FUNCTION offload_get_chosen_device_c() &
153 BIND(C, name="offload_get_chosen_device")
155 INTEGER(KIND=C_INT) :: offload_get_chosen_device_c
156 END FUNCTION offload_get_chosen_device_c
159 device_id = offload_get_chosen_device_c()
162 cpabort(
"No offload device has been chosen.")
173 SUBROUTINE offload_activate_chosen_device_c() &
174 BIND(C, name="offload_activate_chosen_device")
175 END SUBROUTINE offload_activate_chosen_device_c
178 CALL offload_activate_chosen_device_c()
188 CHARACTER(LEN=*),
INTENT(IN) :: routinen
191 SUBROUTINE offload_timeset_c(message)
BIND(C, name="offload_timeset")
193 CHARACTER(kind=C_CHAR),
DIMENSION(*),
INTENT(IN) :: message
194 END SUBROUTINE offload_timeset_c
197 CALL offload_timeset_c(trim(routinen)//c_null_char)
208 SUBROUTINE offload_timestop_c()
BIND(C, name="offload_timestop")
209 END SUBROUTINE offload_timestop_c
212 CALL offload_timestop_c()
223 INTEGER(KIND=int_8),
INTENT(OUT) :: free, total
225 INTEGER(KIND=C_SIZE_T) :: my_free, my_total
227 SUBROUTINE offload_mem_info_c(free, total)
BIND(C, name="offload_mem_info")
229 INTEGER(KIND=C_SIZE_T) :: free, total
230 END SUBROUTINE offload_mem_info_c
233 CALL offload_mem_info_c(my_free, my_total)
248 INTEGER,
INTENT(IN) :: length
251 CHARACTER(LEN=*),
PARAMETER :: routinen =
'offload_create_buffer'
254 TYPE(c_ptr) :: host_buffer_c
256 SUBROUTINE offload_create_buffer_c(length, buffer) &
257 BIND(C, name="offload_create_buffer")
258 IMPORT :: c_ptr, c_int
259 INTEGER(KIND=C_INT),
VALUE :: length
260 TYPE(c_ptr) :: buffer
261 END SUBROUTINE offload_create_buffer_c
265 FUNCTION offload_get_buffer_host_pointer_c(buffer) &
266 BIND(C, name="offload_get_buffer_host_pointer")
268 TYPE(c_ptr),
VALUE :: buffer
269 TYPE(c_ptr) :: offload_get_buffer_host_pointer_c
270 END FUNCTION offload_get_buffer_host_pointer_c
273 CALL timeset(routinen, handle)
275 IF (
ASSOCIATED(buffer%host_buffer))
THEN
276 IF (
SIZE(buffer%host_buffer) == 0)
DEALLOCATE (buffer%host_buffer)
279 CALL offload_create_buffer_c(length=length, buffer=buffer%c_ptr)
280 cpassert(c_associated(buffer%c_ptr))
282 IF (length == 0)
THEN
284 ALLOCATE (buffer%host_buffer(0))
286 host_buffer_c = offload_get_buffer_host_pointer_c(buffer%c_ptr)
287 cpassert(c_associated(host_buffer_c))
288 CALL c_f_pointer(host_buffer_c, buffer%host_buffer, shape=(/length/))
291 CALL timestop(handle)
302 CHARACTER(LEN=*),
PARAMETER :: routinen =
'offload_free_buffer'
306 SUBROUTINE offload_free_buffer_c(buffer) &
307 BIND(C, name="offload_free_buffer")
309 TYPE(c_ptr),
VALUE :: buffer
310 END SUBROUTINE offload_free_buffer_c
313 CALL timeset(routinen, handle)
315 IF (c_associated(buffer%c_ptr))
THEN
317 CALL offload_free_buffer_c(buffer%c_ptr)
319 buffer%c_ptr = c_null_ptr
321 IF (
SIZE(buffer%host_buffer) == 0)
THEN
322 DEALLOCATE (buffer%host_buffer)
324 NULLIFY (buffer%host_buffer)
328 CALL timestop(handle)
339 INTEGER,
INTENT(IN) :: output_unit
342 SUBROUTINE offload_mempool_stats_print_c(mpi_comm, print_func, output_unit) &
343 BIND(C, name="offload_mempool_stats_print")
344 IMPORT :: c_funptr, c_int
345 INTEGER(KIND=C_INT),
VALUE :: mpi_comm
347 INTEGER(KIND=C_INT),
VALUE :: output_unit
348 END SUBROUTINE offload_mempool_stats_print_c
352 CALL offload_mempool_stats_print_c(mpi_comm=mpi_comm%get_handle(), &
354 output_unit=output_unit)
365 SUBROUTINE print_func(msg, msglen, output_unit)
BIND(C, name="offload_api_print_func")
366 CHARACTER(KIND=C_CHAR),
INTENT(IN) :: msg(*)
367 INTEGER(KIND=C_INT),
INTENT(IN),
VALUE :: msglen, output_unit
369 IF (output_unit <= 0)
RETURN
370 WRITE (output_unit, fmt=
"(100A)", advance=
"NO") msg(1:msglen)
static void print_func(const char *msg, int msglen, int output_unit)
Wrapper for printf, passed to dbm_library_print_stats.
Defines the basic variable types.
integer, parameter, public int_8
integer, parameter, public dp
Interface to the message passing library MPI.
Fortran API for the offload package, which is written in C.
subroutine, public offload_set_chosen_device(device_id)
Selects the chosen device to be used.
subroutine, public offload_free_buffer(buffer)
Deallocates given buffer.
subroutine, public offload_activate_chosen_device()
Activates the device selected via offload_set_chosen_device()
subroutine, public offload_timestop()
Ends a timing range.
integer function, public offload_free_pinned_mem(buffer)
free pinned memory
subroutine, public offload_timeset(routinen)
Starts a timing range.
integer function, public offload_get_device_count()
Returns the number of available devices.
subroutine, public offload_create_buffer(length, buffer)
Allocates a buffer of given length, ie. number of elements.
integer function, public offload_malloc_pinned_mem(buffer, length)
allocate pinned memory.
subroutine, public offload_init()
Initialize runtime.
subroutine, public offload_mem_info(free, total)
Gets free and total device memory.
subroutine, public offload_mempool_stats_print(mpi_comm, output_unit)
Print allocation statistics.
integer function, public offload_get_chosen_device()
Returns the chosen device.