1.内核
CUDA通过允许程序员定义称为内核的C函数扩展了C,内核调用时会被N个CUDA线程执行N次(译者注:这句话要好好理解,其实每个线程只执
行了一次),这和普通的C函数只执行一次不同。
内核使用 global 声明符定义,使用一种新<<< … >>>执行配置语法指定执行某一指定内核的线程数(参看下面代码)。每个执行内核的线程拥有一个独一无二的线程ID,可以通过内置的threadIdx变量在内核中访问(译者注:这只说明在块内是唯一的,并不一定是全局唯一的)。
下面的样本代码将两个长度为N的向量A和B相加,并将结果存入向
量C中。
//代码1:一维线程网格,一维线程块示例
// Kernel definition
__global__ void VecAdd(float* A, float* B, float* C)
{
int i = threadIdx.x;
C[i] = A[i] + B[i];
}
int main()
{
...
// Kernel invocation with N threads
VecAdd<<<1, N>>>(A, B, C);
...
}
这里,VecAdd<<<1, N>>>(A, B, C);语法调用了1个线程块,其中包含N个线程. N个线程中的每一个执行VecAdd()的一次成对加法(译者注:由于只使用了一个块,因此线程ID是唯一的)。
第4行threadIdx是一个CUDA内置变量,类型为uint3,用于块内的线程索引(也可通过字面意思理解,thread Index).这里提到的uint3是cuda的一个内置变量类型,继承自基本整形和浮点型,为结构体,包含3个成员x,y和z.还有其他的变量类型如uint1,uint2,uint4,顾名思义分别包含1,2,4个成员,uint4包含4个成员x,y,z,w,以此类推.这里u表示无符号数,与之对应有int1,int2,int3,int4变量类型,是有符号数.
这些结构体均附带形式为make<