将稀疏矩阵从Eigen :: SparseMatrix转换为Cusp :: hyb_matrix

时间:2017-11-20 14:46:07

标签: cuda sparse-matrix eigen data-conversion cusp-library

我正在寻找转换方式

征::稀疏矩阵< float> < - >的尖:: hyb_matrix< int,float,cusp :: host_memory>

来回。

Eigen矩阵是先前计算的结果,我需要一个cusp :: hyb_matrix以便稍后使用GPU进行共轭梯度计算。

感谢。

1 个答案:

答案 0 :(得分:0)

好吧,我找到了一个可以满足需要的解决方法,但仍然缺少更直接的方法。

基于此example,我只需要从Eigen :: SparseMatrix中提取值的rows / cols / coeffs向量,以构造一个cusp :: hyb_matrix。这可以按如下方式完成:

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...
}

现在,一旦我们有了row / cols / coeffs,我们只需要使用上面例子中的那些作为输入:

VResult<T>

对于相同的逻辑,另一种方式非常明显。

希望这有助于某人。

干杯。