2010-11-07 95 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