天天看點

cuda by example

int offset= x+y*dim      

x 線程塊内的線程索引

y 線程塊索引

dim 線程塊的次元

tid = threadIdx.x+blockIdx.x*blockDim.x
      

  

計算大于或等于128的最小倍數(127+x)/128

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();
}
      

這會造成 線程發散:

    當某些線程需要執行一條指令,而其他線程不需要執行時,這種情況成為線程發散。

__synthreads會當所有的線程都執行後才釋放,而有些線程如果不執行,那麼kernel函數會無止境的等待。

作者:xingoo

上一篇: cuda安裝
下一篇: cuda shader

繼續閱讀