C++ AMP 如何在 GPU 内存中返回值?
Posted
技术标签:
【中文标题】C++ AMP 如何在 GPU 内存中返回值?【英文标题】:C++ AMP How to return values in GPU memory? 【发布时间】:2013-02-28 18:59:43 【问题描述】:假设我有一个这样的算法:
array a = foo();
array b = bar(a);
array c = foobar(a, b);
array d = fbar(a, c);
现在这在 CPU 和 CUDA 上都很好,我可以让函数返回指向 gpu 内存块的指针,然后让另一个函数消耗该中间值。
您如何在 C++ AMP 中做到这一点?我猜你必须使用 concurrency::array 对象,但我找不到任何这样做的示例代码。
【问题讨论】:
【参考方案1】:这是一个实际的 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 的返回值来进一步整理它,而不是进行隐式复制。
【讨论】:
+1 为什么要移动bar的返回?根据标准,在这种情况下必须调用 RVO,所以给定的示例对吗? 我更新了代码以匹配 bar() 的原始语义。但是,如果您要传入和传出输入,最好使用 void 函数并从输入参数中删除 const。【参考方案2】: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。
【讨论】:
请注意 concurrency:array 类型定义了移动构造函数,因此不会发生额外的副本。以上是关于C++ AMP 如何在 GPU 内存中返回值?的主要内容,如果未能解决你的问题,请参考以下文章
C++中,如何判断Server端返回的response的值是不是为空,如有2个response,那么如何判断response[0]的值