全局和设备function之间的区别
任何人都可以描述__global__和__device__之间的区别吗? 
 什么时候应该使用__device__ ,何时使用__global__ ?。 
 全局函数也被称为“内核”。 这是您可以使用CUDA内核调用语义( <<<...>>> )从主机端调用的函数。 
 设备function只能从其他设备或全局function中调用。  __device__函数不能从主机代码中调用。 
  __device__和__global__函数之间的差异是: 
  __device__函数只能从设备调用,并且只能在设备中执行。 
  __global__函数可以从主机调用,并在设备中执行。 
 因此,您可以从内核函数调用__device__函数,而不必设置内核设置。 你也可以“重载”一个函数,例如:你可以声明void foo(void)和__device__ foo (void) ,然后在主机上执行一个函数,只能从一个主机函数调用。 另一个在设备上执行,只能从设备或内核函数中调用。 
您也可以访问以下链接: http : //code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions ,这对我很有用。
我会用一个例子来解释一下:
 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 } 
即当我们想要主机(CPU)function来调用设备(GPU)function时,则使用“ 全局 ”。 请阅读: https : //code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions
而当我们想要一个设备(GPU)function(而不是内核)调用另一个内核函数时,我们使用' device '。 阅读“ https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions ”
这应该足以了解差异。
  __global__用于cuda内核,可直接从主机调用的函数。  __device__函数可以从__global__和__device__函数调用,但不能从主机调用。 
-   __global__– 在CPU上运行的GPU上运行。 执行<<<dim3>>>参数。
-   __device__– 在GPU上运行的GPU上运行。 也可以和变种一起使用。
-   __host__– 运行在CPU上,由CPU调用。
我暂时在这里logging了一些毫无根据的猜测(当我遇到一些权威的来源时,我会证实这些)。
- 
__device__函数可以具有除void以外的返回types,但__global__函数必须始终返回void。
- 
可以从运行在GPU上的其他内核中调用 __global__函数来启动额外的GPU线程(作为CUDAdynamic并行模型(又名CNP)的一部分),而__device__函数与调用内核在同一线程上运行。
  __global__函数是内核的定义。 无论何时从CPU调用,该内核在GPU上启动。 
 然而每个执行该内核的线程可能需要一次又一次地执行一些代码,例如交换两个整数。 因此,在这里我们可以编写一个帮助函数,就像我们在C程序中一样。 而对于在GPU上执行的线程,辅助函数应该声明为__device__ 。 
因此,从内核的线程调用一个设备函数 – 一个线程的一个实例。 而从CPU线程调用全局函数。
  __golbal__是一个CUDA C关键字(声明说明符),它表示函数, 
- 在设备上执行(GPU)
- 来自主机(CPU)代码的呼叫。
全局函数(内核)由主机代码使用<<< no_of_blocks,no_of threads_per_block >>>启动。 每个线程通过其唯一的线程ID来执行内核。
 但__device__函数不能从主机代码调用。如果你需要使用__host__ __device__ 
全局函数只能从主机调用,它们不具有返回types,而设备函数只能从其他设备函数的内核函数调用,因此不需要内核设置