2016-11-11 37 views
5

據我所知,C++ 17將帶有Parallelism。但是,我不明白的是它是一種特定的硬件並行性(默認情況下是CPU)?或者它可以擴展到具有多個計算單元的任何硬件?C++ 17並行硬件實現

換句話說,我們會看到像「nVidia C++標準編譯器」這樣的東西,它將編譯要在GPU上執行的並行部分嗎?

它會是一些更標準化的替代OpenCL的例子嗎?

注意:當然,我是而不是問:「nVidia會這樣做嗎?」。我在問C++ 17標準是否允許,以及它是否在理論上可行。

回答

2

這個問題提供了一個提出這一改變的論文的鏈接,並且關於並行性方面,對提議的內容沒有實質性的改變。是的,編譯器可以做任何有意義的目標硬件來並行化各種算法的執行,只要它得到正確答案(有一些保留),並且它不會強加不必要的開銷(再次,有一些保留) 。

需要理解幾個要點。

首先,C++ 17的並行性是而不是一般的並行編程機制。它提供了許多STL算法的並行版本,僅此而已。所以它並不是OpenCL,TBB等更強大機制的替代品。

其次,當您嘗試並行化算法時存在固有的侷限性,這就是爲什麼我添加了這兩個加括號的限定條件的原因。例如,std::accumulate的並行版本將產生與非並行版本相同的結果,僅當應用於輸入範圍的函數是可交換和關聯的。這裏最明顯的問題是浮點值,其中數學運算不是關聯的,所以結果可能會有所不同。類似地,一些算法實際上在並行化時會帶來更多的開銷;你會得到一個淨加速,但是總的工作量會更多,所以這些算法的加速在處理單元的數量上不會是線性的。 std::partial_sum就是一個例子:每個輸出值都取決於前面的值,所以並行化算法並不簡單。有辦法做到這一點,但最終應用組合器功能的次數要多於非並行算法。總的來說,爲了反映這種現實,對算法的複雜性要求進行了放寬。

+0

感謝您花時間寫出詳細的答案。 「C++ 17並行性不是一般的並行編程機制」如果我理解正確,我們不會看到類似「std :: call_kernal <512,512>(kernal1);」 ? –

+1

@HumamHelfawi - 不,你不會看到。它隻影響一些(大部分)STL算法;如鏈接到的文章中所述,可以使用額外的參數調用它們,以請求算法並行執行。 –

+1

這就是爲什麼'std :: accumulate'沒有並行重載,而是我們得到'std :: reduce'。同樣,對於'partial_sum' =>'{inclusive,exclusive} _scan'。 –