【问题标题】:mkl: invalid value error exporing sparse matrixmkl:导出稀疏矩阵的无效值错误
【发布时间】:2026-02-05 05:25:02
【问题描述】:

以下程序使用 Intel MKL 并根据坐标表示创建一个稀疏矩阵,然后将该矩阵导出到CSR format

  include 'mkl_spblas.f90'
program test

  use iso_c_binding
  use mkl_spblas
  implicit none

  complex(kind=kind(0.d0)) :: values(4)
  integer :: columns(4)
  integer :: rows(4)

  TYPE(C_PTR) :: rows_start_csr, rows_end_csr, col_index_csr, values_csr
  integer(C_INT) :: indexing_csr, nrows_csr, ncol_csr
  type(SPARSE_MATRIX_T) :: handle
  integer :: stat

  ! Matrix
  !
  ! | 0 1 0 0 |
  ! | 1 0 0 0 |
  ! | 0 0 1 0 |
  ! | 0 0 0 1 |
  values(1) = 1
  rows(1) = 1
  columns(1) = 2

  values(2) = 1
  rows(2) = 2
  columns(2) = 1

  values(3) = 1
  rows(3) = 3
  columns(3) = 3

  values(4) = 1
  rows(4) = 4
  columns(4) = 4

  stat = mkl_sparse_z_create_coo(handle, SPARSE_INDEX_BASE_ONE, 4, 4, 4, rows, columns, values)
  write (*,*) 'stat after create = ', stat
  stat = mkl_sparse_z_export_csr(handle, indexing_csr, nrows_csr, ncol_csr, rows_start_csr, rows_end_csr, col_index_csr, values_csr)
  write (*,*) 'stat after export = ', stat, '  SPARSE_STATUS_INVALID_VALUE = ', SPARSE_STATUS_INVALID_VALUE
  
end program test

程序的输出是:

 stat after create =            0
 stat after export =            3   SPARSE_STATUS_INVALID_VALUE =            3

虽然矩阵创建后状态正常,但令人惊讶的是,导出后的状态对应于SPARSE_STATUS_INVALID_VALUE

这怎么可能发生,如何解决?

【问题讨论】:

    标签: fortran sparse-matrix intel-mkl


    【解决方案1】:

    您需要事先将您的 COO 格式转换为 CSR。

    include 'mkl_spblas.f90'
    program test
    
      use iso_c_binding
      use mkl_spblas
      implicit none
    
      complex(kind=kind(0.d0)) :: values(4)
      integer                  :: columns(4)
      integer                  :: rows(4)
    
      TYPE(C_PTR)           :: rows_start_csr, rows_end_csr, col_index_csr, values_csr
      integer(C_INT)        :: indexing_csr, nrows_csr, ncol_csr
      type(SPARSE_MATRIX_T) :: coo, csr   ! ===== NEW
      integer               :: stat
    
      ! Matrix
      !
      ! | 0 1 0 0 |
      ! | 1 0 0 0 |
      ! | 0 0 1 0 |
      ! | 0 0 0 1 |
      values(1) = 1
      rows(1) = 1
      columns(1) = 2
    
      values(2) = 1
      rows(2) = 2
      columns(2) = 1
    
      values(3) = 1
      rows(3) = 3
      columns(3) = 3
    
      values(4) = 1
      rows(4) = 4
      columns(4) = 4
    
      stat = mkl_sparse_z_create_coo(coo, SPARSE_INDEX_BASE_ONE, 4, 4, 4, rows, columns, values)
      write (*,*) 'stat after create = ', stat
    
      ! ===== NEW ===== ->
      stat = mkl_sparse_convert_csr(coo, SPARSE_OPERATION_NON_TRANSPOSE, csr)
      write (*,*) 'stat after convert = ', stat
      ! ===== NEW ===== <-
    
      stat = mkl_sparse_z_export_csr(csr, indexing_csr, nrows_csr, ncol_csr, rows_start_csr, rows_end_csr, col_index_csr, values_csr)
      write (*,*) 'stat after export = ', stat, '  SPARSE_STATUS_INVALID_VALUE = ', SPARSE_STATUS_INVALID_VALUE
    
    end program
    

    【讨论】:

    • 在我的机器上我得到 "stat after convert = 2",即SPARSE_STATUS_ALLOC_FAILED
    • 奇怪的矿运行顺利。 stat after convert = 0 ...
    • 好的,原来我必须将-fdefault-integer-8 添加到命令行并将nrows_csr, ncol_csr 声明为整数。不知道为什么需要这样做
    • 这取决于你链接到哪个 mkl。如果你使用 ilp64 mkl 那么你需要 64 位整数。
    最近更新 更多