涉及相邻单元的推力矢量变换



我有一个向量,我想使用 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,并将 thrust::transform 应用到 v 并将结果保存到 w。 但是k是提前未知的,我不想创建w1,w2,...并浪费大量 GPU 内存空间。 最好是尽量减少数据复制量。 但我不确定如何使用一个向量来实现这一点,而这些值没有相互踩踏。 有没有 Thrust 提供的东西可以做到这一点?

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

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

我实际上不明白"k times",但以下代码可能会对您有所帮助。

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;

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

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

相关内容

  • 没有找到相关文章

最新更新