Persistent threads are a way to implement dynamic parallelism, you just have a megakernel inside the persistent threads and it jumps entire work groups to the appropriate branch when sufficient work items are available. It can run any task in parallel dynamically with cooperative multithreading. Starvation comes from reserving so many threads outright and trying to do an end-run around the scheduler without knowing the exact internals, but the aim is dynamic parallelism. Just like on CPUs, cooperative multithreading under complete control of the code can have some performance advantages.The major sticking point behind nanite is that it needs some form of a forward progress model so that it can use persistent threads to do hierarchal culling. I don't see how dynamic parallelism will get us there since that's mostly a software feature and forward progress guarantees is mostly a hardware property of how GPUs scheduling works ...
PS. it's possible the possible starvation also comes from the way they do the queuing, there are some advantages to playing loose and fast (or at least 7 years ago to the best of their knowledge, I know dick about it). Regardless, the ultimate aim of persistent threads for Epic is clearly dynamic parallelism.
Last edited: