2012-12-10 84 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

謝謝。除了性能受到影響之外,這種方法很有效,所以我最終堅持使用大型的中間存儲器塊。 –