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

正如 Simon 指出的那样,array<> 支持移动,所以这应该非常有效。您可能需要考虑使用 array_view 来获得更好的代码灵活性,而不是使用 array<>。

您可以通过移动 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 回答