ctx->cmd_buf_last = nil;
}
- // release any completed command buffers
+ // check status of all command buffers
+ {
+ const int n_cb = ctx->n_cb;
+
+ for (int cb_idx = 0; cb_idx <= n_cb; ++cb_idx) {
+ id<MTLCommandBuffer> cmd_buf = ctx->cmd_bufs[cb_idx].obj;
+ if (!cmd_buf) {
+ continue;
+ }
+
+ MTLCommandBufferStatus status = [cmd_buf status];
+ if (status != MTLCommandBufferStatusCompleted) {
+ GGML_LOG_ERROR("%s: error: command buffer %d failed with status %d\n", __func__, cb_idx, (int) status);
+ if (status == MTLCommandBufferStatusError) {
+ GGML_LOG_ERROR("error: %s\n", [[cmd_buf error].localizedDescription UTF8String]);
+ }
+ GGML_ABORT("fatal error");
+ }
+ }
+ }
+
+ // release any completed extra command buffers
if (ctx->cmd_bufs_ext.count > 0) {
for (size_t i = 0; i < ctx->cmd_bufs_ext.count; ++i) {
id<MTLCommandBuffer> cmd_buf = ctx->cmd_bufs_ext[i];
length:size
options:MTLResourceStorageModeShared];
+ GGML_ASSERT(buf_src);
+
struct ggml_metal_buffer_id bid_dst = ggml_metal_get_buffer_id(tensor);
if (bid_dst.metal == nil) {
GGML_ABORT("%s: failed to find buffer for tensor '%s'\n", __func__, tensor->name);
options:MTLResourceStorageModeShared
deallocator:nil];
+ GGML_ASSERT(buf_dst);
+
struct ggml_metal_buffer_id bid_src = ggml_metal_get_buffer_id(tensor);
if (bid_src.metal == nil) {
GGML_ABORT("%s: failed to find buffer for tensor '%s'\n", __func__, tensor->name);
options:MTLResourceStorageModeShared
deallocator:nil];
+ GGML_ASSERT(buf_src);
+
// dst
struct ggml_metal_buffer_id bid_dst = ggml_metal_buffer_get_id(buf, tensor);
bid_dst.offs += offset;
options:MTLResourceStorageModeShared
deallocator:nil];
+ GGML_ASSERT(buf_dst);
+
id<MTLCommandQueue> queue = buf->queue;
id<MTLCommandBuffer> cmd_buf = [queue commandBufferWithUnretainedReferences];