【问题标题】:C++ AMP How to return values in GPU memory?C++ AMP 如何在 GPU 内存中返回值?
【发布时间】: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 对象,但我找不到任何这样做的示例代码。

【问题讨论】:

    标签: c++-amp


    【解决方案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 类型定义了移动构造函数,因此不会发生额外的副本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多