#define IMUL(X,Y) __mul24(X,Y) #define IMAD(X,Y,Z) __mul24(X,Y)+Z extern "C" __global__ void add_kernel(float* o,float* i0,float* i1) { unsigned int gtidx=IMAD(blockIdx.x,blockDim.x,threadIdx.x); unsigned int gtidy=IMAD(blockIdx.y,blockDim.y,threadIdx.y); unsigned int otid =IMAD(IMUL(gridDim.x,blockDim.x),gtidy,gtidx); o[otid]=i0[otid]+i1[otid]; }
而在应用程序中如何设置:
cuFuncSetBlockShape(func,16,16,1); ... cuLaunch(func); or add_kernel < < <dim3(1,1,1),dim3(16,16,1)>>>(o,i0,i1);
注意(重点):另外,如果thread的总数量不超过768(当然,对于cuda CC <=1.1,至少目为至,因为将来的cuda CC1.2或2.0情况也可能不变),则各个MSP可以同时处理8个block,也即对于被分配的block group的同一个MSP,如果希望8个SP同时处理8个block,则每个block的thread数量不应大于96.而是否这样处理取决于你在程序中的设置.为了简单起见我们假设当前thread总数即为768,那么如下的代码将决定MSP[0]的8个SP各处理一个block,切至少理论上8个SP应该是并行执行的(以上面的kernel为例):
...
cuFuncSetBlockShape(func,4,24,1);//It have 96 threads per block