我知道这是一个简单的问题,但我找不到答案。
我想要一个管理大块内存的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;
}
);
}
};
答案 0 :(得分:0)
我想,你需要这里的模板:
template <std::size_t N> class MyClass {
concurrency::array<int,N> myGpuArray;
...
}
int main () {
MyClass<10> someName;
...
}
答案 1 :(得分:0)
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)。
编辑:
是的,以上的作品。我对它进行了基准测试,其速度与使用本地数组的代码一样快。此外,我通过将指针转换为调用中的引用来测试它,这也是有效的。所以它适用于动态分配的数组。