在C ++中将有效矩阵分解为平方子矩阵

时间:2011-02-17 12:18:02

标签: c++ c stl gpgpu gpu-programming

我已经使用1D数据类型在C ++中实现了Matrix数据类型,并将其包装成行和列。现在,我希望有可能从这个时候创建​​方形/阻塞子矩阵,我想在内存中进行。

问题在于我希望其中一些子矩阵可以转移到GPU内存并可以并行处理它们。例如,这对Matrix Multiplication很有用。由于这些子矩阵未在主存储器中对齐,因此如果不创建单独的副本,将它们作为单个单元复制到设备存储器是不可能的?我希望将这种直接GPU子矩阵复制映射到CPU原始矩阵以进行更新和提高效率。我事先并不知道确切的分区。

有人知道我怎么能实现它?

只是提醒一下,矩阵需要以块为单位进行分区,而不是按行进行分区,这在C / C ++中相对容易。

2 个答案:

答案 0 :(得分:1)

如果在创建'master'矩阵时已知所需的子矩阵,并且如果它们形成了master的分区,则可以创建一个像这样的复合矩阵类:

// 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'可以以记忆效率的方式组织。

答案 1 :(得分:0)

如果矩阵的维数为2的幂,则可以将它们存储在z-order的主机内存中。这样,您只需要通过一次调用cudaMemcpy来复制子矩阵的起始索引和结束索引。