2013-11-09 111 views
0

假設我有一個Concurrency::array,其大小我只知道在運行時,這個大小可以是零:如果我需要零大小的陣列,我該怎麼辦?

using namespace Conurrency; 
array<int> myArray (datasource); // can't do this if datasource is zero-sized! 
parallel_for_each(someExtent,[&](index<1> idx) restrict(amp) 
{ 
    // if the size of myArray is 0, I won't use it! 
} 

在主機上這個問題是微不足道的;你只需聲明一個零大小的向量,任何基於範圍的循環都會簡單地忽略它。在C++ AMP中,你必須爲每個數組設計一個單獨的內核函數,這個函數可能是空值......當然,還有更好的方法,爲什麼我們不能只有零大小的數組呢?

程序員如何避免這類問題?

我目前避免它通過執行以下,其中我不要驕傲,

using namespace Conurrency; 
if (datasource.size() == 0) datasource.push_back(0); // assuming datasource is a vector 
array<int> myArray (datasource); // can't do this if datasource is zero-sized! 
parallel_for_each(someExtent,[&](index<1> idx) restrict(amp) 
{ 
    // if the size of myArray is 0, I won't use it! 
} 

回答

1

簡短的回答是,你不能有一個零大小的數組。你的任何級別的長度都不爲零。無論更好還是更糟,這只是它的方式。 C++ AMP假定傳遞給它的任何工作都是真實的工作。記住在CPU上,零長度循環或零長度數組沒有開銷。在GPU上可能並非如此,在加速器上聲明陣列並通過DMA緩衝區將內核傳遞給GPU仍然存在潛在的開銷。 DirectX 11中也可能存在潛在的限制(我沒有時間看)。

在這種情況下(除非我誤解了問題)正在完成工作,但某些輸入數據(myArray)可能長度爲零,但someExtent非零。

如果實際someExtent也爲零,那麼最簡單的解決方案就是將條件語句中調用parallel_for_each的代碼包裝起來,該條件語句完全跳過零值。

如果someExtent總是非零,但你需要傳遞一個零長度myArray然後我建議加一個長度爲myArray,並簡單地說明你的計算。

在這兩種情況下,我認爲這適用於零長度陣列問題。如果沒有,請提供更多細節。

+0

是的,這就是我正在做的事情,並不爲此感到自豪,但如果這是需要做的事情,我會做;我真的不喜歡討論人爲的語言限制... – arman

相關問題