@@ -547,6 +547,8 @@ void ggml_metal_encoder_end_encoding(ggml_metal_encoder_t encoder) {
547547 // number of seconds since the last graph computation
548548 // keep the residency sets wired for that amount of time to avoid being collected by the OS
549549 int keep_alive_s;
550+ int loops_per_s;
551+ int time_per_loop_ms;
550552
551553 // background heartbeat thread to keep the residency sets alive
552554 atomic_bool d_stop;
@@ -573,10 +575,13 @@ ggml_metal_rsets_t ggml_metal_rsets_init(void) {
573575 res->keep_alive_s = 3 *60 ;
574576 }
575577
578+ res->time_per_loop_ms = 5 ;
579+ res->loops_per_s = 1000 /res->time_per_loop_ms ;
580+
576581 GGML_LOG_INFO (" %s : creating a residency set collection (keep_alive = %d s)\n " , __func__, res->keep_alive_s );
577582
578583 atomic_store_explicit (&res->d_stop , false , memory_order_relaxed);
579- atomic_store_explicit (&res->d_loop , 2 *res->keep_alive_s , memory_order_relaxed);
584+ atomic_store_explicit (&res->d_loop , res-> loops_per_s *res->keep_alive_s , memory_order_relaxed);
580585
581586 res->d_group = dispatch_group_create ();
582587
@@ -599,8 +604,7 @@ ggml_metal_rsets_t ggml_metal_rsets_init(void) {
599604 [res->lock unlock ];
600605 }
601606
602- // half a second
603- usleep (500 * 1000 );
607+ usleep (res->time_per_loop_ms * 1000 );
604608 }
605609 }
606610#endif
@@ -979,7 +983,7 @@ void ggml_metal_device_rsets_keep_alive(ggml_metal_device_t dev) {
979983 return ;
980984 }
981985
982- atomic_store_explicit (&dev->rsets ->d_loop , 2 *dev->rsets ->keep_alive_s , memory_order_relaxed);
986+ atomic_store_explicit (&dev->rsets ->d_loop , dev-> rsets -> loops_per_s *dev->rsets ->keep_alive_s , memory_order_relaxed);
983987}
984988
985989struct ggml_metal_event {
0 commit comments