C++; 我用C++数据包实现了矩阵数据类型,并将其封装成行和列。现在,我想从现在开始创建方形/分块子矩阵,我想在内存中这样做

C++; 我用C++数据包实现了矩阵数据类型,并将其封装成行和列。现在,我想从现在开始创建方形/分块子矩阵,我想在内存中这样做,c++,c,stl,gpgpu,gpu,C++,C,Stl,Gpgpu,Gpu,问题是,我希望这些子矩阵中的一些可以转移到GPU内存中,并且可以并行处理它们。例如,这对矩阵乘法很有用。由于这些子矩阵在主内存中没有对齐,如果不创建单独的副本,将它们作为单个单元复制到设备内存似乎是不可能的?我想有这个直接的GPU子矩阵副本映射到CPU原始矩阵的更新和效率的目的。我事先不知道确切的分区 有人知道我怎样才能做到吗 提醒一下,矩阵需要按块而不是按行进行分区,这在C/C++中相对容易。如果在创建“主”矩阵时已知所需的子矩阵,并且如果它们构成主矩阵的分区,则可以创建类似以下内容的复合矩阵

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

有人知道我怎样才能做到吗


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

如果在创建“主”矩阵时已知所需的子矩阵,并且如果它们构成主矩阵的分区,则可以创建类似以下内容的复合矩阵类:

// 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;
   }
};
//假设一个IMatrix接口(仅限纯虚拟成员)类
模板
结构复合矩阵:公共IMatrix{
typedef std::向量t矩阵;
t矩阵子矩阵;
元素(大小行、大小列)(&T){
返回findsubmatrix(行,列)->元素(行,列);
}
//找到实现“类似责任链”模式的算法。
PlainMatrix*findsubmatrix(行大小、列大小){
对于(tMatrices::iterator it=submatrices.begin())
;it!=子矩阵。结束()
++it)
{
如果(it->contains(row,col))返回*it;
}
返回NULL;
}
};

“PlainMatix”可以以内存高效的方式进行组织。

如果矩阵的维数是2的幂,则可以将它们存储在主机内存中。这样,只需调用
cudaMemcpy
,即可复制子矩阵的开始索引和结束索引