@@ -222,7 +222,28 @@ void ggml_metal_synchronize(ggml_metal_t ctx) {
222
222
ctx->cmd_buf_last = nil ;
223
223
}
224
224
225
- // release any completed command buffers
225
+ // check status of all command buffers
226
+ {
227
+ const int n_cb = ctx->n_cb ;
228
+
229
+ for (int cb_idx = 0 ; cb_idx <= n_cb; ++cb_idx) {
230
+ id <MTLCommandBuffer > cmd_buf = ctx->cmd_bufs [cb_idx].obj ;
231
+ if (!cmd_buf) {
232
+ continue ;
233
+ }
234
+
235
+ MTLCommandBufferStatus status = [cmd_buf status ];
236
+ if (status != MTLCommandBufferStatusCompleted ) {
237
+ GGML_LOG_ERROR (" %s : error: command buffer %d failed with status %d \n " , __func__, cb_idx, (int ) status);
238
+ if (status == MTLCommandBufferStatusError ) {
239
+ GGML_LOG_ERROR (" error: %s \n " , [[cmd_buf error ].localizedDescription UTF8String ]);
240
+ }
241
+ GGML_ABORT (" fatal error" );
242
+ }
243
+ }
244
+ }
245
+
246
+ // release any completed extra command buffers
226
247
if (ctx->cmd_bufs_ext .count > 0 ) {
227
248
for (size_t i = 0 ; i < ctx->cmd_bufs_ext .count ; ++i) {
228
249
id <MTLCommandBuffer > cmd_buf = ctx->cmd_bufs_ext [i];
@@ -260,6 +281,8 @@ void ggml_metal_set_tensor_async(ggml_metal_t ctx, struct ggml_tensor * tensor,
260
281
length: size
261
282
options: MTLResourceStorageModeShared ];
262
283
284
+ GGML_ASSERT (buf_src);
285
+
263
286
struct ggml_metal_buffer_id bid_dst = ggml_metal_get_buffer_id (tensor);
264
287
if (bid_dst.metal == nil ) {
265
288
GGML_ABORT (" %s : failed to find buffer for tensor '%s '\n " , __func__, tensor->name );
@@ -299,6 +322,8 @@ void ggml_metal_get_tensor_async(ggml_metal_t ctx, const struct ggml_tensor * te
299
322
options: MTLResourceStorageModeShared
300
323
deallocator: nil ];
301
324
325
+ GGML_ASSERT (buf_dst);
326
+
302
327
struct ggml_metal_buffer_id bid_src = ggml_metal_get_buffer_id (tensor);
303
328
if (bid_src.metal == nil ) {
304
329
GGML_ABORT (" %s : failed to find buffer for tensor '%s '\n " , __func__, tensor->name );
0 commit comments