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
123 num_entries, devices, num_devices) bind(c, name = 'clGetDeviceIDs')
124 use,
intrinsic :: iso_c_binding
126 type(c_ptr),
value :: platform
127 integer(c_int64_t),
value :: device_type
128 integer(c_int),
value :: num_entries
129 type(c_ptr),
value :: devices
130 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
146 properties, ierr) bind(c, name =
'clCreateCommandQueue')
147 use,
intrinsic :: iso_c_binding
149 type(c_ptr),
value :: context
150 type(c_ptr),
value ::
device
151 integer(c_int64_t),
value :: properties
152 integer(c_int) :: ierr
156 bind(c, name =
'clCreateBuffer')
157 use,
intrinsic :: iso_c_binding
159 type(c_ptr),
value :: context
160 integer(c_int),
value :: flags
161 integer(c_size_t),
value :: size
162 type(c_ptr),
value :: host_ptr
163 integer(c_int) :: ierr
167 bind(c, name =
'clCreateUserEvent')
168 use,
intrinsic :: iso_c_binding
170 type(c_ptr),
value :: context
171 integer(c_int) :: ierr
175 offset, size, ptr, num_events_in_wait_list, event_wait_list, event) &
176 bind(c, name =
'clEnqueueReadBuffer')
177 use,
intrinsic :: iso_c_binding
179 type(c_ptr),
value :: queue
180 type(c_ptr),
value ::
buffer
181 integer(c_int),
value :: blocking_read
182 integer(c_size_t),
value :: offset
183 integer(c_size_t),
value :: size
184 type(c_ptr),
value :: ptr
185 integer(c_int),
value :: num_events_in_wait_list
186 type(c_ptr),
value :: event_wait_list
187 type(c_ptr),
value :: event
191 blocking_write, offset, size, ptr, num_events_in_wait_list, &
192 event_wait_list, event) bind(c, name = 'clEnqueueWriteBuffer')
193 use,
intrinsic :: iso_c_binding
195 type(c_ptr),
value :: queue
196 type(c_ptr),
value ::
buffer
197 integer(c_int),
value :: blocking_write
198 integer(c_size_t),
value :: offset
199 integer(c_size_t),
value :: size
200 type(c_ptr),
value :: ptr
201 integer(c_int),
value :: num_events_in_wait_list
202 type(c_ptr),
value :: event_wait_list
203 type(c_ptr),
value :: event
207 dst_buffer, src_offset, dst_offset, size, num_events_in_wait_list, &
208 event_wait_list, event) bind(c, name = 'clEnqueueCopyBuffer')
209 use,
intrinsic :: iso_c_binding
211 type(c_ptr),
value :: queue
212 type(c_ptr),
value :: src_buffer
213 type(c_ptr),
value :: dst_buffer
214 integer(c_size_t),
value :: src_offset
215 integer(c_size_t),
value :: dst_offset
216 integer(c_size_t),
value :: size
217 integer(c_int),
value :: num_events_in_wait_list
218 type(c_ptr),
value :: event_wait_list
219 type(c_ptr),
value :: event
223 pattern, pattern_size, offset, size, num_events_in_wait_list, &
224 event_wait_list, event) bind(c, name = 'clEnqueueFillBuffer')
225 use,
intrinsic :: iso_c_binding
227 type(c_ptr),
value :: queue
228 type(c_ptr),
value ::
buffer
229 type(c_ptr),
value :: pattern
230 integer(c_size_t),
value :: pattern_size
231 integer(c_size_t),
value :: 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
239 (queue, num_events_in_wait_list, event_wait_list, event) &
240 bind(c, name =
'clEnqueueMarkerWithWaitList')
241 use,
intrinsic :: iso_c_binding
243 type(c_ptr),
value :: queue
244 integer(c_int),
value :: num_events_in_wait_list
245 type(c_ptr),
value :: event_wait_list
246 type(c_ptr),
value :: event
250 bind(c, name =
'clEnqueueMarker')
251 use,
intrinsic :: iso_c_binding
253 type(c_ptr),
value :: cmd_queue
254 type(c_ptr),
value :: event
258 bind(c, name =
'clEnqueueBarrier')
259 use,
intrinsic :: iso_c_binding
261 type(c_ptr),
value :: cmd_queue
265 num_events, event_list) bind(c, name = 'clEnqueueWaitForEvents')
266 use,
intrinsic :: iso_c_binding
268 type(c_ptr),
value :: queue
269 integer(c_int),
value :: num_events
270 type(c_ptr),
value :: event_list
274 bind(c, name =
'clWaitForEvents')
275 use,
intrinsic :: iso_c_binding
277 integer(c_int),
value :: num_events
278 type(c_ptr),
value :: event_list
282 bind(c, name =
'clSetUserEventStatus')
283 use,
intrinsic :: iso_c_binding
285 type(c_ptr),
value :: event
286 integer(c_int),
value :: status
290 param_value_size, param_value, param_value_size_ret) &
291 bind(c, name =
'clGetDeviceInfo')
292 use,
intrinsic :: iso_c_binding
294 type(c_ptr),
value ::
device
295 integer(c_int),
value :: param_name
296 integer(c_size_t),
value :: param_value_size
297 type(c_ptr),
value :: param_value
298 type(c_ptr),
value :: param_value_size_ret
302 bind(c, name =
'clReleaseContext')
303 use,
intrinsic :: iso_c_binding
305 type(c_ptr),
value :: context
309 bind(c, name =
'clReleaseCommandQueue')
310 use,
intrinsic :: iso_c_binding
312 type(c_ptr),
value :: queue
316 bind(c, name =
'clReleaseDevice')
317 use,
intrinsic :: iso_c_binding
319 type(c_ptr),
value ::
device
323 bind(c, name =
'clReleaseProgram')
324 use,
intrinsic :: iso_c_binding
326 type(c_ptr),
value :: prgm
330 bind(c, name =
'clReleaseMemObject')
331 use,
intrinsic :: iso_c_binding
333 type(c_ptr),
value :: ptr_d
337 bind(c, name =
'clReleaseEvent')
338 use,
intrinsic :: iso_c_binding
340 type(c_ptr),
value :: event
344 bind(c, name =
'clFlush')
345 use,
intrinsic :: iso_c_binding
347 type(c_ptr),
value :: cmd_queue
351 bind(c, name =
'clFinish')
352 use,
intrinsic :: iso_c_binding
354 type(c_ptr),
value :: cmd_queue
360 subroutine opencl_init(glb_cmd_queue, aux_cmd_queue, prf_cmd_queue)
361 type(c_ptr),
intent(inout) :: glb_cmd_queue
362 type(c_ptr),
intent(inout) :: aux_cmd_queue
363 type(c_ptr),
intent(inout) :: prf_cmd_queue
364 type(c_ptr),
target :: platform_id
365 integer(c_int) :: num_platforms, num_devices, ierr
366 integer(c_intptr_t) :: ctx_prop(3)
367 integer(c_int64_t),
parameter :: queue_props = 0
372 call neko_error(
'Failed to get a platform id')
376 c_loc(glb_device_id), num_devices) .ne.
cl_success)
then
377 call neko_error(
'Failed to get a device id')
380 if (c_associated(glb_ctx))
then
382 call neko_error(
'Failed to release context')
386 glb_ctx =
clcreatecontext(c_null_ptr, num_devices, c_loc(glb_device_id), &
387 c_null_funptr, c_null_ptr, ierr)
390 call neko_error(
'Failed to create an OpenCL context')
393 if (c_associated(glb_cmd_queue))
then
395 call neko_error(
'Faield to release command queue')
402 call neko_error(
'Failed to create a command queue')
408 call neko_error(
'Failed to create a command queue')
414 call neko_error(
'Failed to create a command queue')
420 type(c_ptr),
intent(inout) :: glb_cmd_queue
421 type(c_ptr),
intent(inout) :: aux_cmd_queue
422 type(c_ptr),
intent(inout) :: prf_cmd_queue
424 if (c_associated(glb_ctx))
then
426 call neko_error(
'Failed to release context')
431 if (c_associated(glb_cmd_queue))
then
433 call neko_error(
'Failed to release command queue')
435 glb_cmd_queue = c_null_ptr
438 if (c_associated(aux_cmd_queue))
then
440 call neko_error(
'Failed to release command queue')
442 aux_cmd_queue = c_null_ptr
445 if (c_associated(prf_cmd_queue))
then
447 call neko_error(
'Failed to release command queue')
449 prf_cmd_queue = c_null_ptr
452 if (c_associated(glb_device_id))
then
454 call neko_error(
'Failed to release device')
461 character(len=*),
intent(inout) :: name
462 character(kind=c_char, len=1024),
target :: c_name
463 integer(c_size_t),
target :: name_len
466 c_loc(c_name), c_loc(name_len)) .ne.
cl_success)
then
467 call neko_error(
'Failed to query device')
470 name(1:name_len) = c_name(1:name_len)
476 type(c_ptr),
target :: platform_id
477 integer(c_int) :: num_platforms, num_devices
481 call neko_error(
'Failed to get a platform id')
485 c_null_ptr, num_devices) .ne.
cl_success)
then
486 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