2016-12-29 111 views
1

我知道这是一个简单的问题,但我一直未能找到答案。使用类型为'array'的类成员

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

我该怎么做?

我不能创建一个concurrency ::数组作为类成员,因为我需要知道数组在创建之前有多大。我不能有一个指向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; 
      } 
     ); 
    } 
}; 

回答

0

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

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

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

那么,这仍然是一个硬编码数组大小,因为模板参数必须是常量。 – Digiproc

0

OK,我想我想通了。必须将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++的缺点,你不能指指向的变量作为参考,而不上述函数调用的变通(我认为?)。 (也就是说,不要调用复制构造函数)。

编辑:

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