int offset= x+y*dim
tid = threadIdx.x+blockIdx.x*blockDim.x
kernel<<<(x+127)/128,128>>>(a,b,c)
int i= blockDim.x/2; while(i != 0){ if(cacheIndex < i) cache[cacheIndex] += cache[cacheIndex + i]; __synthreads(); i /= 2; }
const int N = 33*1024 const int threadsperblock = 256; const int blockpergrid = imin(32,(N+threadperblock-1)/threadsperblock); kernel<<<blockpergrid,threadsperblock>>>(a,b,c); __global__ static void kenel(int *a,int *b,int *c){ ... int tid = threadIdx.x+blockIdx.x*blockDim.x; ... while(tid<N){ ... tid += blockDim.x*gridDim.x; ... } }
if(threadIdx.x % 2){ ... __synthreads(); }