CUDA 类型定义 and 补充
1 Function Type Qualifiers 函数类型
1.1 __device__
__device__ 规定的函数,在device上执行。只能在device上调用。
1.2 __global__
__global__ 定义了一个kernel函数:在device上运行。只能在host上调用
1.3 __host__
__host__定义的函数:在host上运行,只能在host上调用。
没有定义__host__,__device__或者__global__的函数等同于__host__函数,系统都会把函数编译成host函数。
另外,__host__定义可以和__device__定义一起使用,编译器会把这个函数编译为host和device通用的函数。
1.4 Restrictions (强调,限制)
__device__函数通常是inline,所以如果需要不inline 就需要加上uninline
__device__和__global__函数都不支持递归调用。
__device__和__global__函数都不能定义static变量在函数内部。
__device__和__global__函数不能使用可变参数。
__device__函数没有函数地址,也没有指向它的函数指针,但是__global__函数有。
__global__定义和__host__定义不能一起使用。
__global__函数必须是void返回类型。
任何调用__global__的函数都必须指明运行配置。(Section 4.2.3)也就是线程kernel的调用方法。
__global__函数是异步调用的。在运行结束前就会返回。
__global__函数的参数通常是通过shared memory调用到Device中,最多是265bytes。
2. Variable Type Qualifiers
2.1 __device__
device上声明的变量,只能在在device上使用和调用.
2.2 __constant__
可以和__device__连用,处于constant memory space.可以被同一个grid的所有threads 从host runtime libary(e.g. cudaGetSymbolAddress(), cudaGetSymbolSize(), cudaMemcpyToSymbol() and cudaMemcpyFromSymbol)访问.
lifetime as application(grid bsw. kernel function)
2.3 __shared__
可以和__device__连用,处于shared memory space一个thread Block.只可以被同一个block的所有threads访问. lifetime same as block
2.4 Restrictions (强调,限制)