program CSR_matrix_matrix_multiplication_full
USE MKL_SPBLAS
implicit none
! 定义CSR格式的矩阵
integer, parameter :: nnz = 5
integer, parameter :: N = 3
real(kind=8), dimension(:), ALLOCATABLE :: B1, B2, B3
integer, dimension(:), ALLOCATABLE :: rows_start1, rows_end1, rows_start2, rows_end2, rows_start3, rows_end3
integer, dimension(:), ALLOCATABLE :: ja1, ja2, ja3
integer, dimension(:), ALLOCATABLE :: ia1, ia2, ia3
TYPE(SPARSE_MATRIX_T) :: A1, A2, A3, A4
integer :: start1, start2, start3, start4, start5
REAL(kind=8) ,DIMENSION(6) :: A5
! 初始化CSR格式的矩阵
B1 = [1.0, 2.0, 3.0, 4.0, 5.0]
rows_start1 = [1, 2, 4]
rows_end1 = [2, 4, 6]
ja1 = [1, 2, 3, 1, 2]
ia1 = [1, 2, 4, 6] ! 每行起始的位置
! 1,0,0
! 0,2,3
! 4,5,0
B2 = [2.0, 3.0, 4.0, 5.0, 1.0]
rows_start2 = [1, 2, 4]
rows_end2 = [2, 4, 6]
ja2 = [1, 2, 3, 1, 2]
ia2 = [1, 2, 4, 6] ! 每行起始的位置
! 2,0,0
! 0,3,4
! 5,1,0
start1 = mkl_sparse_d_create_csr(A1, SPARSE_INDEX_BASE_ONE, 3, 3, rows_start1, rows_end1, ja1, B1)
start2 = mkl_sparse_d_create_csr(A2, SPARSE_INDEX_BASE_ONE, 3, 3, rows_start2, rows_end2, ja2, B2)
start3 = mkl_sparse_spmm(SPARSE_OPERATION_NON_TRANSPOSE, A1, A2, A3)
! 1,0
! 0,2
! 0,3
B3 = [1.0, 2.0, 3.0]
rows_start3 = [1, 2, 3]
rows_end3 = [2, 3, 4]
ja3 = [1, 2, 2]
ia3 = [1, 2, 3, 4] ! 每行起始的位置
start4 = mkl_sparse_d_create_csr(A4, SPARSE_INDEX_BASE_ONE, 3, 2, rows_start3, rows_end3, ja3, B3)
start5 = mkl_sparse_d_spmmd (SPARSE_OPERATION_NON_TRANSPOSE, A3, A4, SPARSE_LAYOUT_COLUMN_MAJOR, A5, 3)
! 显示变量的值
print *, "start1:", start1
print *, "start2:", start2
print *, "start3:", start3
print *, "start4:", start4
print *, "start5:", start5
print *, "A5:",A5
! 在这里显示 A 的内容
end program CSR_matrix_matrix_multiplication_full
参照mkl_sparse_?_spmmd (intel.com)手册操作即可,需要注意A是sparse_matrix_t格式,须通过函数mkl_sparse_d_create_csr生成,详见手册mkl_sparse_?_create_csr (intel.com),start都是0表示计算成功