}
struct ggml_metal_event {
- void * obj; // id<MTLEvent>
+ void * obj; // id<MTLSharedEvent>
atomic_int value;
};
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;
}
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;
}
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));
}
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];
free(ev);
}
void ggml_metal_device_event_synchronize(ggml_metal_device_t dev, ggml_metal_event_t ev) {
- @autoreleasepool {
- id<MTLEvent> event = ev->obj;
-
- id<MTLCommandBuffer> cmd_buf = [dev->mtl_queue commandBuffer];
- [cmd_buf encodeWaitForEvent:event value:atomic_load_explicit(&ev->value, memory_order_relaxed)];
- [cmd_buf commit];
- [cmd_buf waitUntilCompleted];
+ id<MTLSharedEvent> event = ev->obj;
+ const bool res = [event waitUntilSignaledValue:atomic_load_explicit(&ev->value, memory_order_relaxed) timeoutMS:60000];
+ if (!res) {
+ GGML_ABORT("%s: failed to wait for event\n", __func__);
}
+
+ GGML_UNUSED(dev);
}
void ggml_metal_device_get_memory(ggml_metal_device_t dev, size_t * free, size_t * total) {