1

次のようなアルゴリズムがあるとします。

array a = foo();
array b = bar(a);
array c = foobar(a, b);
array d = fbar(a, c);

CPU と CUDA ではこれで問題ありません。ここでは、GPU メモリのブロックへのポインターを返す関数を作成し、別の関数でその中間値を消費させることができます。

C++ AMP でこれを行うにはどうすればよいですか? concurrency::array オブジェクトを使用する必要があると思いますが、これを行うサンプル コードが見つかりません。

4

2 に答える 2

2

実際の C++ AMP の例を次に示します。

concurrency::array<int, 1> bar(const concurrency::array<int, 1>& input)
{
  parallel_for_each(b.extent, [&b, &r](concurrency::index<1> idx)
  {
    input[idx] = ...;
  });
  return input;
}

サイモンが指摘するように、 array<> は移動をサポートしているため、これは非常に効率的です。コードの柔軟性を高めるために、array<> ではなく array_view の使用を検討することをお勧めします。

暗黙のコピーを行うのではなく、bar の戻り値を移動することで、これをさらに整理できます。

于 2013-03-26T05:27:29.637 に答える
1

concurrency :: arrayクラスは、C++の他のテンプレートクラスとまったく同じです。ここには構文上の魔法はありません。だからあなたはこれを行うことができます:

using namespace concurrency;  // because I hate typing

array<int, 1> foo(int size)
{
    return array<int, 1>(size);
}

array<int, 1> bar(array<int, 1> input)
{
    // do something to input
    return input;
}

array<int> a = bar(foo(1024));

これにより、おそらくあなたが望むよりも深いコピーが生成されます。しかし、ポインタや参照を快適な方法で使用することで、それに対処できます。

しかし、これはいずれもAMPに固有のものではありません。これは、このコードでC++11を使用しているだけです。

于 2013-03-09T00:53:39.953 に答える