如何在CUDA内核中调用主机函数?

如何在CUDA内核中调用主机函数?,cuda,gpgpu,Cuda,Gpgpu,正如下面的错误所暗示的,在内核中不允许调用主机函数('rand'),如果我确实需要这样做,我想知道是否有解决方案 error: calling a host function("rand") from a __device__/__global__ function("xS_v1_cuda") is not allowed 不幸的是,您无法在设备中调用未使用\uu设备\uu修饰符指定的函数。如果您需要在设备代码中输入随机数,请查看cuda随机生成器curand 如果您想从内核调用自己的主机函数

正如下面的错误所暗示的,在内核中不允许调用主机函数('rand'),如果我确实需要这样做,我想知道是否有解决方案

error: calling a host function("rand") from a __device__/__global__ function("xS_v1_cuda") is not allowed

不幸的是,您无法在设备中调用未使用
\uu设备\uu
修饰符指定的函数。如果您需要在设备代码中输入随机数,请查看cuda随机生成器curand

如果您想从内核调用自己的主机函数,请在其上同时使用
\uuuuuuuuuuuuuuuuuuu主机
\uuuuuuuuu设备
修饰符:

__host__ __device__ int add( int a, int b )
{
    return a + b;
}

当此文件由NVCC编译器驱动程序编译时,将编译两个版本的函数:一个可由主机代码调用,另一个可由设备代码调用。这就是为什么现在可以通过主机和设备代码调用此函数。

虽然不适用于“rand()”,但在使用compute compatibility>=2.0编译时,可以使用一些主机函数,如“printf”

e、 g:


编译并使用sm_20,compute_20

简而言之,这里没有解决这个问题的方法

通常在CPU上运行的所有内容都必须针对CUDA环境进行定制,而不保证能够做到这一点。主机函数只是CUDA中普通C函数的另一个名称。也就是说,运行在CPU内存冯·诺依曼体系结构上的函数,就像所有C/C++一样,在PC机上已经达到了这一点。GPU为您提供了巨大的计算能力,但成本是它几乎没有那么灵活或兼容。最重要的是,这些函数运行时无法访问主内存,并且它们可以访问的内存是有限的

如果您想得到的是一个随机数生成器,那么考虑到Nvidia专门实现了一个高效的Mersenne捻线器,该捻线器每SMP最多可支持256个线程,您是幸运的。它可以在一个设备函数中调用,在我之前的文章中描述过。如果有人找到一个更好的链接来描述此功能,请删除我的链接,并将相应的文本与链接一起替换


我经常感到惊讶的一件事是,有多少程序员似乎不知道高质量伪随机数生成器是多么标准化。考虑到伪随机数在艺术上的重要性,“滚动你自己的”真的不是一个好主意。验证发电机是否提供可接受的不可预测的数字需要大量的工作和学术才能…

我不得不在以下方面不同意其他一些答案:

OP并没有描述问题:您不能从设备代码调用
\uuuuuu host\uuuuuu
函数并不不幸,这完全不可能是任何其他方式,这不是一件坏事


解释:将主机(CPU)代码想象成一张CD,放在CD播放器中;在设备上,比如说SD卡上的代码,你把它放进一个微型音乐播放器里。OP的问题是“我怎样才能将光盘塞进我的微型音乐播放器”?你做不到,想做也没有意义。它可能本质上是相同的音乐(具有相同功能的代码;尽管主机代码和设备代码通常不会执行完全相同的计算任务)-但介质不可互换。

调用主机函数而不是使用cuda内置函数的性能下降有多严重?这是否意味着主机和设备将只执行各自的函数副本?
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