2010-11-07 127 views
1

這裏有一個簡單的程序:CUDA優化問題

void multiply(const int* v_in, const int* w_in, int n_v, int n_w, int* w_out) 
    { 
     for(int i=0; i<n_w; i++) 
     { 
     int sum=0; 
     for(int j=0; j<n_v; j++) 
      sum += (w_in[i]*v_in[j])>>1; 
     w_out[i]=sum; 
     } 
    } 

設定n_v,n_w〜10^6。很顯然,在CUDA中至少有十幾種等同的方法可以實現,用不同的方式將(n_v * n_w)操作細分爲線程,有或沒有共享內存......從理論上講,哪種方法最快?

+0

你確定這個代碼是正確的?這不等於計算s = SUM(v_in);對於(i = 0到n_w){w_out [i] = s * w_in [i]; }'? – 2010-11-07 00:07:05

+0

這不是等同的,因爲有一個轉變......無論如何,問題是關於通過n_v x n_w元素對迭代的最佳方式,而不會因內核啓動開銷或全局內存訪問延遲而被咬傷。 – user434507 2010-11-07 00:23:42

回答

0

簡單:

void multiply(const int* v_in, const int* w_in, int n_v, int n_w, int* w_out) 
    { 
     int *v = shared; // dynamic 
     for(int i = block.rank; i < n_w; i += block.size) 
     { 
     int w = w_in[i]; // coalesced 
     int sum=0; 
     for(int j=0; j<n_v; j += block.size) { // assumption 
      v[block.rank] = v_in[j+block.rank]; 
      __synch(); 
      for(int k = 0; k < block.size; ++k) 
       sum += (w*v[k])>>1; // 
      __synch(); // ouch 
     } 
     w_out[i] = sum; // ditto 
     } 
    } 
+0

我不確定這是什麼語言,但這看起來不像有效的CUDA C,並且nvcc同意我的觀點。這是一種速記嗎? – user434507 2010-11-07 08:55:58

+0

@user yes,它的簡寫,__synch是__synchthreads,block是threadblock,shared是smared內存等 – Anycorn 2010-11-07 15:43:54