37 use,
intrinsic :: iso_c_binding
43 type(c_ptr),
bind(c) :: glb_cmd_queue = c_null_ptr
49 type(c_ptr),
bind(c) :: glb_ctx = c_null_ptr
52 type(c_ptr),
bind(c),
target :: glb_device_id = c_null_ptr
117 bind(c, name =
'clGetPlatformIDs')
118 use,
intrinsic :: iso_c_binding
120 integer(c_int),
value :: num_entries
121 type(c_ptr),
value :: platforms
122 integer(c_int) :: num_platforms
128 num_entries, devices, num_devices) &
129 bind(c, name =
'clGetDeviceIDs')
130 use,
intrinsic :: iso_c_binding
132 type(c_ptr),
value :: platform
133 integer(c_int64_t),
value :: device_type
134 integer(c_int),
value :: num_entries
135 type(c_ptr),
value :: devices
136 integer(c_int) :: num_devices
142 pfn_notify, user_data, ierr) &
143 bind(c, name =
'clCreateContext')
144 use,
intrinsic :: iso_c_binding
146 type(c_ptr),
value :: properties
147 integer(c_int),
value :: num_devices
148 type(c_ptr),
value :: devices
149 type(c_funptr),
value :: pfn_notify
150 type(c_ptr),
value :: user_data
151 integer(c_int) :: ierr
158 bind(c, name =
'clCreateCommandQueue')
159 use,
intrinsic :: iso_c_binding
161 type(c_ptr),
value :: context
162 type(c_ptr),
value ::
device
163 integer(c_int64_t),
value :: properties
164 integer(c_int) :: ierr
170 bind(c, name =
'clCreateBuffer')
171 use,
intrinsic :: iso_c_binding
173 type(c_ptr),
value :: context
174 integer(c_int),
value :: flags
175 integer(c_size_t),
value :: size
176 type(c_ptr),
value :: host_ptr
177 integer(c_int) :: ierr
183 bind(c, name =
'clCreateUserEvent')
184 use,
intrinsic :: iso_c_binding
186 type(c_ptr),
value :: context
187 integer(c_int) :: ierr
194 num_events_in_wait_list, &
195 event_wait_list, event) &
196 bind(c, name =
'clEnqueueReadBuffer')
197 use,
intrinsic :: iso_c_binding
199 type(c_ptr),
value :: queue
200 type(c_ptr),
value :: buffer
201 integer(c_int),
value :: blocking_read
202 integer(c_size_t),
value :: offset
203 integer(c_size_t),
value :: size
204 type(c_ptr),
value :: ptr
205 integer(c_int),
value :: num_events_in_wait_list
206 type(c_ptr),
value :: event_wait_list
207 type(c_ptr),
value :: event
213 blocking_write, offset, &
215 num_events_in_wait_list, &
216 event_wait_list, event) &
217 bind(c, name =
'clEnqueueWriteBuffer')
218 use,
intrinsic :: iso_c_binding
220 type(c_ptr),
value :: queue
221 type(c_ptr),
value :: buffer
222 integer(c_int),
value :: blocking_write
223 integer(c_size_t),
value :: offset
224 integer(c_size_t),
value :: size
225 type(c_ptr),
value :: ptr
226 integer(c_int),
value :: num_events_in_wait_list
227 type(c_ptr),
value :: event_wait_list
228 type(c_ptr),
value :: event
234 dst_buffer, src_offset, &
236 num_events_in_wait_list, &
237 event_wait_list, event) &
238 bind(c, name =
'clEnqueueCopyBuffer')
239 use,
intrinsic :: iso_c_binding
241 type(c_ptr),
value :: queue
242 type(c_ptr),
value :: src_buffer
243 type(c_ptr),
value :: dst_buffer
244 integer(c_size_t),
value :: src_offset
245 integer(c_size_t),
value :: dst_offset
246 integer(c_size_t),
value :: size
247 integer(c_int),
value :: num_events_in_wait_list
248 type(c_ptr),
value :: event_wait_list
249 type(c_ptr),
value :: event
255 (queue, num_events_in_wait_list, event_wait_list, event) &
256 bind(c, name =
'clEnqueueMarkerWithWaitList')
257 use,
intrinsic :: iso_c_binding
259 type(c_ptr),
value :: queue
260 integer(c_int),
value :: num_events_in_wait_list
261 type(c_ptr),
value :: event_wait_list
262 type(c_ptr),
value :: event
268 bind(c, name =
'clEnqueueMarker')
269 use,
intrinsic :: iso_c_binding
271 type(c_ptr),
value :: cmd_queue
272 type(c_ptr),
value :: event
278 bind(c, name =
'clEnqueueBarrier')
279 use,
intrinsic :: iso_c_binding
281 type(c_ptr),
value :: cmd_queue
287 num_events, event_list) &
288 bind(c, name =
'clEnqueueWaitForEvents')
289 use,
intrinsic :: iso_c_binding
291 type(c_ptr),
value :: queue
292 integer(c_int),
value :: num_events
293 type(c_ptr),
value :: event_list
299 bind(c, name =
'clWaitForEvents')
300 use,
intrinsic :: iso_c_binding
302 integer(c_int),
value :: num_events
303 type(c_ptr),
value :: event_list
309 bind(c, name =
'clSetUserEventStatus')
310 use,
intrinsic :: iso_c_binding
312 type(c_ptr),
value :: event
313 integer(c_int),
value :: status
319 param_value_size, param_value, &
320 param_value_size_ret) &
321 bind(c, name =
'clGetDeviceInfo')
322 use,
intrinsic :: iso_c_binding
324 type(c_ptr),
value ::
device
325 integer(c_int),
value :: param_name
326 integer(c_size_t),
value :: param_value_size
327 type(c_ptr),
value :: param_value
328 type(c_ptr),
value :: param_value_size_ret
334 bind(c, name =
'clReleaseContext')
335 use,
intrinsic :: iso_c_binding
337 type(c_ptr),
value :: context
343 bind(c, name =
'clReleaseCommandQueue')
344 use,
intrinsic :: iso_c_binding
346 type(c_ptr),
value :: queue
352 bind(c, name =
'clReleaseDevice')
353 use,
intrinsic :: iso_c_binding
355 type(c_ptr),
value ::
device
361 bind(c, name =
'clReleaseProgram')
362 use,
intrinsic :: iso_c_binding
364 type(c_ptr),
value :: prgm
370 bind(c, name =
'clReleaseMemObject')
371 use,
intrinsic :: iso_c_binding
373 type(c_ptr),
value :: ptr_d
379 bind(c, name =
'clReleaseEvent')
380 use,
intrinsic :: iso_c_binding
382 type(c_ptr),
value :: event
388 bind(c, name =
'clFlush')
389 use,
intrinsic :: iso_c_binding
391 type(c_ptr),
value :: cmd_queue
397 bind(c, name =
'clFinish')
398 use,
intrinsic :: iso_c_binding
400 type(c_ptr),
value :: cmd_queue
407 type(c_ptr),
target :: platform_id
408 integer(c_int) :: num_platforms, num_devices, ierr
409 integer(c_intptr_t) :: ctx_prop(3)
410 integer(c_int64_t),
parameter :: queue_props = 0
415 call neko_error(
'Failed to get a platform id')
419 c_loc(glb_device_id), num_devices) .ne.
cl_success)
then
420 call neko_error(
'Failed to get a device id')
423 if (c_associated(glb_ctx))
then
425 call neko_error(
'Failed to release context')
429 glb_ctx =
clcreatecontext(c_null_ptr, num_devices, c_loc(glb_device_id), &
430 c_null_funptr, c_null_ptr, ierr)
433 call neko_error(
'Failed to create an OpenCL context')
436 if (c_associated(glb_cmd_queue))
then
438 call neko_error(
'Faield to release command queue')
445 call neko_error(
'Failed to create a command queue')
451 call neko_error(
'Failed to create a command queue')
458 if (c_associated(glb_ctx))
then
460 call neko_error(
'Failed to release context')
465 if (c_associated(glb_cmd_queue))
then
467 call neko_error(
'Faield to release command queue')
469 glb_cmd_queue = c_null_ptr
472 if (c_associated(glb_device_id))
then
474 call neko_error(
'Faield to release device')
481 character(len=*),
intent(inout) :: name
482 character(kind=c_char, len=1024),
target :: c_name
483 integer(c_size_t),
target :: name_len
486 c_loc(c_name), c_loc(name_len)) .ne.
cl_success)
then
487 call neko_error(
'Failed to query device')
490 name(1:name_len) = c_name(1:name_len)
496 type(c_ptr),
target :: platform_id
497 integer(c_int) :: num_platforms, num_devices
501 call neko_error(
'Failed to get a platform id')
505 c_null_ptr, num_devices) .ne.
cl_success)
then
506 call neko_error(
'Failed to get a device id')
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
type(c_ptr), bind(C) aux_cmd_queue
Aux OpenCL command queue.
integer function opencl_device_count()
Return the number of OpenCL devices.
subroutine opencl_finalize
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_device_type_all
integer(c_int64_t), parameter cl_device_type_accelerator