I would expect the following piece of code to either generate a compile-time type checking error or run correctly. Currently, it does neither and instead results in a segmentation fault. If the CUDA compiler is going to enforce the “host” and “device” type qualifiers I expect it to be able to reason about function pointers correctly as well. I should either be able to take a function pointer to a device function on the host side and be able to execute it on the device by passing it as an argument to a global function, or I shouldn’t even be able to reference device functions on the host side. Perhaps mandating type qualifiers on function pointers is an acceptable solution.
printf(“This is thread %d in block %d”, threadIdx.x, blockIdx.x);
void runKernel(void (*function)())
void (*func)() = printThread;