代码之家  ›  专栏  ›  技术社区  ›  Eugene Smith

CUDA优化问题

  •  1
  • Eugene Smith  · 技术社区  · 15 年前

       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,n,w~10^6。显然,在CUDA中至少有十几种相同的方法可以做到这一点,有不同的方法可以将(n_v*n w)操作细分为线程,有或没有共享内存。。。从理论上讲,哪条路应该是最快的?

    1 回复  |  直到 15 年前
        1
  •  0
  •   Anycorn    15 年前

    最简单的:

       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
          }
       }