metal : fix event synchronization (#22260)
This commit is contained in:
@@ -931,13 +931,13 @@ void ggml_metal_device_rsets_keep_alive(ggml_metal_device_t dev) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ggml_metal_event {
|
struct ggml_metal_event {
|
||||||
void * obj; // id<MTLEvent>
|
void * obj; // id<MTLSharedEvent>
|
||||||
|
|
||||||
atomic_int value;
|
atomic_int value;
|
||||||
};
|
};
|
||||||
|
|
||||||
void ggml_metal_event_encode_signal(ggml_metal_event_t ev, ggml_metal_cmd_buf_t cmd_buf_raw) {
|
void ggml_metal_event_encode_signal(ggml_metal_event_t ev, ggml_metal_cmd_buf_t cmd_buf_raw) {
|
||||||
id<MTLEvent> event = (id<MTLEvent>)ev->obj;
|
id<MTLSharedEvent> event = (id<MTLSharedEvent>)ev->obj;
|
||||||
|
|
||||||
id<MTLCommandBuffer> cmd_buf = (id<MTLCommandBuffer>) cmd_buf_raw;
|
id<MTLCommandBuffer> cmd_buf = (id<MTLCommandBuffer>) cmd_buf_raw;
|
||||||
|
|
||||||
@@ -945,7 +945,7 @@ void ggml_metal_event_encode_signal(ggml_metal_event_t ev, ggml_metal_cmd_buf_t
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ggml_metal_event_encode_wait(ggml_metal_event_t ev, ggml_metal_cmd_buf_t cmd_buf_raw) {
|
void ggml_metal_event_encode_wait(ggml_metal_event_t ev, ggml_metal_cmd_buf_t cmd_buf_raw) {
|
||||||
id<MTLEvent> event = (id<MTLEvent>)ev->obj;
|
id<MTLSharedEvent> event = (id<MTLSharedEvent>)ev->obj;
|
||||||
|
|
||||||
id<MTLCommandBuffer> cmd_buf = (id<MTLCommandBuffer>) cmd_buf_raw;
|
id<MTLCommandBuffer> cmd_buf = (id<MTLCommandBuffer>) cmd_buf_raw;
|
||||||
|
|
||||||
@@ -953,7 +953,7 @@ void ggml_metal_event_encode_wait(ggml_metal_event_t ev, ggml_metal_cmd_buf_t cm
|
|||||||
}
|
}
|
||||||
|
|
||||||
ggml_metal_event_t ggml_metal_device_event_init(ggml_metal_device_t dev) {
|
ggml_metal_event_t ggml_metal_device_event_init(ggml_metal_device_t dev) {
|
||||||
id<MTLEvent> event = [dev->mtl_device newEvent];
|
id<MTLSharedEvent> event = [dev->mtl_device newSharedEvent];
|
||||||
|
|
||||||
ggml_metal_event_t ev = calloc(1, sizeof(struct ggml_metal_event));
|
ggml_metal_event_t ev = calloc(1, sizeof(struct ggml_metal_event));
|
||||||
|
|
||||||
@@ -964,7 +964,7 @@ ggml_metal_event_t ggml_metal_device_event_init(ggml_metal_device_t dev) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ggml_metal_device_event_free(ggml_metal_device_t dev, ggml_metal_event_t ev) {
|
void ggml_metal_device_event_free(ggml_metal_device_t dev, ggml_metal_event_t ev) {
|
||||||
id<MTLEvent> event = ev->obj;
|
id<MTLSharedEvent> event = ev->obj;
|
||||||
[event release];
|
[event release];
|
||||||
|
|
||||||
free(ev);
|
free(ev);
|
||||||
@@ -973,14 +973,13 @@ void ggml_metal_device_event_free(ggml_metal_device_t dev, ggml_metal_event_t ev
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ggml_metal_device_event_synchronize(ggml_metal_device_t dev, ggml_metal_event_t ev) {
|
void ggml_metal_device_event_synchronize(ggml_metal_device_t dev, ggml_metal_event_t ev) {
|
||||||
@autoreleasepool {
|
id<MTLSharedEvent> event = ev->obj;
|
||||||
id<MTLEvent> event = ev->obj;
|
const bool res = [event waitUntilSignaledValue:atomic_load_explicit(&ev->value, memory_order_relaxed) timeoutMS:60000];
|
||||||
|
if (!res) {
|
||||||
id<MTLCommandBuffer> cmd_buf = [dev->mtl_queue commandBuffer];
|
GGML_ABORT("%s: failed to wait for event\n", __func__);
|
||||||
[cmd_buf encodeWaitForEvent:event value:atomic_load_explicit(&ev->value, memory_order_relaxed)];
|
|
||||||
[cmd_buf commit];
|
|
||||||
[cmd_buf waitUntilCompleted];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GGML_UNUSED(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ggml_metal_device_get_memory(ggml_metal_device_t dev, size_t * free, size_t * total) {
|
void ggml_metal_device_get_memory(ggml_metal_device_t dev, size_t * free, size_t * total) {
|
||||||
|
|||||||
Reference in New Issue
Block a user