设置并行块
add<<<N,1>>>( dev_a, dev_b, dev_c );
//N blocks x 1 thread/block = N parallel threads
这句话里面的1,就是the number of threads per block we want the CUDA runtime to create on our behalf,每个块的线程个数。
设置并行线程
add<<<1,N>>>( dev _ a, dev _ b, dev _ c );
我们把1和N反过来,就是一个N线程的单块程序。当我们获取索引的时候需要换一个表达来获取线程的索引:
混合设置
int tid = threadIdx.x + blockIdx.x * blockDim.x;
add<<< (N+127)/128, 128 >>>( dev _ a, dev _ b, dev _ c );
我们可以把thread per block给顾定成128,然后根据N来分配需要多少个block。(N+127)/128实际上就是求ceil的过程。
if (tid < N)
c[tid] = a[tid] + b[tid];
因此,前面的历史遗留问题:判断小于N就被用作判断最后的block的这个thread是不是超过了我们问题所需要求解的范围N。
长向量相加
__global__ void add( int *a, int *b, int *c ) {
int tid = threadIdx.x + blockIdx.x * blockDim.x;
while (tid < N) {
c[tid] = a[tid] + b[tid