slow market matrix reader

This commit is contained in:
antonl 2026-03-15 14:43:03 +01:00
parent c42b7d98df
commit da24f740ac

View File

@ -13,6 +13,7 @@ typedef float F32;
typedef double F64; typedef double F64;
typedef int32_t B32; typedef int32_t B32;
static int g_spmv_runs = 16;
typedef struct CSRMatrix CSRMatrix; typedef struct CSRMatrix CSRMatrix;
struct CSRMatrix { struct CSRMatrix {
@ -303,12 +304,73 @@ static void free_csr(CSRMatrix *A) {
A->nnz = 0; A->nnz = 0;
} }
static sparse_matrix_t csr_to_mkl_handle(const CSRMatrix *A) {
sparse_matrix_t H = NULL;
// oneMKL CSR creation takes row_start and row_end arrays.
// With standard CSR row_ptr, these are row_ptr[i] and row_ptr[i+1].
sparse_status_t st = mkl_sparse_d_create_csr(
&H,
SPARSE_INDEX_BASE_ZERO,
A->rows,
A->cols,
A->row_ptr,
A->row_ptr + 1,
A->col_ind,
A->values
);
if (st != SPARSE_STATUS_SUCCESS) panic("mkl_sparse_d_create_csr failed");
return H;
}
static void example_spmv(const CSRMatrix *A) {
sparse_matrix_t H = csr_to_mkl_handle(A);
struct matrix_descr descr;
descr.type = SPARSE_MATRIX_TYPE_GENERAL;
descr.mode = SPARSE_FILL_MODE_FULL;
descr.diag = SPARSE_DIAG_NON_UNIT;
// Optional optimization path recommended by oneMKL.
mkl_sparse_set_mv_hint(H, SPARSE_OPERATION_NON_TRANSPOSE, descr, 1000);
mkl_sparse_optimize(H);
double *x = (double *)xmalloc((size_t)A->cols * sizeof(double));
double *y = (double *)calloc((size_t)A->rows, sizeof(double));
if (!y) panic("out of memory");
for (MKL_INT i = 0; i < A->cols; i++) x[i] = 1.0;
for (int i = 0; i < g_spmv_runs; i += 1) {
sparse_status_t st = mkl_sparse_d_mv(
SPARSE_OPERATION_NON_TRANSPOSE,
1.0,
H,
descr,
x,
0.0,
y
);
if (st != SPARSE_STATUS_SUCCESS) panic("mkl_sparse_d_mv failed");
}
printf("SpMV done for %d runs. y[0] = %.6g\n", g_spmv_runs, (A->rows > 0 ? y[0] : 0.0));
free(x);
free(y);
mkl_sparse_destroy(H);
}
int main() { int main() {
const char *thermal2Path = "E:\\dev\\go_matmul_perf\\suitesparse_test_matrices\\FEM_3D_thermal2.mtx"; //const char *thermal2Path = "E:\\dev\\go_matmul_perf\\suitesparse_test_matrices\\FEM_3D_thermal2.mtx";
printf("Reading market matrix %s \n", thermal2Path); const char *bigPath = "E:\\dev\\go_matmul_perf\\suitesparse_test_matrices\\nlpkkt200.mtx";
printf("Reading market matrix %s \n", bigPath);
CSRMatrix A; CSRMatrix A;
A = read_matrix_market_to_csr(thermal2Path); A = read_matrix_market_to_csr(bigPath);
printf("Read matrix with size %d x %d and nnz = %d \n", A.rows, A.cols, A.nnz); printf("Read matrix with size %d x %d and nnz = %d \n", A.rows, A.cols, A.nnz);
example_spmv(&A);
free_csr(&A); free_csr(&A);