One invocation, one pollen grain
A compute pipeline contains a kernel function and exposes limits such as maxTotalThreadsPerThreadgroup and threadExecutionWidth. The latter describes an execution grouping useful for choosing workloads; it is not a mandate to assume a hard-coded width for every future GPU. Select a legal group size and benchmark only after the kernel is correct. Rounded dispatch needs an index guard before memory access, and the host must ensure the count fits every bound buffer.
Use the supplied affine kernel to understand the dispatch, then replace the calculation with one deterministic pollen update. Start with a separate old/new position buffer so a later neighbor-dependent extension has a clear read/write contract. Keep the timestep finite and bounded, cap catch-up work, and compare a few selected particles against a CPU reference with a stated tolerance. No hardware ray-tracing capability is needed.
Connect the output to your renderer using the resource tracking and dependencies appropriate to its queue and storage model. If several frames overlap, account for their old readers before reusing a ping-pong buffer. Two allocations are a storage arrangement, not proof that an earlier frame has finished.
