要传递设备函数指针,我们必须
typedef int (*fp_t)(int);
__device__ int dev_fn(int)
{
// do something
}
__device__ fp_t dev_fp = dev_fn; // [1]
void host_fn()
{
fp_t fp;
cudaMemcpyFromSymbol(&fp, (void const*)&dev_fp, sizeof(fp));
// now you can pass fp to cuda functions
}
这是非常令人费解的,因为我们必须获取dev_fn
的地址并将其存储到上面[1]中的另一个符号。
为什么设备功能不会使自己成为符号,以便我们可以在主机端使用cudaGetSymbolAddress
直接获取dev_fn
的地址,而不是通过中间符号dev_fp
?< / p>
答案 0 :(得分:0)
无论出于何种原因,CUDA做出了允许CPU线程获取__device__
变量地址的设计选择,可能是因为必须有一种方法可以将数据复制进出。尝试将数据复制到__device__
函数的地址是没有意义的。
可能会设计类似的东西来获取__device__
函数的地址,但是不太可能使解决方案能够与__host__ __device__
函数一起使用。没有一个地址对__host__ __device__
函数有意义。