Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 推力中的位移矢量_C++_Cuda_Gpgpu_Thrust - Fatal编程技术网

C++ 推力中的位移矢量

C++ 推力中的位移矢量,c++,cuda,gpgpu,thrust,C++,Cuda,Gpgpu,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]; } //

我正在看一个涉及在线(流)数据的项目。我想使用该数据的滑动窗口。例如,假设我想在向量中保留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;
int n=9;
推力:装置向量值;
val.resize(n+1,0);
//左移
对于(int i=0;i!=n-1;i++){
val[i]=val[i+1];
}
//将新值添加到最后一个位置
val[n]=新值;
有没有一种“快速”的方法来实现这一点?我正在看的这个项目将有大约500个向量,需要同时完成这个操作

谢谢

正如我所说,这是你所需要的。不需要在那里移动,只有一个计数器和一个固定大小的数组

让我们想想如何处理500个环形缓冲区

如果您希望有500个(512个)滑动窗口并在GPU上处理它们,那么您可以将它们打包到一个大的2D纹理中,其中每列都是同一时刻的样本数组

如果您一次为每个向量获取新样本(我的意思是在一个处理步骤中,每个512个缓冲区有一个新样本),那么这个“环形纹理”(像一个圆柱体)只需要更新一次(在每个步骤上载新样本数组),您只需要一个计数器。

正如我所说,这就是您所需要的。不需要在那里移动,只有一个计数器和一个固定大小的数组

让我们想想如何处理500个环形缓冲区

如果您希望有500个(512个)滑动窗口并在GPU上处理它们,那么您可以将它们打包到一个大的2D纹理中,其中每列都是同一时刻的样本数组


如果您一次为每个向量获取新样本(我的意思是在一个处理步骤中为每个512个缓冲区获取一个新样本),那么这个“环形纹理”(像一个圆柱体)只需要更新一次(在每个步骤上载新样本数组),您只需要一个计数器。

您想要的只是
推力::复制
。您不能并行执行就地移位,因为您不能保证在写入值之前读取该值

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;
int n=9;
推力:设备向量值(n);
推力:设备向量值输出(n+1);
推力:复制(val_in.begin()+1,val_in.end(),val_out.begin());
//将新值添加到最后一个位置
val_out[n]=新值;

你想要的只是
推力::复制
。您不能并行执行就地移位,因为您不能保证在写入值之前读取该值

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;
int n=9;
推力:设备向量值(n);
推力:设备向量值输出(n+1);
推力:复制(val_in.begin()+1,val_in.end(),val_out.begin());
//将新值添加到最后一个位置
val_out[n]=新值;

我强烈建议使用一个不同但仍然免费的库来解决这个问题。在4行代码中,您可以执行所有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不是开源的,但对于这类问题它仍然是免费的。

我强烈建议对此问题使用不同但仍然免费的库。在4行代码中,您可以执行所有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不是开源的,但对于此类问题它仍然是免费的。

正是您所需要的。不需要在那里移动,只有一个计数器和一个固定大小的数组。@Viktor。这正是我需要的!!完美的现在,最大的问题是,我是否可以用推力中的设备向量来实现这一点?我更喜欢将缓冲区/向量保留在GPU上。思想?这就是你需要的。不需要在那里移动,只有一个计数器和一个固定大小的数组。@Viktor。这正是我需要的!!完美的现在,最大的问题是,我是否可以用推力中的设备向量来实现这一点?我更喜欢将缓冲区/向量保留在GPU上。想法?OP希望得到帮助,使用推力来完成他的要求。虽然不是“嫁给”推力,但这是目前我知道的唯一为GPU编码的方法。我的意思是,“最好的复制方法”是尽可能避免复制。无论使用什么技术。一个计数器比移动整个阵列(在你的例子中是500个)要好。OP希望得到帮助,使用推力来完成他要求的任务。不是“嫁给”推力,但这是我目前知道的唯一为GPU编码的方法。我只是说“最好的复制方法”是尽可能避免复制。无论使用什么技术。一个计数器比需要移动整个阵列(在您的情况下是500)要好,感谢您提供的建议代码。但是,在每个时间步从val_in到val_out的复制似乎过多。如果要物理地移动数据,必须复制它(您的循环执行复制)!如果你想并行完成,它不能正确地在适当的位置完成,所以你需要两个缓冲区。如果你实际上不想移动,那么你可以按照Viktor的建议实现一个基于计数器的环形缓冲区,但是你必须在你的推力代码之外维护这个计数器。谢谢你的建议代码。但是,在每个时间步从val_in到val_out的复制似乎过多。如果要物理地移动数据,必须复制它(您的循环执行复制)!如果你想并行完成,它不能正确地在适当的位置完成,所以你需要两个缓冲区。如果你实际上不想进行物理转换,那么你可以按照Viktor的建议实现一个基于计数器的环形缓冲区,但你必须在你的推力代码之外维护这个计数器。嘿,如果你要否决,至少要说明你的理由。我说错什么了吗@诺亚已经说过他没有和史提克结婚。这是一个非常有趣的建议。我没有和史提克结婚ArrayFire图书馆看起来很有趣