我有一个向量,我想使用 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;
我认为学习"函子"和几个推力的例子会给你一个很好的指导。
希望这能帮助您解决问题。 :)