假设我有一个CPU端数据源,如下所示:
vector< vector<int> > cpuBlobOData;
假设里面的每个行向量都有相同的大小(锯齿状的2d矢量没有锯齿状)。
我想将其复制到阵列内的单个GPU内存块。有没有办法一行一行地做到这一点?像这样:
array<int, 2> gpuArray(cpuBlobOData.size(), numColumns);
for(size_t i=0; i<cpuBlobOData.size(); ++i)
{
auto cpuRow = cpuBlobOData[i];
concurrency::copy(cpuRow.begin(), cpuRow.end(), &gpuArray[i]);
}
我知道这不会编译,它显示了我想要做的事情。有没有什么可以实现这一点?我能找到的唯一解决方案是将cpu向量复制到1D向量中,并将其映射到array_view,或将其复制到数组中。
这是有效的,但它是浪费的,并且对于某些算法,连续的1D向量可能不适合剩余的存储空间。
欢迎任何建议,因为我正在努力找出AMP。
答案 0 :(得分:2)
是的,您可以逐行复制。您的解决方案几乎就在那里,只需删除'&amp;'来自带有concurrency :: copy:
的行中的gpuArrayarray<int, 2> gpuArray(cpuBlobOData.size(), numColumns);
for(size_t i=0; i<cpuBlobOData.size(); ++i)
{
auto cpuRow = cpuBlobOData[i];
concurrency::copy(cpuRow.begin(), cpuRow.end(), gpuArray[i]);
}
使用下标运算符访问array<int,2>
会返回表示行'i'的array_view<int,1>
,这称为“投影”。有关详细信息,请查看a blog post that covers C++ AMP projections in details。