1

假设我有一个如下所示的 CPU 端数据源:

vector< vector<int> > cpuBlobOData;

假设里面的每个行向量都具有相同的大小(一个锯齿状的二维向量,不是锯齿状的)。

我想将其复制到数组内的单个 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 向量复制到一维向量中,并将其映射到 array_view,或者将其复制到数组中。

这行得通,但很浪费,而且对于某些算法,连续的一维向量可能不适合剩余的内存空间。

欢迎任何建议,因为我正在努力找出 AMP。

4

1 回答 1

2

是的,您可以逐行复制它。您的解决方案几乎就在那里,只需从带有 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>使用下标运算符访问的返回一个array_view<int,1>表示行“i”的,这称为“投影”。有关更多详细信息,请查看详细介绍 C++ AMP 预测的博客文章

于 2012-12-10T03:24:37.360 回答