为什么CPU线程不能获取CUDA __device__函数的地址?

时间:2014-12-05 02:59:26

标签: cuda

要传递设备函数指针,我们必须

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>

1 个答案:

答案 0 :(得分:0)

无论出于何种原因,CUDA做出了允许CPU线程获取__device__变量地址的设计选择,可能是因为必须有一种方法可以将数据复制进出。尝试将数据复制到__device__函数的地址是没有意义的。

可能会设计类似的东西来获取__device__函数的地址,但是不太可能使解决方案能够与__host__ __device__函数一起使用。没有一个地址对__host__ __device__函数有意义。