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
114 num_platforms) bind(c, name = 'clGetPlatformIDs')
115 use,
intrinsic :: iso_c_binding
117 integer(c_int),
value :: num_entries
118 type(c_ptr),
value :: platforms
119 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
138 pfn_notify, user_data, ierr) bind(c, name =
'clCreateContext')
139 use,
intrinsic :: iso_c_binding
141 type(c_ptr),
value :: properties
142 integer(c_int),
value :: num_devices
143 type(c_ptr),
value :: devices
144 type(c_funptr),
value :: pfn_notify
145 type(c_ptr),
value :: user_data
146 integer(c_int) :: ierr
152 properties, ierr) bind(c, name =
'clCreateCommandQueue')
153 use,
intrinsic :: iso_c_binding
155 type(c_ptr),
value :: context
156 type(c_ptr),
value ::
device
157 integer(c_int64_t),
value :: properties
158 integer(c_int) :: ierr
164 bind(c, name =
'clCreateBuffer')
165 use,
intrinsic :: iso_c_binding
167 type(c_ptr),
value :: context
168 integer(c_int),
value :: flags
169 integer(c_size_t),
value :: size
170 type(c_ptr),
value :: host_ptr
171 integer(c_int) :: ierr
177 bind(c, name =
'clCreateUserEvent')
178 use,
intrinsic :: iso_c_binding
180 type(c_ptr),
value :: context
181 integer(c_int) :: ierr
187 offset, size, ptr, num_events_in_wait_list, event_wait_list, event) &
188 bind(c, name =
'clEnqueueReadBuffer')
189 use,
intrinsic :: iso_c_binding
191 type(c_ptr),
value :: queue
192 type(c_ptr),
value ::
buffer
193 integer(c_int),
value :: blocking_read
194 integer(c_size_t),
value :: offset
195 integer(c_size_t),
value :: size
196 type(c_ptr),
value :: ptr
197 integer(c_int),
value :: num_events_in_wait_list
198 type(c_ptr),
value :: event_wait_list
199 type(c_ptr),
value :: event
205 blocking_write, offset, size, ptr, num_events_in_wait_list, &
206 event_wait_list, event) bind(c, name = 'clEnqueueWriteBuffer')
207 use,
intrinsic :: iso_c_binding
209 type(c_ptr),
value :: queue
210 type(c_ptr),
value ::
buffer
211 integer(c_int),
value :: blocking_write
212 integer(c_size_t),
value :: offset
213 integer(c_size_t),
value :: size
214 type(c_ptr),
value :: ptr
215 integer(c_int),
value :: num_events_in_wait_list
216 type(c_ptr),
value :: event_wait_list
217 type(c_ptr),
value :: event
223 dst_buffer, src_offset, dst_offset, size, num_events_in_wait_list, &
224 event_wait_list, event) bind(c, name = 'clEnqueueCopyBuffer')
225 use,
intrinsic :: iso_c_binding
227 type(c_ptr),
value :: queue
228 type(c_ptr),
value :: src_buffer
229 type(c_ptr),
value :: dst_buffer
230 integer(c_size_t),
value :: src_offset
231 integer(c_size_t),
value :: dst_offset
232 integer(c_size_t),
value :: size
233 integer(c_int),
value :: num_events_in_wait_list
234 type(c_ptr),
value :: event_wait_list
235 type(c_ptr),
value :: event
241 pattern, pattern_size, offset, size, num_events_in_wait_list, &
242 event_wait_list, event) bind(c, name = 'clEnqueueFillBuffer')
243 use,
intrinsic :: iso_c_binding
245 type(c_ptr),
value :: queue
246 type(c_ptr),
value ::
buffer
247 type(c_ptr),
value :: pattern
248 integer(c_size_t),
value :: pattern_size
249 integer(c_size_t),
value :: offset
250 integer(c_size_t),
value :: size
251 integer(c_int),
value :: num_events_in_wait_list
252 type(c_ptr),
value :: event_wait_list
253 type(c_ptr),
value :: event
259 (queue, num_events_in_wait_list, event_wait_list, event) &
260 bind(c, name =
'clEnqueueMarkerWithWaitList')
261 use,
intrinsic :: iso_c_binding
263 type(c_ptr),
value :: queue
264 integer(c_int),
value :: num_events_in_wait_list
265 type(c_ptr),
value :: event_wait_list
266 type(c_ptr),
value :: event
272 bind(c, name =
'clEnqueueMarker')
273 use,
intrinsic :: iso_c_binding
275 type(c_ptr),
value :: cmd_queue
276 type(c_ptr),
value :: event
282 bind(c, name =
'clEnqueueBarrier')
283 use,
intrinsic :: iso_c_binding
285 type(c_ptr),
value :: cmd_queue
291 num_events, event_list) bind(c, name = 'clEnqueueWaitForEvents')
292 use,
intrinsic :: iso_c_binding
294 type(c_ptr),
value :: queue
295 integer(c_int),
value :: num_events
296 type(c_ptr),
value :: event_list
302 bind(c, name =
'clWaitForEvents')
303 use,
intrinsic :: iso_c_binding
305 integer(c_int),
value :: num_events
306 type(c_ptr),
value :: event_list
312 bind(c, name =
'clSetUserEventStatus')
313 use,
intrinsic :: iso_c_binding
315 type(c_ptr),
value :: event
316 integer(c_int),
value :: status
322 param_value_size, param_value, param_value_size_ret) &
323 bind(c, name =
'clGetDeviceInfo')
324 use,
intrinsic :: iso_c_binding
326 type(c_ptr),
value ::
device
327 integer(c_int),
value :: param_name
328 integer(c_size_t),
value :: param_value_size
329 type(c_ptr),
value :: param_value
330 type(c_ptr),
value :: param_value_size_ret
336 bind(c, name =
'clReleaseContext')
337 use,
intrinsic :: iso_c_binding
339 type(c_ptr),
value :: context
345 bind(c, name =
'clReleaseCommandQueue')
346 use,
intrinsic :: iso_c_binding
348 type(c_ptr),
value :: queue
354 bind(c, name =
'clReleaseDevice')
355 use,
intrinsic :: iso_c_binding
357 type(c_ptr),
value ::
device
363 bind(c, name =
'clReleaseProgram')
364 use,
intrinsic :: iso_c_binding
366 type(c_ptr),
value :: prgm
372 bind(c, name =
'clReleaseMemObject')
373 use,
intrinsic :: iso_c_binding
375 type(c_ptr),
value :: ptr_d
381 bind(c, name =
'clReleaseEvent')
382 use,
intrinsic :: iso_c_binding
384 type(c_ptr),
value :: event
390 bind(c, name =
'clFlush')
391 use,
intrinsic :: iso_c_binding
393 type(c_ptr),
value :: cmd_queue
399 bind(c, name =
'clFinish')
400 use,
intrinsic :: iso_c_binding
402 type(c_ptr),
value :: cmd_queue
408 subroutine opencl_init(glb_cmd_queue, aux_cmd_queue, prf_cmd_queue)
409 type(c_ptr),
intent(inout) :: glb_cmd_queue
410 type(c_ptr),
intent(inout) :: aux_cmd_queue
411 type(c_ptr),
intent(inout) :: prf_cmd_queue
412 type(c_ptr),
target :: platform_id
413 integer(c_int) :: num_platforms, num_devices, ierr
414 integer(c_intptr_t) :: ctx_prop(3)
415 integer(c_int64_t),
parameter :: queue_props = 0
420 call neko_error(
'Failed to get a platform id')
424 c_loc(glb_device_id), num_devices) .ne.
cl_success)
then
425 call neko_error(
'Failed to get a device id')
428 if (c_associated(glb_ctx))
then
430 call neko_error(
'Failed to release context')
434 glb_ctx =
clcreatecontext(c_null_ptr, num_devices, c_loc(glb_device_id), &
435 c_null_funptr, c_null_ptr, ierr)
438 call neko_error(
'Failed to create an OpenCL context')
441 if (c_associated(glb_cmd_queue))
then
443 call neko_error(
'Faield to release command queue')
450 call neko_error(
'Failed to create a command queue')
456 call neko_error(
'Failed to create a command queue')
462 call neko_error(
'Failed to create a command queue')
468 type(c_ptr),
intent(inout) :: glb_cmd_queue
469 type(c_ptr),
intent(inout) :: aux_cmd_queue
470 type(c_ptr),
intent(inout) :: prf_cmd_queue
472 if (c_associated(glb_ctx))
then
474 call neko_error(
'Failed to release context')
479 if (c_associated(glb_cmd_queue))
then
481 call neko_error(
'Failed to release command queue')
483 glb_cmd_queue = c_null_ptr
486 if (c_associated(aux_cmd_queue))
then
488 call neko_error(
'Failed to release command queue')
490 aux_cmd_queue = c_null_ptr
493 if (c_associated(prf_cmd_queue))
then
495 call neko_error(
'Failed to release command queue')
497 prf_cmd_queue = c_null_ptr
500 if (c_associated(glb_device_id))
then
502 call neko_error(
'Failed to release device')
509 character(len=*),
intent(inout) :: name
510 character(kind=c_char, len=1024),
target :: c_name
511 integer(c_size_t),
target :: name_len
514 c_loc(c_name), c_loc(name_len)) .ne.
cl_success)
then
515 call neko_error(
'Failed to query device')
518 name(1:name_len) = c_name(1:name_len)
524 type(c_ptr),
target :: platform_id
525 integer(c_int) :: num_platforms, num_devices
529 call neko_error(
'Failed to get a platform id')
533 c_null_ptr, num_devices) .ne.
cl_success)
then
534 call neko_error(
'Failed to get a device id')
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(c_int64_t), parameter cl_device_type_gpu
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(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