线程、同步和存储器
1、线程
之前的向量加法和乘法例子中,都是采用N个块,每个块1个线程,或者1个块,N个线程来进行GPU的并行计算。但现实中一般都是一次并行启动多个块,每个块里面多个线程(最多为maxThreadPerBlock)。如果maxThreadPerBlock=512,需要并行的任务为N,可以这样调用内核:
gpuAdd << <((N + 511) / 512), 512> >> (d_a, d_b, d_c);
当N很大时,而GPU每次启动的线程数有限,只能通过while循环批量启动线程
//定义向量长度 #define N 50000 //定义向量加法内核函数 __global__ void gpuAdd(int *d_a, int *d_b, int *d_c) { //Getting block index of current kernel int tid = threadIdx.x + blockIdx.x * blockDim.x; while (tid < N) { d_c[tid] = d_a[tid] + d_b[tid]; tid += blockDim.x * gridDim.x; } }
2、线程同步
之前的例子线程都是独立计算的,但实际上,很多任务需要线程之间相互交换数据才能完成,必须存在某种能让线程彼此交流的机制,这就涉及到共享内存