4.1 An Extension to the C Programming Language
CUDA 平台的编程接口主要是为了方便使用C语言在device(显卡)硬件平台上编写运行程序。
它的扩展包括:
1.对于C语言的很少的扩展,将在Section 4.2 详细描述,主要是为了方便编程人员把程序在Device上运行起来。
2.运行时的library包括一下几个部分:
1)(host)主体部分,运行在主机上,提供访问和控制多个计算平台(device)的功能。(在Section 4.5有详细描述)
2)运算平台(device)模块,运行在平台层,针对不同平台,提供不同的访问调用。(在Section 4.4有详细描述)
3)普通组件模块,提供主体和运算平台都支持的,内嵌的矢量类型和C语言的标准数据类型。(在Section 4.3有详细描述)
这里需要强调的是,只有普通组件模块支持的C语言标准函数,才能在平台上运行。
4.2 Language Extensions
对C语言进行了以下4个部分的扩展:
1.函数调用类型,规定函数是否在host 或者device上运行,是否能够被host或者device调用。(在Section 4.2.1有详细描述)
2.规定了变量的位置,规定了变量在device的内存位置。(Section 4.2.2)
3.一种新的调用方法,指明kernel是怎么通过host在device上调用的。(Section 4.2.3);
4.4种内嵌的类型(CUDA 特有的类型)grid(栅格),block demensions,block(块),thread indices(线程id一类的东东)
包含了这些扩展的源文件都必须通过CUDA的编译器nvcc来编译。(Section 4.2.5)。对于nvcc得详细的描述可以在别的文档中找到。
接下来的部分对每种扩展都进行了详细的说明。如果没有违法了详细说明中的规定,nvcc会提示错误或者警告,但是有些遗漏还是不能被检查到。
4.2.1 Function Type Qualifiers 函数类型
4.2.1.1 __device__
__device__ 规定的函数:
在device上执行。
只能在device上调用。
4.2.1.2 __global__
__global__ 定义了一个kernel函数:
在device上运行。
只能在host上调用
4.2.1.3 __host__
__host__定义的函数:
在host上运行,
只能在host上调用。
没有定义__host__,__device__或者__global__的函数等同于__host__函数,系统都会把函数编译成host函数。
另外,__host__定义可以和__device__定义一起使用,编译器会把这个函数编译为host和device通用的函数。
4.2.1.4 Restrictions (强调,限制)
__device__函数通常是inlined。
__device__和__global__函数都不支持递归调用。
__device__和__global__函数都不能定义static变量在函数内部。
__device__和__global__函数不能包含有可变参数。
__device__函数没有函数地址,也没有指向它的函数指针,但是__global__函数有。
__global__定义和__host__定义不能一起使用。
__global__函数必须是void返回类型。
任何调用__global__的函数都必须指明运行配置。(Section 4.2.3)
__global__函数是异步调用的。在运行结束前就会返回。
__global__函数的参数通常是采用共享内存,最多是265bytes。
4.2.2 Variable Type Qualifiers