逐行填充2D AMP阵列

时间:2012-12-10 01:08:36

标签: gpgpu c++-amp

假设我有一个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。

1 个答案:

答案 0 :(得分:2)

是的,您可以逐行复制。您的解决方案几乎就在那里,只需删除'&amp;'来自带有concurrency :: copy:

的行中的gpuArray
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]);
}

使用下标运算符访问array<int,2>会返回表示行'i'的array_view<int,1>,这称为“投影”。有关详细信息,请查看a blog post that covers C++ AMP projections in details