¿En qué condiciones se bloquea el código del sombreador metálico?

Estoy desarrollando una aplicación basada en Metal y, en algunos casos, el código de sombreador correctamente comstackdo y vinculado hará que la aplicación simplemente falle sin arrojar ningún error.

Un "crash" consiste en un alto en el performance visual (en algunos casos precedido por un breve tartamudeo de un par de cuadros alternativos), pero por lo demás una procesión normal del rest de la aplicación. Las utilidades de supervisión de performance de Xcode informan 60 fps, pero la latencia de la GPU 0ms, y la ejecución del lado de la CPU continúa, con las llamadas a la API de Metal todavía completando con éxito.

No se informa ningún error a la console.

Esto es extremadamente difícil de depurar, ya que no tengo ninguna indicación de dónde viene el error en el código de sombreado. Sería útil si supiera bajo qué condiciones se supone que esto suceda, para que pueda tener una buena list de cosas para verificar. De lo contrario, estoy disparando en la oscuridad cada vez que aparece.

La GPU puede fallar cuando lee o cancela el final de un MTLBuffer, cancela el final de una MTLTexture o simplemente se ejecuta demasiado time. Hay un timer de vigilancia que restablecerá la GPU si no completa su trabajo en less de unos segundos. El trabajo en la GPU no está progtwigdo de manera preventiva. Es posible que el funcionamiento prolongado haga que el dispositivo parezca estar bloqueado evitando que se ejecuten las tareas básicas de la GUI. Si tiene cargas de trabajo largas, es necesario dividirlas en muchos núcleos más pequeños. Para mantener la interfaz receptiva, debe mantener las cargas de trabajo <100 ms. Para evitar tartamudez de video, se recomienda una velocidad de cuadro constante.