36 use,
intrinsic :: iso_c_binding
42 integer,
parameter :: metalSuccess = 0
47 integer(c_int) function metalalloc(ptr_d, s) &
48 bind(c, name =
'metal_alloc')
49 use,
intrinsic :: iso_c_binding
52 integer(c_size_t),
value :: s
53 end function metalalloc
57 integer(c_int) function metalmap(ptr_d, ptr_h, s) &
58 bind(c, name =
'metal_map')
59 use,
intrinsic :: iso_c_binding
62 type(c_ptr),
value :: ptr_h
63 integer(c_size_t),
value :: s
67 integer(c_int) function metalfree(ptr_d) &
68 bind(c, name =
'metal_free')
69 use,
intrinsic :: iso_c_binding
71 type(c_ptr),
value :: ptr_d
72 end function metalfree
75 integer(c_int) function metalmemcpyhtod(dst_d, src, s) &
76 bind(c, name =
'metal_memcpy_htod')
77 use,
intrinsic :: iso_c_binding
79 type(c_ptr),
value :: dst_d, src
80 integer(c_size_t),
value :: s
81 end function metalmemcpyhtod
84 integer(c_int) function metalmemcpydtoh(dst, src_d, s) &
85 bind(c, name =
'metal_memcpy_dtoh')
86 use,
intrinsic :: iso_c_binding
88 type(c_ptr),
value :: dst, src_d
89 integer(c_size_t),
value :: s
90 end function metalmemcpydtoh
93 integer(c_int) function metalmemcpydtod(dst_d, src_d, s) &
94 bind(c, name =
'metal_memcpy_dtod')
95 use,
intrinsic :: iso_c_binding
97 type(c_ptr),
value :: dst_d, src_d
98 integer(c_size_t),
value :: s
99 end function metalmemcpydtod
102 integer(c_int) function metalmemset(buf_d, v, s) &
103 bind(c, name =
'metal_memset')
104 use,
intrinsic :: iso_c_binding
106 type(c_ptr),
value :: buf_d
107 integer(c_int),
value :: v
108 integer(c_size_t),
value :: s
109 end function metalmemset
112 integer(c_int) function metaldevicesynchronize() &
113 bind(c, name =
'metal_device_sync')
114 use,
intrinsic :: iso_c_binding
116 end function metaldevicesynchronize
119 integer(c_int) function metalstreamsynchronize(stream) &
120 bind(c, name =
'metal_stream_sync')
121 use,
intrinsic :: iso_c_binding
123 type(c_ptr),
value :: stream
124 end function metalstreamsynchronize
127 integer(c_int) function metalstreamcreate(stream) &
128 bind(c, name =
'metal_stream_create')
129 use,
intrinsic :: iso_c_binding
131 type(c_ptr) :: stream
132 end function metalstreamcreate
135 integer(c_int) function metalstreamdestroy(stream) &
136 bind(c, name =
'metal_stream_destroy')
137 use,
intrinsic :: iso_c_binding
139 type(c_ptr),
value :: stream
140 end function metalstreamdestroy
143 integer(c_int) function metaleventcreate(event) &
144 bind(c, name =
'metal_event_create')
145 use,
intrinsic :: iso_c_binding
148 end function metaleventcreate
151 integer(c_int) function metaleventdestroy(event) &
152 bind(c, name =
'metal_event_destroy')
153 use,
intrinsic :: iso_c_binding
155 type(c_ptr),
value :: event
156 end function metaleventdestroy
159 integer(c_int) function metaleventrecord(event, stream) &
160 bind(c, name =
'metal_event_record')
161 use,
intrinsic :: iso_c_binding
163 type(c_ptr),
value :: event, stream
164 end function metaleventrecord
167 integer(c_int) function metaleventsynchronize(event) &
168 bind(c, name =
'metal_event_sync')
169 use,
intrinsic :: iso_c_binding
171 type(c_ptr),
value :: event
172 end function metaleventsynchronize
175 integer(c_int) function metalstreamwaitevent(stream, event) &
176 bind(c, name =
'metal_stream_wait_event')
177 use,
intrinsic :: iso_c_binding
179 type(c_ptr),
value :: stream, event
180 end function metalstreamwaitevent
183 subroutine metal_device_name_c(name, len) &
184 bind(c, name =
'metal_device_name')
185 use,
intrinsic :: iso_c_binding
187 type(c_ptr),
value :: name
188 integer(c_int),
value :: len
189 end subroutine metal_device_name_c
192 integer(c_int) function metal_device_count_c() &
193 bind(c, name =
'metal_device_count')
194 use,
intrinsic :: iso_c_binding
196 end function metal_device_count_c
203 subroutine metal_init(glb_cmd_queue, aux_cmd_queue)
204 type(c_ptr),
intent(inout) :: glb_cmd_queue
205 type(c_ptr),
intent(inout) :: aux_cmd_queue
208 subroutine metal_init_c(glb_q, aux_q) &
209 bind(c, name =
'metal_init')
210 use,
intrinsic :: iso_c_binding
214 end subroutine metal_init_c
217 call metal_init_c(glb_cmd_queue, aux_cmd_queue)
218 end subroutine metal_init
221 subroutine metal_finalize(glb_cmd_queue, aux_cmd_queue)
222 type(c_ptr),
intent(inout) :: glb_cmd_queue
223 type(c_ptr),
intent(inout) :: aux_cmd_queue
226 subroutine metal_finalize_c(glb_q, aux_q) &
227 bind(c, name =
'metal_finalize')
228 use,
intrinsic :: iso_c_binding
230 type(c_ptr),
value :: glb_q
231 type(c_ptr),
value :: aux_q
232 end subroutine metal_finalize_c
235 call metal_finalize_c(glb_cmd_queue, aux_cmd_queue)
236 end subroutine metal_finalize
239 subroutine metal_device_name(name)
240 character(len=*),
intent(inout) :: name
241 character(kind=c_char, len=256),
target :: c_name
244 call metal_device_name_c(c_loc(c_name), 256)
246 end_pos = scan(c_name, c_null_char)
247 if (end_pos .ge. 2)
then
248 name(1:end_pos-1) = c_name(1:end_pos-1)
250 end subroutine metal_device_name
253 integer function metal_device_count()
254 metal_device_count = metal_device_count_c()
255 end function metal_device_count