CUDA优化问题

发布于 2024-09-30 19:07:20 字数 420 浏览 2 评论 0原文

这是一个简单的程序:

   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) 操作细分为线程,有或没有共享内存……从理论上讲,哪种方法应该是最快的?

Here's a simple program:

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

Presume n_v, n_w ~10^6. Clearly, there's at least a dozen equivalent ways to do this in CUDA, with different ways to subdivide (n_v*n_w) operations into threads, with and without shared memory... Which way should, theoretically speaking, be the fastest?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

简单爱 2024-10-07 19:07:20

最简单:

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

simplest:

   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
      }
   }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文