37 use,
intrinsic :: iso_c_binding
43 type(c_ptr),
bind(c) :: glb_ctx = c_null_ptr
46 type(c_ptr),
bind(c),
target :: glb_device_id = c_null_ptr
116 num_platforms) bind(c, name = 'clGetPlatformIDs')
117 use,
intrinsic :: iso_c_binding
119 integer(c_int),
value :: num_entries
120 type(c_ptr),
value :: platforms
121 integer(c_int) :: num_platforms
125 num_entries, devices, num_devices) bind(c, name = 'clGetDeviceIDs')
126 use,
intrinsic :: iso_c_binding
128 type(c_ptr),
value :: platform
129 integer(c_int64_t),
value :: device_type
130 integer(c_int),
value :: num_entries
131 type(c_ptr),
value :: devices
132 integer(c_int) :: num_devices
136 pfn_notify, user_data, ierr) bind(c, name =
'clCreateContext')
137 use,
intrinsic :: iso_c_binding
139 type(c_ptr),
value :: properties
140 integer(c_int),
value :: num_devices
141 type(c_ptr),
value :: devices
142 type(c_funptr),
value :: pfn_notify
143 type(c_ptr),
value :: user_data
144 integer(c_int) :: ierr
148 properties, ierr) bind(c, name =
'clCreateCommandQueue')
149 use,
intrinsic :: iso_c_binding
151 type(c_ptr),
value :: context
152 type(c_ptr),
value ::
device
153 integer(c_int64_t),
value :: properties
154 integer(c_int) :: ierr
158 bind(c, name =
'clCreateBuffer')
159 use,
intrinsic :: iso_c_binding
161 type(c_ptr),
value :: context
162 integer(c_int),
value :: flags
163 integer(c_size_t),
value :: size
164 type(c_ptr),
value :: host_ptr
165 integer(c_int) :: ierr
169 bind(c, name =
'clCreateUserEvent')
170 use,
intrinsic :: iso_c_binding
172 type(c_ptr),
value :: context
173 integer(c_int) :: ierr
177 offset, size, ptr, num_events_in_wait_list, event_wait_list, event) &
178 bind(c, name =
'clEnqueueReadBuffer')
179 use,
intrinsic :: iso_c_binding
181 type(c_ptr),
value :: queue
182 type(c_ptr),
value ::
buffer
183 integer(c_int),
value :: blocking_read
184 integer(c_size_t),
value :: offset
185 integer(c_size_t),
value :: size
186 type(c_ptr),
value :: ptr
187 integer(c_int),
value :: num_events_in_wait_list
188 type(c_ptr),
value :: event_wait_list
189 type(c_ptr),
value :: event
193 blocking_write, offset, size, ptr, num_events_in_wait_list, &
194 event_wait_list, event) bind(c, name = 'clEnqueueWriteBuffer')
195 use,
intrinsic :: iso_c_binding
197 type(c_ptr),
value :: queue
198 type(c_ptr),
value ::
buffer
199 integer(c_int),
value :: blocking_write
200 integer(c_size_t),
value :: offset
201 integer(c_size_t),
value :: size
202 type(c_ptr),
value :: ptr
203 integer(c_int),
value :: num_events_in_wait_list
204 type(c_ptr),
value :: event_wait_list
205 type(c_ptr),
value :: event
209 dst_buffer, src_offset, dst_offset, size, num_events_in_wait_list, &
210 event_wait_list, event) bind(c, name = 'clEnqueueCopyBuffer')
211 use,
intrinsic :: iso_c_binding
213 type(c_ptr),
value :: queue
214 type(c_ptr),
value :: src_buffer
215 type(c_ptr),
value :: dst_buffer
216 integer(c_size_t),
value :: src_offset
217 integer(c_size_t),
value :: dst_offset
218 integer(c_size_t),
value :: size
219 integer(c_int),
value :: num_events_in_wait_list
220 type(c_ptr),
value :: event_wait_list
221 type(c_ptr),
value :: event
225 pattern, pattern_size, offset, size, num_events_in_wait_list, &
226 event_wait_list, event) bind(c, name = 'clEnqueueFillBuffer')
227 use,
intrinsic :: iso_c_binding
229 type(c_ptr),
value :: queue
230 type(c_ptr),
value ::
buffer
231 type(c_ptr),
value :: pattern
232 integer(c_size_t),
value :: pattern_size
233 integer(c_size_t),
value :: offset
234 integer(c_size_t),
value :: size
235 integer(c_int),
value :: num_events_in_wait_list
236 type(c_ptr),
value :: event_wait_list
237 type(c_ptr),
value :: event
241 (queue, num_events_in_wait_list, event_wait_list, event) &
242 bind(c, name =
'clEnqueueMarkerWithWaitList')
243 use,
intrinsic :: iso_c_binding
245 type(c_ptr),
value :: queue
246 integer(c_int),
value :: num_events_in_wait_list
247 type(c_ptr),
value :: event_wait_list
248 type(c_ptr),
value :: event
252 bind(c, name =
'clEnqueueMarker')
253 use,
intrinsic :: iso_c_binding
255 type(c_ptr),
value :: cmd_queue
256 type(c_ptr),
value :: event
260 bind(c, name =
'clEnqueueBarrier')
261 use,
intrinsic :: iso_c_binding
263 type(c_ptr),
value :: cmd_queue
267 num_events, event_list) bind(c, name = 'clEnqueueWaitForEvents')
268 use,
intrinsic :: iso_c_binding
270 type(c_ptr),
value :: queue
271 integer(c_int),
value :: num_events
272 type(c_ptr),
value :: event_list
276 bind(c, name =
'clWaitForEvents')
277 use,
intrinsic :: iso_c_binding
279 integer(c_int),
value :: num_events
280 type(c_ptr),
value :: event_list
284 bind(c, name =
'clSetUserEventStatus')
285 use,
intrinsic :: iso_c_binding
287 type(c_ptr),
value :: event
288 integer(c_int),
value :: status
292 param_value_size, param_value, param_value_size_ret) &
293 bind(c, name =
'clGetDeviceInfo')
294 use,
intrinsic :: iso_c_binding
296 type(c_ptr),
value ::
device
297 integer(c_int),
value :: param_name
298 integer(c_size_t),
value :: param_value_size
299 type(c_ptr),
value :: param_value
300 type(c_ptr),
value :: param_value_size_ret
304 bind(c, name =
'clReleaseContext')
305 use,
intrinsic :: iso_c_binding
307 type(c_ptr),
value :: context
311 bind(c, name =
'clReleaseCommandQueue')
312 use,
intrinsic :: iso_c_binding
314 type(c_ptr),
value :: queue
318 bind(c, name =
'clReleaseDevice')
319 use,
intrinsic :: iso_c_binding
321 type(c_ptr),
value ::
device
325 bind(c, name =
'clReleaseProgram')
326 use,
intrinsic :: iso_c_binding
328 type(c_ptr),
value :: prgm
332 bind(c, name =
'clReleaseMemObject')
333 use,
intrinsic :: iso_c_binding
335 type(c_ptr),
value :: ptr_d
339 bind(c, name =
'clReleaseEvent')
340 use,
intrinsic :: iso_c_binding
342 type(c_ptr),
value :: event
346 bind(c, name =
'clFlush')
347 use,
intrinsic :: iso_c_binding
349 type(c_ptr),
value :: cmd_queue
353 bind(c, name =
'clFinish')
354 use,
intrinsic :: iso_c_binding
356 type(c_ptr),
value :: cmd_queue
360 bind(c, name =
'opencl_buffer_free_all')
366 subroutine opencl_init(glb_cmd_queue, aux_cmd_queue, prf_cmd_queue)
367 type(c_ptr),
intent(inout) :: glb_cmd_queue
368 type(c_ptr),
intent(inout) :: aux_cmd_queue
369 type(c_ptr),
intent(inout) :: prf_cmd_queue
370 type(c_ptr),
target :: platform_id
371 integer(c_int) :: num_platforms, num_devices, ierr
372 integer(c_intptr_t) :: ctx_prop(3)
373 integer(c_int64_t),
parameter :: queue_props = 0
378 call neko_error(
'Failed to get a platform id')
382 c_loc(glb_device_id), num_devices) .ne.
cl_success)
then
383 call neko_error(
'Failed to get a device id')
386 if (c_associated(glb_ctx))
then
390 call neko_error(
'Failed to release context')
394 glb_ctx =
clcreatecontext(c_null_ptr, num_devices, c_loc(glb_device_id), &
395 c_null_funptr, c_null_ptr, ierr)
398 call neko_error(
'Failed to create an OpenCL context')
401 if (c_associated(glb_cmd_queue))
then
403 call neko_error(
'Faield to release command queue')
410 call neko_error(
'Failed to create a command queue')
416 call neko_error(
'Failed to create a command queue')
422 call neko_error(
'Failed to create a command queue')
428 type(c_ptr),
intent(inout) :: glb_cmd_queue
429 type(c_ptr),
intent(inout) :: aux_cmd_queue
430 type(c_ptr),
intent(inout) :: prf_cmd_queue
436 if (c_associated(glb_ctx))
then
438 call neko_error(
'Failed to release context')
443 if (c_associated(glb_cmd_queue))
then
445 call neko_error(
'Failed to release command queue')
447 glb_cmd_queue = c_null_ptr
450 if (c_associated(aux_cmd_queue))
then
452 call neko_error(
'Failed to release command queue')
454 aux_cmd_queue = c_null_ptr
457 if (c_associated(prf_cmd_queue))
then
459 call neko_error(
'Failed to release command queue')
461 prf_cmd_queue = c_null_ptr
464 if (c_associated(glb_device_id))
then
466 call neko_error(
'Failed to release device')
473 character(len=*),
intent(inout) :: name
474 character(kind=c_char, len=1024),
target :: c_name
475 integer(c_size_t),
target :: name_len
478 c_loc(c_name), c_loc(name_len)) .ne.
cl_success)
then
479 call neko_error(
'Failed to query device')
482 name(1:name_len) = c_name(1:name_len)
488 type(c_ptr),
target :: platform_id
489 integer(c_int) :: num_platforms, num_devices
493 call neko_error(
'Failed to get a platform id')
497 c_null_ptr, num_devices) .ne.
cl_success)
then
498 call neko_error(
'Failed to get a device id')
510 integer(c_int32_t),
target :: count
511 integer(c_size_t),
target :: ret_size
515 int(c_sizeof(count), c_size_t), c_loc(count), &
527 integer(c_int64_t),
target :: mem_size
528 integer(c_size_t),
target :: ret_size
532 int(c_sizeof(mem_size), c_size_t), c_loc(mem_size), &
Generic buffer that is extended with buffers of varying rank.
Device abstraction, common interface for various accelerators.
integer, parameter, public i8
Fortran OpenCL interface.
integer(c_int64_t), parameter cl_device_type_default
Device types.
subroutine opencl_device_name(name)
integer function opencl_device_mp_count()
Return the number of compute units of the current device (CL_DEVICE_MAX_COMPUTE_UNITS),...
integer(c_int64_t), parameter cl_device_type_gpu
@ cl_device_global_mem_size
@ cl_device_max_compute_units
subroutine opencl_finalize(glb_cmd_queue, aux_cmd_queue, prf_cmd_queue)
integer function opencl_device_count()
Return the number of OpenCL devices.
subroutine opencl_init(glb_cmd_queue, aux_cmd_queue, prf_cmd_queue)
integer(c_int64_t), parameter cl_device_type_cpu
@ cl_image_format_mismatch
@ cl_image_format_not_supported
@ cl_device_not_available
@ cl_compiler_not_available
@ cl_mem_object_allocation_failure
@ cl_build_program_failure
@ cl_profiling_info_not_available
integer(c_int64_t), parameter cl_device_type_custom
integer(kind=i8) function opencl_device_total_mem()
Return the global memory size of the current device in bytes (CL_DEVICE_GLOBAL_MEM_SIZE),...
integer(c_int64_t), parameter cl_queue_profiling_enable
integer(c_int64_t), parameter cl_device_type_all
integer(c_int64_t), parameter cl_queue_out_of_order_exec_mode_enable
Queue properties.
integer(c_int64_t), parameter cl_device_type_accelerator