Skip to content

Commit b28f300

Browse files
ggerganovarthw
authored andcommitted
metal : fix event synchronization (ggml-org#22260)
1 parent da26452 commit b28f300

1 file changed

Lines changed: 11 additions & 12 deletions

File tree

ggml/src/ggml-metal/ggml-metal-device.m

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -931,29 +931,29 @@ void ggml_metal_device_rsets_keep_alive(ggml_metal_device_t dev) {
931931
}
932932

933933
struct ggml_metal_event {
934-
void * obj; // id<MTLEvent>
934+
void * obj; // id<MTLSharedEvent>
935935

936936
atomic_int value;
937937
};
938938

939939
void ggml_metal_event_encode_signal(ggml_metal_event_t ev, ggml_metal_cmd_buf_t cmd_buf_raw) {
940-
id<MTLEvent> event = (id<MTLEvent>)ev->obj;
940+
id<MTLSharedEvent> event = (id<MTLSharedEvent>)ev->obj;
941941

942942
id<MTLCommandBuffer> cmd_buf = (id<MTLCommandBuffer>) cmd_buf_raw;
943943

944944
[cmd_buf encodeSignalEvent:event value:atomic_fetch_add_explicit(&ev->value, 1, memory_order_relaxed) + 1];
945945
}
946946

947947
void ggml_metal_event_encode_wait(ggml_metal_event_t ev, ggml_metal_cmd_buf_t cmd_buf_raw) {
948-
id<MTLEvent> event = (id<MTLEvent>)ev->obj;
948+
id<MTLSharedEvent> event = (id<MTLSharedEvent>)ev->obj;
949949

950950
id<MTLCommandBuffer> cmd_buf = (id<MTLCommandBuffer>) cmd_buf_raw;
951951

952952
[cmd_buf encodeWaitForEvent:event value:atomic_load_explicit(&ev->value, memory_order_relaxed)];
953953
}
954954

955955
ggml_metal_event_t ggml_metal_device_event_init(ggml_metal_device_t dev) {
956-
id<MTLEvent> event = [dev->mtl_device newEvent];
956+
id<MTLSharedEvent> event = [dev->mtl_device newSharedEvent];
957957

958958
ggml_metal_event_t ev = calloc(1, sizeof(struct ggml_metal_event));
959959

@@ -964,7 +964,7 @@ ggml_metal_event_t ggml_metal_device_event_init(ggml_metal_device_t dev) {
964964
}
965965

966966
void ggml_metal_device_event_free(ggml_metal_device_t dev, ggml_metal_event_t ev) {
967-
id<MTLEvent> event = ev->obj;
967+
id<MTLSharedEvent> event = ev->obj;
968968
[event release];
969969

970970
free(ev);
@@ -973,14 +973,13 @@ void ggml_metal_device_event_free(ggml_metal_device_t dev, ggml_metal_event_t ev
973973
}
974974

975975
void ggml_metal_device_event_synchronize(ggml_metal_device_t dev, ggml_metal_event_t ev) {
976-
@autoreleasepool {
977-
id<MTLEvent> event = ev->obj;
978-
979-
id<MTLCommandBuffer> cmd_buf = [dev->mtl_queue commandBuffer];
980-
[cmd_buf encodeWaitForEvent:event value:atomic_load_explicit(&ev->value, memory_order_relaxed)];
981-
[cmd_buf commit];
982-
[cmd_buf waitUntilCompleted];
976+
id<MTLSharedEvent> event = ev->obj;
977+
const bool res = [event waitUntilSignaledValue:atomic_load_explicit(&ev->value, memory_order_relaxed) timeoutMS:60000];
978+
if (!res) {
979+
GGML_ABORT("%s: failed to wait for event\n", __func__);
983980
}
981+
982+
GGML_UNUSED(dev);
984983
}
985984

986985
void ggml_metal_device_get_memory(ggml_metal_device_t dev, size_t * free, size_t * total) {

0 commit comments

Comments
 (0)