Eug*_*ene 127
全局函数也称为"内核".这是您可以使用CUDA内核调用语义(<<<...>>>)从主机端调用的函数.
只能从其他设备或全局功能调用设备功能.__device__无法从主机代码调用函数.
Fac*_*res 37
__device__和__global__功能之间的差异是:
__device__ 只能从设备调用函数,它只在设备中执行.
__global__ 可以从主机调用函数,并在设备中执行.
因此,您__device__可以从内核函数调用函数,而不必设置内核设置.您也可以在"超负荷"的功能,例如:你可以声明void foo(void)和__device__ foo (void),再一个就是在主机上执行,并且只能从一个主机功能调用.另一个在设备上执行,只能从设备或内核函数调用.
您还可以访问以下链接:http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions,它对我很有用.
Gre*_*ile 27
__global__ - 在CPU上运行,从CPU调用.用<<<dim3>>>参数执行.__device__ - 在GPU上运行,从GPU调用.也可以用于变量.__host__ - 在CPU上运行,从CPU调用.san*_*age 15
我将用一个例子来解释它:
main()
{
// Your main function. Executed by CPU
}
__global__ void calledFromCpuForGPU(...)
{
//This function is called by CPU and suppose to be executed on GPU
}
__device__ void calledFromGPUforGPU(...)
{
// This function is called by GPU and suppose to be executed on GPU
}
Run Code Online (Sandbox Code Playgroud)
即,当我们希望主机(CPU)功能调用设备(GPU)功能时,则使用" 全局 ".阅读本文:" https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions "
当我们想要一个设备(GPU)功能(而不是内核)来调用另一个内核函数时,我们使用' device '.阅读此" https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions "
这应该足以理解差异.
我暂时在这里记录一些毫无根据的猜测(稍后当我遇到一些权威来源时,我会证实这些......)
__device__函数可以具有void之外的返回类型,但__global__函数必须始终返回void.
__global__可以从GPU上运行的其他内核中调用函数来启动其他GPU线程(作为CUDA动态并行模型(也称为CNP)的一部分),而__device__函数在与调用内核相同的线程上运行.
小智 7
__global__ 是一个CUDA C关键字(声明说明符),它表示该函数,
主机代码使用启动的全局函数(内核)<<< no_of_blocks , no_of threads_per_block>>>.每个线程通过其唯一的线程id执行内核.
但是,__device__无法从主机代码调用函数.如果需要,请同时使用它们__host__ __device__.
小智 6
__global__function是内核的定义.无论何时从CPU调用,该内核都在GPU上启动.
但是,执行该内核的每个线程可能需要一次又一次地执行某些代码,例如交换两个整数.因此,在这里我们可以编写一个辅助函数,就像我们在C程序中一样.对于在GPU上执行的线程,应该将辅助函数声明为__device__.
因此,从内核的线程调用设备函数 - 一个线程的一个实例.同时,从CPU线程调用全局函数.