2012-06-12 60 views
0

我有一百萬列x一百萬行的矩陣。用gpgpu做大量矢量計算的最佳方法是什麼?

我algoritm需要做的:

Matrix m = Matrix(rows,cols) 
for (colB: cols){ 
    vector currColA = m.getcolumn(colA) 

    for (colB: cols){ 
    vector currColB = m.getcolumn(colB) 
    result = currColA.dotProduct(colB) 
    return result; 
}} 

或者你也可以說:

Vectors [] v = Vectors[] 

for (i: v.length){ 
    vector v1 = v[i] 

    for (i: v.length){ 
    vector v2 = v[i] 
    result = v1.dotProduct(v2) 
    return result; 
}} 

我的問題:什麼是分配內存和初始化內存的正確方法這個問題:

- 我應該爲整個矩陣分配內存,用全矩陣初始化它, d然後運行算法?
- 或者我應該分配一個向量列表的內存,然後遍歷這個列表?
- 否則??

我擔心的是我想盡量減少傳輸時間到GPU。我試圖通過修改JCublas hello world example以在2個矢量上進行sgemm操作來嘗試這種計算,但是當在大量矢量上進行sgemm操作時,結果是傳輸時間刪除了gpu加速的好處。

Thx! PS:實現可以在任何Java庫中

+0

這是一個稀疏或密集的矩陣?一個100萬×100萬的32位整數或浮點值的密集矩陣需要4000 Gb的內存。這不僅不適合任何GPU內存,也不適合任何不需要專用數據中心的主機系統的內存。你打算做什麼樣的機器? – talonmies

+0

@talonmies我使用一個包含250,000個雙值稀疏向量的數組。任何矢量的長度是1,100,000。 (http://code.google.com/p/matrix-toolkits-java/source/browse/trunk/src/no/uib/cipr/matrix/sparse/SparseVector.java?r=46)。向量*非常稀疏(平均10個值被填充)。目前,我可以使用i7-2860,16Gb筆記本電腦上的多線程來運行它,但需要幾個小時。 – seinecle

回答

0

這聽起來像是你正在執行一次一個的限制。 CPU-> GPU拷貝,等待,計算,GPU-> CPU拷貝,等待。大多數人沒有意識到內存複製可能導致的隱含等待。

你能管理你的操作嗎?換句話說,你的循環是否包含以下內容?

  • CPU-> GPU副本
  • GPU計算
  • GPU-> CPU副本

流水線這一點,你會使用(例如)4個單獨的(按順序)命令隊列,問題在每個隊列上對GPU進行非阻塞傳輸,在每個隊列上發出內核執行,並按照該順序在每個隊列上發出GPU-> CPU副本。您必須保證兩個緩衝區保持有效,直到等待(稍後介紹)。這將允許GPU在隨後的內存傳輸發生時開始計算。

此外,從來沒有使用阻塞內存傳輸,總是使用非阻塞。每傳輸一次(8次),就爲GPU-> CPU拷貝獲取一個事件對象,但如果這不是第一次迭代,則等待最後一個事件對象。這將節制您的隊列並允許您重新使用緩衝區,但重疊操作會使傳輸和計算重疊。我們正在等待8次迭代之前的轉移,所以我們不排空隊列。管理隊列深度非常重要,過多的工作項導致GUI和工作項匱乏。

相關問題