1

ベクトルがあり、CUDA と Thrust 変換を使用して次のことを実行したいと考えています。

// 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];

これを正しく実装するにはどうすればよいですか? 私ができる 1 つの方法は、ベクトル w を持ち、thrust::transform を v に適用し、結果を w に保存することです。しかし、k は前もって不明であり、w1、w2、... を作成して多くの GPU メモリ スペースを浪費したくありません。できれば、データのコピー量を最小限に抑えたいと考えています。しかし、値が互いに踏み込まずに1つのベクトルを使用してこれを実装する方法がわかりません。これを行うことができるスラストが提供するものはありますか?

4

2 に答える 2

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;      
}
于 2013-01-31T03:26:15.880 に答える
0

「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;

「ファンクター」について学び、スラストのいくつかの例が良いガイドになると思います。

これが問題の解決に役立つことを願っています。:)

于 2013-01-31T03:14:02.767 に答える