Cuda 将稀疏矩阵从特征::稀疏矩阵转换为尖点::hyb_矩阵

Cuda 将稀疏矩阵从特征::稀疏矩阵转换为尖点::hyb_矩阵,cuda,sparse-matrix,eigen,data-conversion,cusp-library,Cuda,Sparse Matrix,Eigen,Data Conversion,Cusp Library,我正在寻找一种转化的方法 Eigen::SparseMatrixcusp::hyb_矩阵 来来回回 特征矩阵是之前计算的结果,我需要一个cusp::hyb_矩阵,以便稍后使用GPU进行共轭梯度计算 谢谢。好吧,我找到了一个解决办法,可以做需要做的事情,但仍然缺少一个更直接的方法 基于此,我只需要从Eigen::SparseMatrix中提取值的行/列/系数向量,以构造cusp::hyb_矩阵。这可以通过以下方式完成: void SparseMatrix2Coo(Eigen::SparseMatr

我正在寻找一种转化的方法

Eigen::SparseMatrixcusp::hyb_矩阵

来来回回

特征矩阵是之前计算的结果,我需要一个cusp::hyb_矩阵,以便稍后使用GPU进行共轭梯度计算


谢谢。

好吧,我找到了一个解决办法,可以做需要做的事情,但仍然缺少一个更直接的方法

基于此,我只需要从Eigen::SparseMatrix中提取值的行/列/系数向量,以构造cusp::hyb_矩阵。这可以通过以下方式完成:

void SparseMatrix2Coo(Eigen::SparseMatrix<float> Matrix, std::vector<int>& rows, std::vector<int>& cols, std::vector<float>& coeffs)
{
rows.clear();
cols.clear();
coeffs.clear();
for (int k=0; k < Matrix.outerSize(); ++k)
{
    for (Eigen::SparseMatrix<float>::InnerIterator it(Matrix,k); it; ++it)
    {
        rows.push_back(it.row());
        cols.push_back(it.col());
        coeffs.push_back(Matrix.coeff(it.row(), it.col()));
    }
}
assert(cols.size() == coeffs.size());
assert(rows.size() == cols.size());
}
void sparsematricx2coo(特征::sparsematricx矩阵,标准::向量和行,标准::向量和列,标准::向量和系数)
{
行。清除();
cols.clear();
清除系数();
对于(int k=0;k
现在,一旦我们有了rows/cols/coefs,我们只需要使用上面示例中的那些作为输入:

void computeConjugateGradientGPU(std::vector<int>& rows, std::vector<int>& cols, std::vector<float>& coeffs, std::vector<float>& b, Eigen::VectorXf& x)
{
int arrays_size = rows.size();
/// allocate device memory for CSR format
int   * device_I;
cudaMalloc(&device_I, arrays_size * sizeof(int));
int   * device_J;
cudaMalloc(&device_J, arrays_size * sizeof(int));
float * device_V;
cudaMalloc(&device_V, arrays_size * sizeof(float));

float * device_b;
cudaMalloc(&device_b, b.size() * sizeof(float));

/// copy raw data from host to device
cudaMemcpy(device_I, &cols[0], arrays_size * sizeof(int),   cudaMemcpyHostToDevice);
cudaMemcpy(device_J, &rows[0], arrays_size * sizeof(int),   cudaMemcpyHostToDevice);
cudaMemcpy(device_V, &coeffs[0], arrays_size * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(device_b, &b[0],  b.size() * sizeof(float), cudaMemcpyHostToDevice);

/// and the rest is the same...
}
void计算共轭梯度GPU(标准::向量和行,标准::向量和列,标准::向量和系数,标准::向量和b,特征::向量x和x)
{
int数组_size=rows.size();
///为CSR格式分配设备内存
int*设备I;
cudamaloc(和设备I,数组大小*sizeof(int));
int*设备_J;
cudamaloc(&device_J,数组大小*sizeof(int));
浮子*装置_V;
cudaMalloc(&device_V,数组大小*sizeof(float));
浮动*装置b;
cudamaloc(&device_b,b.size()*sizeof(float));
///将原始数据从主机复制到设备
cudaMemcpy(设备I和cols[0],数组大小*sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(设备和行[0],数组大小*sizeof(int),cudaMemcpyHostToDevice);
cudaMemcpy(设备和系数[0],数组大小*sizeof(float),cudaMemcpyHostToDevice);
cudaMemcpy(device_b,&b[0],b.size()*sizeof(float),cudaMemcpyHostToDevice);
///其余的都一样。。。
}
另一方面,同样的逻辑也很明显

希望这对别人有帮助


干杯。

太好了。你有实际问题要问吗?“我在寻找一种方法”相当肯定的意思是如何…嗯,我在寻找一种预测中奖彩票号码的方法。这并不意味着我们中的任何一方都有一个实际有效的问题,在试图编写执行这种格式转换的代码时,您具体不理解什么?