Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization CUDA优化问题_Optimization_Cuda - Fatal编程技术网

Optimization CUDA优化问题

Optimization CUDA优化问题,optimization,cuda,Optimization,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;

下面是一个简单的程序:

   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;
      }
   }
void乘法(常量int*v_in,常量int*w_in,int n_v,int n_w,int*w_out)
{
对于(int i=0;i1;
w_out[i]=总和;
}
}
假设n_v,n_w~10^6。显然,在CUDA中至少有十几种相同的方法可以做到这一点,有不同的方法可以将(n_v*n_w)操作细分为线程,有共享内存和没有共享内存……从理论上讲,哪种方法应该是最快的?

最简单:

   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
      }
   }
void乘法(常量int*v_in,常量int*w_in,int n_v,int n_w,int*w_out)
{
int*v=shared;//动态
for(int i=block.rank;i1;//
__synch();//哎哟
}
w_out[i]=sum;//同上
}
}

你确定这个代码是正确的吗?这在本质上不等于计算
s=SUM(v_in);for(i=0到n_w){w_out[i]=s*w_in[i]}
?这是不等价的,因为有一个转变……不管怎样,问题是关于在不受内核启动开销或全局内存访问延迟影响的情况下迭代n\v x n\u w元素对的最佳方式。我不确定这是什么语言,但这看起来不像有效的CUDA C,nvcc同意我的观点。这是某种类型的吗速记?@user是的,它是速记,_synch是_synchththreads,block是threadblock,shared是smared内存,等等