使用类型'数组'的类成员

时间:2016-12-29 18:19:18

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

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

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

我该怎么做?

我无法创建一个concurrency :: array作为类成员,因为我需要知道数组在创建之前有多大。我不能拥有一个指向并发::数组的成员(然后用' new' in,例如构造函数)来分配它,因为我无法形象如何将其指定为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;
            }
        );
    }
};

2 个答案:

答案 0 :(得分:0)

我想,你需要这里的模板:

template <std::size_t N> class MyClass {
    concurrency::array<int,N> myGpuArray;
    ...
}

int main () {
    MyClass<10> someName;
    ...
}

答案 1 :(得分:0)

好吧,我想我弄明白了。必须将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 ++缺点的工作,如果没有上面的函数调用解决方法,你不能将指向变量引用作为引用(我认为?)。 (也就是说,不要调用copy-constructor)。

编辑:

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