2015-04-24 25 views
1

所有。我只有一個GPU設備的Nvidia GTX 750我做了一個試驗,結果從CPU的數據複製到GPU在一個單獨的線程使用clEnqueueWriteBuffer。然後我通過使用多個線程來完成它。結果是多線程似乎變慢了。 當使用多個線程,每一個線程具有由相同的設備創建自己的內核/命令隊列/上下文。所以我的問題是,clEnqueueWriteBuffer調用對某個設備有一些鎖定?我怎樣才能減少這些影響?如何使用OpenCL從CPU到GPU執行並行傳輸內存?

+1

有之間只有一條總線CPU和GPU。如果你有足夠的數據來飽和它,增加更多的線程不會使傳輸速度更快。 –

+0

好的,認爲。但是,如果可以在一個線程執行轉移時的處理? – ccwenlin

+0

另一個線程上GTX 750,你可以在數據傳輸的並行執行內核,是的。 –

回答

2

編輯:如果硬件工作負載太輕,多個併發命令隊列可以實現更好的總帶寬。

,比如OpenGL,Op​​enCL的需要批量處理多個緩衝區成單一個獲得更快,即使使用單一的OpenCL內核參數與多個參數比較快。因爲每個操作都有操作系統/ API的開銷。移動更大但更少的塊更好。

你可以買兩塊顯卡是相當於GTX 750組合時,使用多個PCI-E帶寬(如果你的主板可以給分開2個16X車道)

PCIe通道都讓您雙向可以嘗試並行化寫入和讀取並行化的可視化和計算並行化計算和寫入並行化計算並讀取並行化計算+寫+讀(ofcourse如果它們不依賴彼此像圖1中-a)如果你的算法中有這樣的情況,如果你的顯卡可以做到的話。

一旦我試圖分而治之大陣列上計算併發送各部分的GPU,它花了秒。現在我只用一次通話就可以計算一次通話。只需要幾毫秒。

圖1-A:

write iteration --- compute iteration ---- read iteration --- parallels 
     1     -      -     1 
     2     1      -     2 
     3     2      1     3 
     4     3      2     3 
     5     4      3     3 
     6     5      4     3 

如果迭代之間不存在依賴關係。如果有相關性,則:

圖1-B:

write iteration --- compute iteration ---- read iteration --- parallels 
    half of 1     -      -    1 
other half of 1   half of 1     -    2 
    half of 2    other half of 1   half of 1   3 
other half of 2   half of 2   other half of 1  3 
half of 3    other half of 2  half of 2    3 
other half of 3   half of 3   other half of 2  3 

如果您需要非恆定大小批量圖像之間的並行化:

cpu to gpu -------- gpu to gpu ----- compute ----- gpu to cpu 
1,2,3,4,5     -     -    - 
    -      1,2,3    -    - 
    -      4,5    1,2,3    - 
    -      -     4,5   1,2,3 
    6,7,8,9      -     -    4,5 
10,11,12     6,7,8    -    - 
    13,14     9,10,11    6,7    - 
15,16,17,18    12,13,14   8,9,10   6