【问题标题】:Using a class member of type 'array'使用“数组”类型的类成员
【发布时间】:2016-12-29 18:19:18
【问题描述】:

我知道这是一个简单的问题,但我一直无法找到答案。

我想要一个管理大块内存的 C++ 类,当调用某个类方法时,GPU 会定期处理内存。类构造函数传递数组的大小,构造后数组大小永远不会改变。执行 parallel_for_each 的方法不应在不需要时浪费处理器周期或内存。

我该怎么做?

我无法将 concurrency::array 创建为类成员,因为我需要在创建数组之前知道数组的大小。我不能有一个指向 concurrency::array 的成员(然后在例如构造函数中使用'new'分配它),因为我不知道如何将它指定给parallel_for_each。

附带说明,我通常不需要在 GPU 和主机之间复制数组,但如果出于某种原因我必须这样做,只要不定期进行,也可以。否则会根据数组的大小浪费处理器周期和内存。

这是我想要的示例。当然,parallel_for_each 捕获的引用/指针是错误的。 (不检查语法):

class MyClass
{
    int* myHostArrayPtr;
    concurrency::array<int,1>* myGpuArrayPtr;

    MyClass(int size)
    {
        myHostArrayPtr = new int(size);

        memset(myHostArrayPtr,0,size * sizeof(int));

        myGpuArrayPtr = new concurrency::array<int,1>(size,myHostArrayPtr);
    }

    void ProcessInGpu()
    {
        parallel_for_each(
            myGpuArrayPtr->extent,
            [&myGpuArrayPtr](index<1> i) restrict(amp)
            {
                myGpuArray[i]+=14;
            }
        );
    }
};

【问题讨论】:

    标签: c++ c++11 c++-amp


    【解决方案1】:

    我认为,您需要这里的模板:

    template <std::size_t N> class MyClass {
        concurrency::array<int,N> myGpuArray;
        ...
    }
    
    int main () {
        MyClass<10> someName;
        ...
    }
    

    【讨论】:

    • 嗯,这仍然是一个硬编码的数组大小,因为模板参数必须是常量。
    【解决方案2】:

    好吧,我想我明白了。必须将parallel_for_each 放在一个函数中,该函数采用对数组对象的引用,然后它们可以通过引用传递给parallel_for_each。也就是说:

    void MyClass::Process(concurrency::array<int,1>& myGpuArray){
        parallel_for_each(
            myGpuArray.extent,
            [&myGpuArray](index<1> i) restrict(amp)
            {
                myGpuArray[i]+=14;
            }
       );
    }
    

    这很有趣,因为它确实解决了 C++ 的一个缺点,即如果没有上述函数调用解决方法(我认为?),您不能将指向变量作为引用引用。 (即,不调用复制构造函数)。

    编辑:

    是的,以上工作。我对它进行了基准测试,它与使用本地数组的代码一样快。此外,我通过将指针转换为调用中的引用来测试它,这也有效。所以它适用于动态分配的数组。

    【讨论】:

      猜你喜欢
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多