¿Cuántos subgrupos?

Dentro de iOS Metal, la documentation dice que un único subgrupo solo puede asociarse con una sola unidad de cálculo . Entonces, ¿tengo curiosidad si la elección de una serie de subgrupos debería depender del número de unidades de cálculo disponibles? ¿Hay una sanción por tener más subgrupos que unidades de cálculo? Si es importante hacer coincidir el número de unidades de cálculo con grupos de subprocesss, ¿cómo se puede determinar en un dispositivo determinado el número de unidades de cálculo disponibles?

Aquí está mi comprensión actual de cómo funciona esto. En su mayoría se me ocurrió este model mental basado en la documentation de Metal combinada con este increíble video de NVIDIA .

  • Necesitará una cantidad mínima de grupos de subprocesss (" bloques de subprocesss " de NVIDIA) en su networking para realizar su trabajo. Sí, tomará más time si tiene más subgrupos que pueden ejecutarse simultáneamente, pero eso no equivale a una "penalización" para usar más subgrupos. Simplemente significa que su problema requiere mucho procesamiento.
  • La cantidad de grupos de subprocesss que puede manejar una unidad de cómputo de manera simultánea varía en function de la memory necesaria y disponible. No puede asumir cuántos de sus grupos de subprocesss podrían estar ejecutándose simultáneamente.

La única regla clara que tengo actualmente para diseñar las funciones del kernel es que los grupos de hilos representan múltiplos del ancho de ejecución del hilo (" granularidad de warp " de NVIDIA).

Todavía no tengo reglas claras para usar threadgroup vs. memory de dispositivo, debido a la utilización probabilística de la unidad de cálculo, que no sea usar grupos de subprocesss de una manera que sea más fácil de pensar y codificar, primero.