summaryrefslogtreecommitdiff
path: root/ggml-metal.m
diff options
context:
space:
mode:
Diffstat (limited to 'ggml-metal.m')
-rw-r--r--ggml-metal.m39
1 files changed, 39 insertions, 0 deletions
diff --git a/ggml-metal.m b/ggml-metal.m
index c6d580b8..cf3aed48 100644
--- a/ggml-metal.m
+++ b/ggml-metal.m
@@ -2779,6 +2779,45 @@ static enum ggml_status ggml_metal_graph_compute(
MTLCommandBufferStatus status = [command_buffer status];
if (status != MTLCommandBufferStatusCompleted) {
GGML_METAL_LOG_INFO("%s: command buffer %d failed with status %lu\n", __func__, i, status);
+ if (status == MTLCommandBufferStatusError) {
+ MTLCommandBufferError error_code = [command_buffer error].code;
+ switch (error_code) {
+ case MTLCommandBufferErrorNone:
+ GGML_METAL_LOG_INFO("no error code reported\n");
+ break;
+ case MTLCommandBufferErrorTimeout:
+ GGML_METAL_LOG_INFO("timeout\n");
+ break;
+ case MTLCommandBufferErrorPageFault:
+ GGML_METAL_LOG_INFO("unserviceable page fault\n");
+ break;
+ case MTLCommandBufferErrorOutOfMemory:
+ GGML_METAL_LOG_INFO("out of memory\n");
+ break;
+ case MTLCommandBufferErrorInvalidResource:
+ GGML_METAL_LOG_INFO("invalid reference to resource\n");
+ break;
+ case MTLCommandBufferErrorMemoryless:
+ GGML_METAL_LOG_INFO("GPU ran out of one or more of its internal resources that support memoryless render pass attachments\n");
+ break;
+ case MTLCommandBufferErrorDeviceRemoved:
+ GGML_METAL_LOG_INFO("device removed\n");
+ break;
+ case MTLCommandBufferErrorStackOverflow:
+ GGML_METAL_LOG_INFO("kernel function of tile shader used too many stack frames\n");
+ break;
+ case MTLCommandBufferErrorAccessRevoked:
+ GGML_METAL_LOG_INFO("access to device revoked by system\n");
+ break;
+ case MTLCommandBufferErrorInternal:
+ GGML_METAL_LOG_INFO("internal error\n");
+ break;
+ default:
+ GGML_METAL_LOG_INFO("unknown error %lu\n", error_code);
+ break;
+ }
+ }
+
return GGML_STATUS_FAILED;
}
}