【问题标题】:Filling a 2D AMP array row by row逐行填充 2D AMP 数组
【发布时间】:2012-11-27 10:28:40
【问题描述】:

假设我有一个如下所示的 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。

【问题讨论】:

    标签: gpgpu c++-amp


    【解决方案1】:

    是的,您可以逐行复制。您的解决方案几乎就在那里,只需从具有 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&lt;int,2&gt; 会返回一个代表行“i”的array_view&lt;int,1&gt;,这称为“投影”。更多详情请查看a blog post that covers C++ AMP projections in details

    【讨论】:

    • 谢谢。这行得通,只是性能受到影响,所以我最终坚持使用大的中间内存块。
    猜你喜欢
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2019-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多