Is a single OptixFunctionTable always sufficient?

I’m deciding how best to use optix_stubs.h (or something similar), and found droettger’s examples use an OptixFunctionTable per device (mentioned here ).
Why does that code have per-device tables while the SDK example doesn’t? Is it purely for convenience with the way that code is organized, or is there a requirement to have per-device API function pointers in some situation?

That’s just a personal preference. Don’t interpret too much into that. Use the method which works for you.

I hold an OptixFunctionTable per device mainly because that matched the separation of ray tracer and underlying device classes, more apparent in the multi-GPU capable examples. (Note that the per device resource handling is your responsibility! You need to make sure that the correct CUDA and OptiX contexts are used when calling the OptiX API functions.)
That method also shows more clearly, that the OptiX API calls come from a function table you need to load explicitly inside your application. Not raising the OptiX API functions into the global namespace via optix_stubs.h avoided the global OptixFunctionTable variable referenced inside that. That might be less error prone when using OptiX inside a dynamic library.
Not using every convenience helper function inside the OptiX headers in my examples also demonstrates different implementation approaches than already shown inside the intentionally small OptiX SDK examples.