假设我有一个这样的算法:
array a = foo();
array b = bar(a);
array c = foobar(a, b);
array d = fbar(a, c);
现在这在 CPU 和 CUDA 上都很好,我可以让函数返回指向 gpu 内存块的指针,然后让另一个函数消耗该中间值。
你如何在 C++ AMP 中做到这一点?我猜你必须使用 concurrency::array 对象,但我找不到任何这样做的示例代码。
假设我有一个这样的算法:
array a = foo();
array b = bar(a);
array c = foobar(a, b);
array d = fbar(a, c);
现在这在 CPU 和 CUDA 上都很好,我可以让函数返回指向 gpu 内存块的指针,然后让另一个函数消耗该中间值。
你如何在 C++ AMP 中做到这一点?我猜你必须使用 concurrency::array 对象,但我找不到任何这样做的示例代码。
这是一个实际的 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 的返回值来进一步整理它,而不是进行隐式复制。
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。