mkl: 无效值错误暴露稀疏矩阵
mkl: invalid value error exporing sparse matrix
以下程序使用 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
。
这怎么可能发生,如何解决?
您需要事先将 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
以下程序使用 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
。
这怎么可能发生,如何解决?
您需要事先将 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