【问题标题】:Thrust vector transformation involving neighbor elements涉及相邻元素的推力矢量变换
【发布时间】:2013-01-14 23:32:24
【问题描述】:

我有一个向量,我想使用 CUDA 和推力转换执行以下操作:

// thrust::device_vector v;
// for k times:
//     calculate constants a and b as functions of k;
//     for (i=0; i < v.size(); i++)
//         v[i] = a*v[i] + b*v[i+1];

我应该如何正确实现这一点?我可以做到的一种方法是使用向量 w,然后将推力::变换应用于 v 并将结果保存到 w。但是k提前是未知的,我不想创建w1,w2,...浪费大量的GPU内存空间。最好我想尽量减少数据复制的数量。但我不确定如何使用一个向量来实现这一点,而这些值不会相互影响。 Thrust 提供的东西可以做到这一点吗?

【问题讨论】:

    标签: cuda thrust cublas bspline


    【解决方案1】:

    如果 v.size() 足够大以充分利用 GPU,您可以启动 k 内核来执行此操作,使用额外的缓冲区内存且无需额外的数据传输。

    thrust::device_vector u(v.size());
    for(k=0;;)
    {
        // calculate a & b
        thrust::transform(v.begin(), v.end()-1, v.begin()+1, u.begin(), a*_1 + b*_2);
        k++;
        if(k>=K)
            break;
    
        // calculate a & b
        thrust::transform(u.begin(), u.end()-1, u.begin()+1, v.begin(), a*_1 + b*_2);
        k++;
        if(k>=K)
            break;      
    }
    

    【讨论】:

      【解决方案2】:

      “k次”其实我不是很懂,但是下面的代码可能对你有帮助。

      struct OP {
          const int a, b;
          OP(const int p, const int q): a(p), b(q){};
          int operator()(const int v1, const int v2) {
            return a*v1+b*v2;
          }
      }
      thrust::device_vector<int> w(v.size());
      thrust::transform(v.begin(), v.end()-1, //input_1
                        v.begin()+1,          //input_2
                        w.begin(),            //output
                        OP(a, b));            //functor
      v = w;
      

      我认为学习“函子”,几个推力的例子会给你一个很好的指导。

      希望这将帮助您解决问题。 :)

      【讨论】:

        猜你喜欢
        • 2013-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多