推力中的移位矢量

Shift vector in thrust

本文关键字:      更新时间:2023-10-16

我正在查看一个涉及在线(流)数据的项目。 我想使用该数据的滑动窗口。 例如,假设我想在我的向量中保存 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;
相关文章:
  • 没有找到相关文章