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
110 num_platforms) bind(c, name = 'clGetPlatformIDs')
111 use,
intrinsic :: iso_c_binding
113 integer(c_int),
value :: num_entries
114 type(c_ptr),
value :: platforms
115 integer(c_int) :: num_platforms
121 num_entries, devices, num_devices) bind(c, name = 'clGetDeviceIDs')
122 use,
intrinsic :: iso_c_binding
124 type(c_ptr),
value :: platform
125 integer(c_int64_t),
value :: device_type
126 integer(c_int),
value :: num_entries
127 type(c_ptr),
value :: devices
128 integer(c_int) :: num_devices
134 pfn_notify, user_data, ierr) bind(c, name =
'clCreateContext')
135 use,
intrinsic :: iso_c_binding
137 type(c_ptr),
value :: properties
138 integer(c_int),
value :: num_devices
139 type(c_ptr),
value :: devices
140 type(c_funptr),
value :: pfn_notify
141 type(c_ptr),
value :: user_data
142 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
160 bind(c, name =
'clCreateBuffer')
161 use,
intrinsic :: iso_c_binding
163 type(c_ptr),
value :: context
164 integer(c_int),
value :: flags
165 integer(c_size_t),
value :: size
166 type(c_ptr),
value :: host_ptr
167 integer(c_int) :: ierr
173 bind(c, name =
'clCreateUserEvent')
174 use,
intrinsic :: iso_c_binding
176 type(c_ptr),
value :: context
177 integer(c_int) :: ierr
183 offset, size, ptr, num_events_in_wait_list, event_wait_list, event) &
184 bind(c, name =
'clEnqueueReadBuffer')
185 use,
intrinsic :: iso_c_binding
187 type(c_ptr),
value :: queue
188 type(c_ptr),
value ::
buffer
189 integer(c_int),
value :: blocking_read
190 integer(c_size_t),
value :: offset
191 integer(c_size_t),
value :: size
192 type(c_ptr),
value :: ptr
193 integer(c_int),
value :: num_events_in_wait_list
194 type(c_ptr),
value :: event_wait_list
195 type(c_ptr),
value :: event
201 blocking_write, offset, size, ptr, num_events_in_wait_list, &
202 event_wait_list, event) bind(c, name = 'clEnqueueWriteBuffer')
203 use,
intrinsic :: iso_c_binding
205 type(c_ptr),
value :: queue
206 type(c_ptr),
value ::
buffer
207 integer(c_int),
value :: blocking_write
208 integer(c_size_t),
value :: offset
209 integer(c_size_t),
value :: size
210 type(c_ptr),
value :: ptr
211 integer(c_int),
value :: num_events_in_wait_list
212 type(c_ptr),
value :: event_wait_list
213 type(c_ptr),
value :: event
219 dst_buffer, src_offset, dst_offset, size, num_events_in_wait_list, &
220 event_wait_list, event) bind(c, name = 'clEnqueueCopyBuffer')
221 use,
intrinsic :: iso_c_binding
223 type(c_ptr),
value :: queue
224 type(c_ptr),
value :: src_buffer
225 type(c_ptr),
value :: dst_buffer
226 integer(c_size_t),
value :: src_offset
227 integer(c_size_t),
value :: dst_offset
228 integer(c_size_t),
value :: size
229 integer(c_int),
value :: num_events_in_wait_list
230 type(c_ptr),
value :: event_wait_list
231 type(c_ptr),
value :: event
237 pattern, pattern_size, offset, size, num_events_in_wait_list, &
238 event_wait_list, event) bind(c, name = 'clEnqueueFillBuffer')
239 use,
intrinsic :: iso_c_binding
241 type(c_ptr),
value :: queue
242 type(c_ptr),
value ::
buffer
243 type(c_ptr),
value :: pattern
244 integer(c_size_t),
value :: pattern_size
245 integer(c_size_t),
value :: 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) bind(c, name = 'clEnqueueWaitForEvents')
288 use,
intrinsic :: iso_c_binding
290 type(c_ptr),
value :: queue
291 integer(c_int),
value :: num_events
292 type(c_ptr),
value :: event_list
298 bind(c, name =
'clWaitForEvents')
299 use,
intrinsic :: iso_c_binding
301 integer(c_int),
value :: num_events
302 type(c_ptr),
value :: event_list
308 bind(c, name =
'clSetUserEventStatus')
309 use,
intrinsic :: iso_c_binding
311 type(c_ptr),
value :: event
312 integer(c_int),
value :: status
318 param_value_size, param_value, param_value_size_ret) &
319 bind(c, name =
'clGetDeviceInfo')
320 use,
intrinsic :: iso_c_binding
322 type(c_ptr),
value ::
device
323 integer(c_int),
value :: param_name
324 integer(c_size_t),
value :: param_value_size
325 type(c_ptr),
value :: param_value
326 type(c_ptr),
value :: param_value_size_ret
332 bind(c, name =
'clReleaseContext')
333 use,
intrinsic :: iso_c_binding
335 type(c_ptr),
value :: context
341 bind(c, name =
'clReleaseCommandQueue')
342 use,
intrinsic :: iso_c_binding
344 type(c_ptr),
value :: queue
350 bind(c, name =
'clReleaseDevice')
351 use,
intrinsic :: iso_c_binding
353 type(c_ptr),
value ::
device
359 bind(c, name =
'clReleaseProgram')
360 use,
intrinsic :: iso_c_binding
362 type(c_ptr),
value :: prgm
368 bind(c, name =
'clReleaseMemObject')
369 use,
intrinsic :: iso_c_binding
371 type(c_ptr),
value :: ptr_d
377 bind(c, name =
'clReleaseEvent')
378 use,
intrinsic :: iso_c_binding
380 type(c_ptr),
value :: event
386 bind(c, name =
'clFlush')
387 use,
intrinsic :: iso_c_binding
389 type(c_ptr),
value :: cmd_queue
395 bind(c, name =
'clFinish')
396 use,
intrinsic :: iso_c_binding
398 type(c_ptr),
value :: cmd_queue
405 type(c_ptr),
intent(inout) :: glb_cmd_queue
406 type(c_ptr),
intent(inout) :: aux_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')
457 type(c_ptr),
intent(inout) :: glb_cmd_queue
458 type(c_ptr),
intent(inout) :: aux_cmd_queue
460 if (c_associated(glb_ctx))
then
462 call neko_error(
'Failed to release context')
467 if (c_associated(glb_cmd_queue))
then
469 call neko_error(
'Failed to release command queue')
471 glb_cmd_queue = c_null_ptr
474 if (c_associated(aux_cmd_queue))
then
476 call neko_error(
'Failed to release command queue')
478 aux_cmd_queue = c_null_ptr
481 if (c_associated(glb_device_id))
then
483 call neko_error(
'Failed to release device')
490 character(len=*),
intent(inout) :: name
491 character(kind=c_char, len=1024),
target :: c_name
492 integer(c_size_t),
target :: name_len
495 c_loc(c_name), c_loc(name_len)) .ne.
cl_success)
then
496 call neko_error(
'Failed to query device')
499 name(1:name_len) = c_name(1:name_len)
505 type(c_ptr),
target :: platform_id
506 integer(c_int) :: num_platforms, num_devices
510 call neko_error(
'Failed to get a platform id')
514 c_null_ptr, num_devices) .ne.
cl_success)
then
515 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
integer function opencl_device_count()
Return the number of OpenCL devices.
subroutine opencl_finalize(glb_cmd_queue, aux_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
subroutine opencl_init(glb_cmd_queue, aux_cmd_queue)
integer(c_int64_t), parameter cl_device_type_all
integer(c_int64_t), parameter cl_device_type_accelerator