我已经使用1D数据类型在C ++中实现了Matrix数据类型,并将其包装成行和列。现在,我希望有可能从这个时候创建方形/阻塞子矩阵,我想在内存中进行。
问题在于我希望其中一些子矩阵可以转移到GPU内存并可以并行处理它们。例如,这对Matrix Multiplication很有用。由于这些子矩阵未在主存储器中对齐,因此如果不创建单独的副本,将它们作为单个单元复制到设备存储器是不可能的?我希望将这种直接GPU子矩阵复制映射到CPU原始矩阵以进行更新和提高效率。我事先并不知道确切的分区。
有人知道我怎么能实现它?
只是提醒一下,矩阵需要以块为单位进行分区,而不是按行进行分区,这在C / C ++中相对容易。
答案 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
来复制子矩阵的起始索引和结束索引。