稀疏基础线性代数库(Sparse BLAS)迁移
可替换性
KML_SPBLAS对外提供的接口,与MKL-SPBLAS的接口参数和函数名不一致,需要修改部分源码。
MKL接口 |
KML对应接口 |
数据类型 |
描述 |
|---|---|---|---|
cblas_?axpyi |
kml_sparse_?axpyi |
s,d,c,z |
稀疏向量分别缩放与加和 |
cblas_?doti |
kml_sparse_?doti |
s,d |
稀疏向量点积。 |
cblas_?dotci |
kml_sparse_?dotci_sub |
c,z |
共轭稀疏向量与另一稀疏向量的点积。 |
cblas_?dotui |
kml_sparse_?dotui_sub |
c,z |
复数稀疏向量点积。 |
cblas_?gthr |
kml_sparse_?gthr |
s,d,c,z |
将full-storage格式的稀疏向量中指定的元素加载到compressed格式的向量中 |
cblas_?gthrz |
kml_sparse_?gthrz |
s,d,c,z |
将full-storage格式的稀疏向量y中指定的元素加载到compressed格式的向量中。 |
cblas_?roti |
kml_sparse_?roti |
s,d |
基于平面上点旋转。 |
cblas_?sctr |
kml_sparse_?sctr |
s,d,c,z |
将compressed格式的向量写入full-storage格式的稀疏向量 |
MKL接口 |
KML对应接口 |
数据类型 |
描述 |
|---|---|---|---|
mkl_?csrgemv |
kml_sparse_?csrgemv |
s,d,c,z |
矩阵与向量计算,稀疏矩阵采用CSR格式存储。 |
mkl_?csrsymv |
kml_sparse_?csrsymv |
s,d,c,z |
矩阵与向量计算,稀疏矩阵采用CSR格式存储。 |
mkl_cspblas_?csrgemv |
kml_csparse_?csrgemv |
s,d,c,z |
矩阵与向量计算,稀疏矩阵采用CSR格式存储。 |
mkl_cspblas_?csrsymv |
kml_csparse_?csrsymv |
s,d,c,z |
矩阵与向量计算,稀疏矩阵采用CSR格式存储。 |
mkl_?csrmv |
kml_sparse_?csrmv |
s,d,c,z |
矩阵与向量乘积,矩阵是CSR格式的稀疏矩阵。 |
mkl_?csrsv |
kml_sparse_?csrsv |
s,d,c,z |
求解三角矩阵方程组计算,稀疏矩阵采用CSR格式存储。 |
mkl_?csrmm |
kml_sparse_?csrmm |
s,d,c,z |
矩阵与矩阵计算,其中一个稀疏矩阵采用CSR格式存储。 |
mkl_?csradd |
kml_sparse_?csradd |
s,d,c,z |
计算2个CSR格式的稀疏矩阵之和。 |
mkl_?csrmultcsr |
kml_sparse_?csrmultcsr |
s,d,c,z |
矩阵与矩阵计算,其中3个稀疏矩阵采用3-arrays CSR格式存储。 |
mkl_?csrmultd |
kml_sparse_?csrmultd |
s,d,c,z |
矩阵与矩阵计算,其中2个稀疏矩阵采用CSR格式存储。 |
C语言迁移步骤
需要迁移的部分主要有三大类:
- 函数名
可替换的接口与MKL接口的映射关系请参见可替换性。
- 函数入参
部分接口常数变量MKL传入参数为指针,KML接口直接传入数值,具体请参见《Kunpeng HPCKit 25.1.0.SPC001 开发指南》中“鲲鹏数学库开发指南”章节。
- 声明变量
例:csrmv接口
迁移前:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include "mkl_spblas.h" char transa = 'N'; MKL_INT m = 4; MKL_INT k = 4; float alpha = 0.5; float beta = 1.2; char *matdescra = "G00F"; // 一般矩阵,基 1 索引 float val[9] = {2, -3, 7, 1, -6, 8, -4, 5, 9}; MKL_INT indx[9] = {1, 2, 4, 3, 4, 1, 3, 4, 1}; MKL_INT pntrb[4] = {1, 4, 6, 9}; MKL_INT pntre[4] = {4, 6, 9, 10}; float x[4] = {1, 3, -2, 5}; float y[4] = {-1, 1, 5, 3}; mkl_scsrmv(&transa, &m, &k, &alpha, matdescra, val, indx, pntrb, pntre, x, &beta, y); return 0; /* * Output Y: * * 12.80 -14.80 26.50 8.10 * * */ |
迁移后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include "kspblas.h" kml_sparse_operation_t opt = KML_SPARSE_OPERATION_NON_TRANSPOSE; KML_INT m = 4; KML_INT k = 4; float alpha = 0.5; float beta = 1.2; char *matdescra = "G00F"; // 一般矩阵,基 1 索引 float val[9] = {2, -3, 7, 1, -6, 8, -4, 5, 9}; KML_INT indx[9] = {1, 2, 4, 3, 4, 1, 3, 4, 1}; KML_INT pntrb[4] = {1, 4, 6, 9}; KML_INT pntre[4] = {4, 6, 9, 10}; float x[4] = {1, 3, -2, 5}; float y[4] = {-1, 1, 5, 3}; kml_sparse_status_t status = kml_sparse_scsrmv(opt, m, k, alpha, ma tdescra, val, indx, pntrb, pntre, x, beta, y); return status; /* * Output Y: * * 12.80 -14.80 26.50 8.10 * * */ |
Fortran接口迁移步骤
Fortran接口迁移与C语言迁移步骤一致。