将eigen :: sparsematrix转换为cusparse,反之亦然
Convert Eigen::SparseMatrix to cuSparse and vice versa
我很难弄清楚如何将eigen :: sparsematrix转换为cusparse,因为在线文档和示例很少。对于密集的矩阵,从特征到Cuda转换为Cublas,相当直截了当
Eigen::MatrixXd A = Eigen::MatrixXd::Identity(3,3);
double *d_A;
cudaMalloc(reinterpret_cast<void **>(&d_A), 3 * 3 * sizeof(double));
cudaMemcpy(d_A, A.data(), sizeof(double) * 3 * 3, cudaMemcpyHostToDevice);
// do cublas operations on d_A
如何处理稀疏矩阵?
std::vector<Eigen::Triplet<double>> trip;
trip.emplace_back(0, 0, 1);
trip.emplace_back(1, 1, 1);
trip.emplace_back(2, 2, 1);
Eigen::SparseMatrix<double> A(3, 3);
A.setFromTriplets(trip.begin(), trip.end());
double *d_A;
// cudaMalloc?
// cudaMemcpy? some conversion?
// do cusparse operations
以防万一人们感兴趣,我想知道。棘手的部分是特征的稀疏矩阵是以CSC格式,而Cusparse的格式为CSR格式。幸运的是,可以通过简单地将CSC转换为CSR来完成转换。
void EigenSparseToCuSparseTranspose(
const Eigen::SparseMatrix<double> &mat, int *row, int *col, double *val)
{
const int num_non0 = mat.nonZeros();
const int num_outer = mat.cols() + 1;
cudaMemcpy(row,
mat.outerIndexPtr(),
sizeof(int) * num_outer,
cudaMemcpyHostToDevice);
cudaMemcpy(
col, mat.innerIndexPtr(), sizeof(int) * num_non0, cudaMemcpyHostToDevice);
cudaMemcpy(
val, mat.valuePtr(), sizeof(double) * num_non0, cudaMemcpyHostToDevice);
}
void CuSparseTransposeToEigenSparse(
const int *row,
const int *col,
const double *val,
const int num_non0,
const int mat_row,
const int mat_col,
Eigen::SparseMatrix<double> &mat)
{
std::vector<int> outer(mat_col + 1);
std::vector<int> inner(num_non0);
std::vector<double> value(num_non0);
cudaMemcpy(
outer.data(), row, sizeof(int) * (mat_col + 1), cudaMemcpyDeviceToHost);
cudaMemcpy(inner.data(), col, sizeof(int) * num_non0, cudaMemcpyDeviceToHost);
cudaMemcpy(
value.data(), val, sizeof(double) * num_non0, cudaMemcpyDeviceToHost);
Eigen::Map<Eigen::SparseMatrix<double>> mat_map(
mat_row, mat_col, num_non0, outer.data(), inner.data(), value.data());
mat = mat_map.eval();
}
相关文章:
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 如何在cuSparse中得到稀疏矩阵的对角线
- 在C++中,将int值赋给enum,反之亦然
- 如何在 c++ 中将所有大写字母转换为字符串中的小写字母,反之亦然?
- 将通用引用强制转换为可调用的 void 指针,反之亦然
- 用非原子更新原子变量,反之亦然
- 从向量到空指针的 memcpy(反之亦然)不起作用
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 如何在 OpenCL 中将小写转换为大写,反之亦然
- 如何将CNG密钥转换为OpenSSL EVP_PKEY(反之亦然)?
- C++ - 使用结构数据类型将单词中的单个小写字符更改为大写,反之亦然
- 快速将无符号字符的向量强制转换为POD结构的向量,反之亦然
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 使用C++将越南语字符从ISO88591、UTF8、UTF16BE、UTF16LE和UTF16编码为十六进制,反之亦然
- AVX2 SIMD Instrinsics 16 位到 8 位,反之亦然
- 将 char[] 数组转换为字节,然后将字节转换为 int,反之亦然
- 将字节数组 (uint8_t) 转换为单词数组 (uint16_t),反之亦然
- 在Qt中将QString转换为ASCII值,反之亦然
- 将eigen :: sparsematrix转换为cusparse,反之亦然