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
56 integer(c_int) function metalfree(ptr_d) &
57 bind(c, name =
'metal_free')
58 use,
intrinsic :: iso_c_binding
60 type(c_ptr),
value :: ptr_d
61 end function metalfree
64 integer(c_int) function metalmemcpyhtod(dst_d, src, s) &
65 bind(c, name =
'metal_memcpy_htod')
66 use,
intrinsic :: iso_c_binding
68 type(c_ptr),
value :: dst_d, src
69 integer(c_size_t),
value :: s
70 end function metalmemcpyhtod
73 integer(c_int) function metalmemcpydtoh(dst, src_d, s) &
74 bind(c, name =
'metal_memcpy_dtoh')
75 use,
intrinsic :: iso_c_binding
77 type(c_ptr),
value :: dst, src_d
78 integer(c_size_t),
value :: s
79 end function metalmemcpydtoh
82 integer(c_int) function metalmemcpydtod(dst_d, src_d, s) &
83 bind(c, name =
'metal_memcpy_dtod')
84 use,
intrinsic :: iso_c_binding
86 type(c_ptr),
value :: dst_d, src_d
87 integer(c_size_t),
value :: s
88 end function metalmemcpydtod
91 integer(c_int) function metalmemset(buf_d, v, s) &
92 bind(c, name =
'metal_memset')
93 use,
intrinsic :: iso_c_binding
95 type(c_ptr),
value :: buf_d
96 integer(c_int),
value :: v
97 integer(c_size_t),
value :: s
98 end function metalmemset
101 integer(c_int) function metaldevicesynchronize() &
102 bind(c, name =
'metal_device_sync')
103 use,
intrinsic :: iso_c_binding
105 end function metaldevicesynchronize
108 integer(c_int) function metalstreamsynchronize(stream) &
109 bind(c, name =
'metal_stream_sync')
110 use,
intrinsic :: iso_c_binding
112 type(c_ptr),
value :: stream
113 end function metalstreamsynchronize
116 integer(c_int) function metalstreamcreate(stream) &
117 bind(c, name =
'metal_stream_create')
118 use,
intrinsic :: iso_c_binding
120 type(c_ptr) :: stream
121 end function metalstreamcreate
124 integer(c_int) function metalstreamdestroy(stream) &
125 bind(c, name =
'metal_stream_destroy')
126 use,
intrinsic :: iso_c_binding
128 type(c_ptr),
value :: stream
129 end function metalstreamdestroy
132 integer(c_int) function metaleventcreate(event) &
133 bind(c, name =
'metal_event_create')
134 use,
intrinsic :: iso_c_binding
137 end function metaleventcreate
140 integer(c_int) function metaleventdestroy(event) &
141 bind(c, name =
'metal_event_destroy')
142 use,
intrinsic :: iso_c_binding
144 type(c_ptr),
value :: event
145 end function metaleventdestroy
148 integer(c_int) function metaleventrecord(event, stream) &
149 bind(c, name =
'metal_event_record')
150 use,
intrinsic :: iso_c_binding
152 type(c_ptr),
value :: event, stream
153 end function metaleventrecord
156 integer(c_int) function metaleventsynchronize(event) &
157 bind(c, name =
'metal_event_sync')
158 use,
intrinsic :: iso_c_binding
160 type(c_ptr),
value :: event
161 end function metaleventsynchronize
164 integer(c_int) function metalstreamwaitevent(stream, event) &
165 bind(c, name =
'metal_stream_wait_event')
166 use,
intrinsic :: iso_c_binding
168 type(c_ptr),
value :: stream, event
169 end function metalstreamwaitevent
172 subroutine metal_device_name_c(name, len) &
173 bind(c, name =
'metal_device_name')
174 use,
intrinsic :: iso_c_binding
176 type(c_ptr),
value :: name
177 integer(c_int),
value :: len
178 end subroutine metal_device_name_c
181 integer(c_int) function metal_device_count_c() &
182 bind(c, name =
'metal_device_count')
183 use,
intrinsic :: iso_c_binding
185 end function metal_device_count_c
192 subroutine metal_init(glb_cmd_queue, aux_cmd_queue)
193 type(c_ptr),
intent(inout) :: glb_cmd_queue
194 type(c_ptr),
intent(inout) :: aux_cmd_queue
197 subroutine metal_init_c(glb_q, aux_q) &
198 bind(c, name =
'metal_init')
199 use,
intrinsic :: iso_c_binding
203 end subroutine metal_init_c
206 call metal_init_c(glb_cmd_queue, aux_cmd_queue)
207 end subroutine metal_init
210 subroutine metal_finalize(glb_cmd_queue, aux_cmd_queue)
211 type(c_ptr),
intent(inout) :: glb_cmd_queue
212 type(c_ptr),
intent(inout) :: aux_cmd_queue
215 subroutine metal_finalize_c(glb_q, aux_q) &
216 bind(c, name =
'metal_finalize')
217 use,
intrinsic :: iso_c_binding
219 type(c_ptr),
value :: glb_q
220 type(c_ptr),
value :: aux_q
221 end subroutine metal_finalize_c
224 call metal_finalize_c(glb_cmd_queue, aux_cmd_queue)
225 end subroutine metal_finalize
228 subroutine metal_device_name(name)
229 character(len=*),
intent(inout) :: name
230 character(kind=c_char, len=256),
target :: c_name
233 call metal_device_name_c(c_loc(c_name), 256)
235 end_pos = scan(c_name, c_null_char)
236 if (end_pos .ge. 2)
then
237 name(1:end_pos-1) = c_name(1:end_pos-1)
239 end subroutine metal_device_name
242 integer function metal_device_count()
243 metal_device_count = metal_device_count_c()
244 end function metal_device_count