【问题标题】: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;
我认为学习“函子”,几个推力的例子会给你一个很好的指导。
希望这将帮助您解决问题。 :)