如下错误所示,在内核中调用主机函数('rand')是不允许的,我想知道如果我确实需要这样做是否有解决方案。
error: calling a host function("rand") from a __device__/__global__ function("xS_v1_cuda") is not allowed
很遗憾,在设备上您不能调用未使用__device__
修饰符指定的函数。如果您需要在设备代码中使用随机数,请查看CUDA随机生成器curandhttp://developer.nvidia.com/curand
如果您有自己的主机函数要从内核调用,请在其上同时使用__host__
和__device__
修饰符:
__host__ __device__ int add( int a, int b )
{
return a + b;
}
当这个文件被NVCC编译器驱动程序编译时,函数将被编译成两个版本:一个可由主机代码调用,另一个可由设备代码调用。这就是为什么这个函数现在可以被主机和设备代码同时调用的原因。
虽然不适用于 'rand()',但是在使用计算兼容性>=2.0编译时,一些主机函数如"printf"是可用的。
例如:
nvcc.exe -gencode=arch=compute_10,code=\sm_10,compute_10\...
error : calling a host function("printf") from a __device__/__global__ function("myKernel") is not allowed
可以编译并使用sm_20和compute_20。
我必须在以下方面不同意其他答案:
OP没有描述问题:从设备代码中无法调用__host__
函数并不令人遗憾 - 它完全不可能是任何其他方式,这并不是一件坏事。
解释一下:将主机(CPU)代码视为放入CD播放器的CD;将设备代码视为放入微型音乐播放器的SD卡。 OP的问题是“如何将光盘塞入我的微型音乐播放器”?你不能这样做,而且想要这样做毫无意义。它可能本质上是相同的音乐(具有相同功能的代码;尽管通常,主机代码和设备代码不执行完全相同的计算任务)- 但媒体不可互换。