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