1

我有一个向量,我想使用 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 提供的东西可以做到这一点吗?

4

2 回答 2

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;      
}
于 2013-01-31T03:26:15.880 回答
0

我实际上并不了解“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-31T03:14:02.767 回答