我有一个向量,我想使用CUDA和Thrust转换执行以下操作:
// 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提供的东西能做到吗?
答案 0 :(得分: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;
}
答案 1 :(得分: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;
我认为学习“functor”,以及几个推力的例子会给你一个很好的指导。
希望这可以帮助您解决问题。 :)