questions about CpuMatrix::mul(CpuSparseMatrix* a, MatBType* b, MatCType* c, real scaleAB, real scaleT)
Created by: shenhuinuist
1、我现在想用paddle给的方法执行两个矩阵相乘,C = A_B。 A是稀疏矩阵,B是稠密矩阵。我在Matrix.cpp中找到这个函数: void CpuMatrix::mul(CpuSparseMatrix_ a, CpuMatrix* b, real scaleAB, real scaleT) { if (dynamic_cast<CacheRowCpuMatrix*>(b)) { return mul(a, dynamic_cast<CacheRowCpuMatrix*>(b), this, scaleAB, scaleT); } else if (dynamic_cast<SparseRowCpuMatrix*>(b)) { return mul(a, dynamic_cast<SparseRowCpuMatrix*>(b), this, scaleAB, scaleT); } else { return mul(a, b, this, scaleAB, scaleT); } 我的情况应该是最后一个return,但是我不确定mul(a, b, this, scaleAB, scaleT)的实现,我只找到了这个函数: void CpuMatrix::mul(CpuSparseMatrix* a, MatBType* b, MatCType* c, real scaleAB, real scaleT),此处我的理解是否正确? 在void CpuMatrix::mul(CpuSparseMatrix* a, MatBType* b, MatCType* c, real scaleAB, real scaleT)这个函数里面,代码中提到了不支持A是SPARSE_CSR存储格式(CHECK_EQ(a->getFormat(), SPARSE_CSR) << "Not supported" ),且还不支持好几种情况:例如scaleAB=1 等等,现在针对A是SPARSE_CSR存储格式的情况,以及代码中提到的另外几种不支持的情况,paddle给出实现了吗? 2、基于我之前的理解是正确的,那么在这个函数里CpuMatrix::mul(CpuSparseMatrix* a, MatBType* b, MatCType* c, real scaleAB, real scaleT) 我的A设置成 是 [0, 1, 0, 2, 0;1, 0, 0, 0, 0;0, 0, 0, 2, 5]; 按照SPARSE_CSC存储,col [0, 1, 2, 2, 4, 5]; row [1, 0, 0, 2, 2]; value [1, 1, 2, 2, 5]; 函数里面,第一次的start = a->getRowStartIdx(1); end = a->getRowStartIdx(1 + 1); 这样的话对应上述row 的值,start=1,而end = 0? 我无法理解矩阵按照SPARSE_CSC存储下,getRowStartIdx的取值,请指正,谢谢。