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++ 编译器警告?

c++中函数的内存注意项

如何在 C++ 中急切提交分配的内存?

C++中,如何判断Server端返回的response的值是不是为空,如有2个response,那么如何判断response[0]的值

C++ 引用与返回值

c++中函数中变量内存分配以及返回指针引用类型的思考