2012-12-10 61 views
1

说我有CPU侧的数据的源,看起来像这样:由行填充二维AMP阵列行

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,或将其复制到数组中。

这是有效的,但这是浪费,对于一些算法,连续一维向量可能不适合剩余的内存空间。

任何建议是值得欢迎的,因为我正在努力弄清AMP。

回答

2

是的,你可以复制它逐行。您的解决方案是几乎没有,刚刚从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>代表一排“我”,这被称为“投影”。详情请参阅a blog post that covers C++ AMP projections in details

+0

谢谢。除了性能受到影响之外,这种方法很有效,所以我最终坚持使用大型的中间存储器块。 –