推力中的移位矢量
Shift vector in thrust
我正在查看一个涉及在线(流)数据的项目。 我想使用该数据的滑动窗口。 例如,假设我想在我的向量中保存 10 个值。 当值 11 进入时,我想删除值 1,将所有内容移过来,然后将值 11 放在值 10 的位置。
漫长的路要走如下:
int n = 9;
thrust::device_vector<float> val;
val.resize(n+1,0);
// Shift left
for(int i=0; i != n-1; i++){
val[i] = val[i+1];
}
// add the new value to the last position
val[n] = newValue;
有没有一种"快速"的方法可以用推力做到这一点? 我正在查看的项目将有大约 500 个向量需要同时完成此操作。
谢谢!
正如我所说,环形缓冲区是你需要的。无需移动到那里,只有一个计数器和一个固定大小的数组。
让我们考虑如何处理 500 个环形缓冲区。
如果你想有 500 个(让它成为 512)滑动窗口并在 GPU 上处理它们,那么你可以将它们打包成一个大的 2D 纹理,其中每列都是同一时刻的样本数组。
如果您一次为每个向量获取新样本(我的意思是在一个处理步骤中每个 512 个缓冲区都有一个新样本),那么这个"环形纹理"(如圆柱体)只需要更新一次(在每个步骤上传新样本数组),你只需要一个计数器。
我强烈建议使用不同的,但仍然免费的库来解决这个问题。 在 4 行 ArrayFire 代码中,您可以执行所有 500 个向量,如下所示:
array val = array(window_width, num_vectors);
val = shift(val, 0, 1);
array newValue = array(1,num_vectors);
val(span,end) = newValue;
我以推力代码为基准,ArrayFire比推力加速了大约10倍。
缺点是ArrayFire不是开源的,但它仍然是免费的。
你想要的
只是thrust::copy
.不能并行执行就地移位,因为无法保证在写入值之前读取值。
int n = 9;
thrust::device_vector<float> val_in(n);
thrust::device_vector<float> val_out(n+1);
thrust::copy(val_in.begin() + 1, val_in.end(), val_out.begin());
// add the new value to the last position
val_out[n] = newValue;
相关文章:
- 没有找到相关文章