@@ -931,29 +931,29 @@ void ggml_metal_device_rsets_keep_alive(ggml_metal_device_t dev) {
931931}
932932
933933struct ggml_metal_event {
934- void * obj; // id<MTLEvent >
934+ void * obj; // id<MTLSharedEvent >
935935
936936 atomic_int value;
937937};
938938
939939void 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
947947void 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
955955ggml_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
966966void 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
975975void 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
986985void ggml_metal_device_get_memory (ggml_metal_device_t dev, size_t * free, size_t * total) {
0 commit comments