2012-06-01 105 views
2

我正在轉換算法以利用C++ AMP提供的大量加速。我所在的階段是將for循環放入已知的parallel_for_each循環中。C++ AMP,用於循環到parallel_for_each循環

通常這應該是一個簡單的任務,但它似乎更復雜,然後我第一次想到。這是一個嵌套的循環,我增加量迭代使用步驟4:

for(int j = 0; j < height; j += 4, data += width * 4 * 4) 
{ 
    for(int i = 0; i < width; i += 4) 
    { 

我有麻煩的是使用索引的。我似乎無法找到一種方法將其正確地適用於parallel_for_each循環。使用等級2的索引是要走的路,但通過分支來操縱它將會損害性能增益。

我發現了一個類似的帖子:Controlling the index variables in C++ AMP。它也處理索引操作,但增量方面不包括我的問題。

隨着親切的問候,

Forcecast

+1

也許你可以使用[磚](http://msdn.microsoft.com/en-us/library/hh873135%28v=vs.110 %29.aspx)將數據分區爲4x4的磁貼。 –

+0

瓷磚+1。 AMP的parallel_for_each實際上只是它:它遍歷範圍中的每個元素。沒有跳躍,沒有跳躍。每當你需要更多的時候,你可能會想要使用'tiled_extent'。 – ComicSansMS

+0

謝謝你的回覆。當我仔細觀察它時,確實可以使用這種情況下的瓷磚。我只是想確保我沒有放棄任何我可能錯過的其他原因。感謝您的提醒。 – Forcecast

回答

0

你應該想到的瓷磚作爲整個GPU不作爲索引機制劃分工作機制。如果您發現將自己限制爲4x4磁貼,很可能會導致您陷入性能瓶頸。

你就不能做到以下幾點:

auto compute_domain = concurrency::extent<2>(height/4, width/4); 

parallel_for_each(accl_view, compute_domain, [=](index<2> idx) restrict(amp) 
{ 
    int j = idx[0] * 4; 
    int i = idx[1] * 4; 

    // Your algorithm here... 
}