2011-09-22 62 views
3

背景:有關C++ AMP的概述,請參閱Daniel Moth的recent BUILD talk何時調用C++ AMP中不需要的「同步()」?

通過初步演練here,here,herehere

只有在最後的參考文獻中,他們纔會打電話給array_view.synchronize()

在這些簡單的例子中,是不是需要撥打synchronize()?什麼時候排除是安全的?我們可以相信parallel_for_each在沒有它的情況下表現「同步」(w/r/t前面的代碼)嗎?

+0

通過什麼我需要嘗試C++ AMP的方式;我正在使用VS 2010? –

+0

我選擇使用VS 2011 –

+0

現在我得到「runtime_exception:無法創建緩衝區」。堆棧跟蹤顯示「vcamp110d.dll!Concurrency :: details :: _ Buffer :: _ Create_buffer(...」 –

回答

10

使用同步()當您要訪問的數據通過的array_view接口去。如果您對數據的所有訪問都使用array_view運算符和函數,則不需要使用synchronize()。正如Daniel提到的那樣,array_view的析構函數也會強制進行同步,在這種情況下最好調用synchronize(),以便可以獲取可能拋出的任何異常。

的同步功能力量更新到主叫範圍內的緩衝 - 也就是說,如果你寫在GPU上的數據,然後調用CPU代碼同步,在這一點上更新的值複製到CPU內存。

這看起來很明顯,但我提到它,因爲其他array_view操作也會導致「同步」。 C++ AMP array_view盡力在CPU和GPU內存之間進行拷貝 - 任何通過數組視圖接口讀取數據的操作都會導致拷貝。

std::vector<int> v(10); 
array_view<int, 1> av(10, v); 
parallel_for_each(av.grid, [=](index<1> i) restrict(direct3d) { 
    av[i] = 7; 
} 
// at this point, data isn't copied back 
std::wcout << v[0]; // should print 0 

// using the array_view to access data will force a copy 
std::wcout << av[0]; // should print 7 

// at this point data is copied back 
std::wcout << v[0]; // should print 7 
+0

謝謝!這就說得通了。接下來的問題是關於併發性 - 如果兩個「parallel_for_each」操作在代碼中按順序分派,那麼我們能否依靠在第二個開始之前完成的第一個計算?也許這對於一篇新文章來說是一個很好的話題 - 我會嘗試通過API獲得更多的經驗來制定一個或兩個好的問題。 –

1

我敢打賭,排除是不安全的,因爲在多線程(並行或並行)中,假設任何事情都是不安全的。某些結構給你提供了某些保證,但你必須非常謹慎和細緻,不要通過引入你認爲可以做的事情來打破這些保證,但是實際上在整個事情中存在很多複雜性。還沒花任何時間用C++ - AMP,但我傾向於嘗試一下。

+0

感謝您的想法(以及新的C++ -AMP標記)。 –

+1

另一種顯示接受答案的方法是對他們進行投票;) –

4

我顯示的簡單示例不需要my_array_view_instance.synchronize,因爲析構函數調用同步。話雖如此,我並沒有遵循最佳實踐(抱歉),即明確調用同步。原因是,如果在此時拋出任何異常,如果將它們留給析構函數,則不會觀察它們,因此請明確調用同步。

乾杯

丹尼爾

3

只注意到在您的文章有關parallel_for_each是同步VS asyncrhonous(對不起,我習慣了每個線程;-) 1個問題:「我們能相信parallel_for_each的行爲‘同步’,沒有它的第二個問題(W/r/t程序代碼)?「

這個問題的答案是在我的崗位約parallel_for_each: http://www.danielmoth.com/Blog/parallelforeach-From-Amph-Part-1.aspx

..而且在BUILD記錄你指出,從29:20-33:00 http://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-802T

概括地說,不,你不能相信它是同步的,這是asyncrhonous。 (隱式或顯式)同步點是任何試圖訪問由於並行循環而預期將從GPU複製的數據的代碼。

乾杯

丹尼爾