2011-02-17 132 views
4

我已經在C++中使用1D數據類型實現了矩陣數據類型,並將其包裝到行和列中。現在,我想從這個時候開始創建平方/塊的子矩陣,我想在內存中完成。在C++中將矩陣分解成方形子矩陣

問題是我希望這些子矩陣中的一些可以轉移到GPU內存,並且可以並行處理它們。這例如對矩陣乘法很有用。由於這些子矩陣未在主內存中對齊,因此如果不創建單獨的副本,將它們作爲單個單元複製到設備內存看起來是不可能的?我希望將此GPU子矩陣副本映射到CPU原始矩陣以實現更新和效率目的。我不知道事先確切的分區。

有人有一些想法,我怎麼可能實現它?

提醒一下,矩陣需要分塊分塊,而不是行分塊,這在C/C++中會比較容易。

回答

1

如果所需的子矩陣當時已知的「主」基質被創建,並且如果它們形成在主的一個分區,它可能在一定程度上產生複合基質類這樣的:

// supposing an IMatrix<T> interface (pure virtual members only) class 

template< typename T > 
struct CompositeMatrix : public IMatrix<T> { 
    typedef std::vector<PlainMatrix<T>*> tMatrices; 

    tMatrices submatrices; 
    T& element(size_t row, size_t column) { 
     return findsubmatrix(row, column)->element(row, column); 
    } 

    // find algorithm implementing 'chain of responsibility-like' pattern. 
    PlainMatrix<T>* findsubmatrix(size_t row, size_t col) { 
    for(tMatrices::iterator it = submatrices.begin() 
     ; it != submatrices.end() 
     ; ++it) 
    { 
     if(it->contains(row,col)) return *it;    
    } 
    return NULL; 
    } 
}; 

'PlainMatix'可以以有效的記憶方式進行組織。

0

如果您的矩陣的維度是2的冪,您可以將它們存儲在主機內存中z-order。這樣,您只需要一個子矩陣的起始索引和結束索引就可以通過一次調用將其複製到cudaMemcpy