1

オンライン (ストリーミング) データを含むプロジェクトを検討しています。そのデータのスライディング ウィンドウを操作したい。たとえば、ベクトルに 10 個の値を保持したいとします。値 11 が入ってきたら、値 1 を削除し、すべてをシフトしてから、値 10 があった場所に値 11 を配置します。

長い道のりは、次のようなものになります。

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 のベクトルがあります。

ありがとう!

4

3 に答える 3

3

私が言ったように、リングバッファはあなたが必要とするものです。そこにシフトする必要はありません。1つのカウンターと固定サイズの配列のみです。

500個のリングバッファをどのように処理できるかを考えてみましょう。

500個(512個)のスライディングウィンドウをGPUですべて処理する場合は、それらを1つの大きな2Dテクスチャにパックします。各列は、同じ瞬間のサンプルの配列です。

ベクトルごとに新しいサンプルを一度に取得する場合(つまり、1つの処理ステップで512個のバッファーごとに1つの新しいサンプルを取得する場合)、この「リングテクスチャ」(円柱など)を更新する必要があるのは1回だけです(アップロードする各ステップでの新しいサンプルの配列)、必要なカウンターは1つだけです。

于 2012-07-03T08:23:44.900 に答える
2

この問題には、別の、まだ無料のライブラリを使用することを強くお勧めします。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;

同じもののThrustコードに対してベンチマークを行ったところ、ArrayFireはThrustの約10倍の速度向上を実現しています。

欠点は、ArrayFireがオープンソースではないことですが、この種の問題に対してはまだ無料です。

于 2012-07-03T21:04:46.363 に答える
1

あなたがしたいことは単に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;
于 2012-07-03T12:28:12.273 に答える