Multi-return, we're now able to properly return multiple collections and scalars, and we get products out in the host Rust like we really want. Updated backprop to use multi returns.
Notes
extern
function) with this wrapper handling the allocation of the output struct, passing it in to the device function, and then collecting the results into a Rust product like the multi-return Rust Async functions return.run
function lifetimes significantly, now generates a separate lifetime for the runner object itself, each return, and each parameter and uses lifetime bounds to ensure the runner and arguments are borrowed appropriately based on the lifetimes of the returned references. (Rust's syntax is actually really nice for code-generation, it accepts things like <'a:, 'b>
and <'a: 'b +, 'b>
).