Actual source code: aijmkl.h

  1: #pragma once
  2: /*
  3:   Wrappers for mkl_cspblas_ routines.
  4:   A more elegant way to do this would be to use an approach like that used in petsclbaslapack_mangle.h,
  5:   but since the MKL sparse BLAS routines are not going to be as widely used, and because
  6:   we don't have to worry about Fortran name mangling, this seems OK for now.
  7: */

  9: /* Have to redefine MKL_Complex16 and MKL_Complex8 as PetscScalar for the complex number cases.
 10:  * This works fine with a C99 compiler -- still need to verify that this works with C89.
 11:  * Note: These definitions need to occur BEFORE including MKL headers. */
 12: #define MKL_Complex16 PetscScalar
 13: #define MKL_Complex8  PetscScalar

 15: #if !defined(PETSC_USE_COMPLEX)
 16:   #if defined(PETSC_USE_REAL_SINGLE)
 17:     #define mkl_cspblas_xcsrgemv(transa, m, a, ia, ja, x, y) mkl_cspblas_scsrgemv(transa, m, a, ia, ja, x, y)
 18:   #elif defined(PETSC_USE_REAL_DOUBLE)
 19:     #define mkl_cspblas_xcsrgemv(transa, m, a, ia, ja, x, y) mkl_cspblas_dcsrgemv(transa, m, a, ia, ja, x, y)
 20:   #endif
 21: #else
 22:   #if defined(PETSC_USE_REAL_SINGLE)
 23:     #define mkl_cspblas_xcsrgemv(transa, m, a, ia, ja, x, y) mkl_cspblas_ccsrgemv(transa, m, a, ia, ja, x, y)
 24:   #elif defined(PETSC_USE_REAL_DOUBLE)
 25:     #define mkl_cspblas_xcsrgemv(transa, m, a, ia, ja, x, y) mkl_cspblas_zcsrgemv(transa, m, a, ia, ja, x, y)
 26:   #endif
 27: #endif

 29: /* Note: MKL releases prior to the end of 2014 do not have a const-correct interface -> ugly casts necessary.
 30:          Does not apply to mkl_sparse_x_*()-routines, because these have been introduced later. */
 31: #if !defined(PETSC_USE_COMPLEX)
 32:   #if defined(PETSC_USE_REAL_SINGLE)
 33:     #define mkl_xcsrmv(transa, m, k, alpha, matdescra, val, indx, pntrb, pntre, x, beta, y) mkl_scsrmv(transa, m, k, alpha, matdescra, (MatScalar *)val, (PetscInt *)indx, (PetscInt *)pntrb, (PetscInt *)pntre, (PetscScalar *)x, beta, y)
 34:   #elif defined(PETSC_USE_REAL_DOUBLE)
 35:     #define mkl_xcsrmv(transa, m, k, alpha, matdescra, val, indx, pntrb, pntre, x, beta, y) mkl_dcsrmv(transa, m, k, alpha, matdescra, (MatScalar *)val, (PetscInt *)indx, (PetscInt *)pntrb, (PetscInt *)pntre, (PetscScalar *)x, beta, y)
 36:   #endif
 37: #else
 38:   #if defined(PETSC_USE_REAL_SINGLE)
 39:     #define mkl_xcsrmv(transa, m, k, alpha, matdescra, val, indx, pntrb, pntre, x, beta, y) mkl_ccsrmv(transa, m, k, alpha, matdescra, (MatScalar *)val, (PetscInt *)indx, (PetscInt *)pntrb, (PetscInt *)pntre, (PetscScalar *)x, beta, y)
 40:   #elif defined(PETSC_USE_REAL_DOUBLE)
 41:     #define mkl_xcsrmv(transa, m, k, alpha, matdescra, val, indx, pntrb, pntre, x, beta, y) mkl_zcsrmv(transa, m, k, alpha, matdescra, (MatScalar *)val, (PetscInt *)indx, (PetscInt *)pntrb, (PetscInt *)pntre, (PetscScalar *)x, beta, y)
 42:   #endif
 43: #endif

 45: #if !defined(PETSC_USE_COMPLEX)
 46:   #if defined(PETSC_USE_REAL_SINGLE)
 47:     #define mkl_sparse_x_create_csr mkl_sparse_s_create_csr
 48:   #elif defined(PETSC_USE_REAL_DOUBLE)
 49:     #define mkl_sparse_x_create_csr mkl_sparse_d_create_csr
 50:   #endif
 51: #else
 52:   #if defined(PETSC_USE_REAL_SINGLE)
 53:     #define mkl_sparse_x_create_csr mkl_sparse_c_create_csr
 54:   #elif defined(PETSC_USE_REAL_DOUBLE)
 55:     #define mkl_sparse_x_create_csr mkl_sparse_z_create_csr
 56:   #endif
 57: #endif

 59: #if !defined(PETSC_USE_COMPLEX)
 60:   #if defined(PETSC_USE_REAL_SINGLE)
 61:     #define mkl_sparse_x_mv mkl_sparse_s_mv
 62:   #elif defined(PETSC_USE_REAL_DOUBLE)
 63:     #define mkl_sparse_x_mv mkl_sparse_d_mv
 64:   #endif
 65: #else
 66:   #if defined(PETSC_USE_REAL_SINGLE)
 67:     #define mkl_sparse_x_mv mkl_sparse_c_mv
 68:   #elif defined(PETSC_USE_REAL_DOUBLE)
 69:     #define mkl_sparse_x_mv mkl_sparse_z_mv
 70:   #endif
 71: #endif

 73: #if !defined(PETSC_USE_COMPLEX)
 74:   #if defined(PETSC_USE_REAL_SINGLE)
 75:     #define mkl_sparse_x_export_csr mkl_sparse_s_export_csr
 76:   #elif defined(PETSC_USE_REAL_DOUBLE)
 77:     #define mkl_sparse_x_export_csr mkl_sparse_d_export_csr
 78:   #endif
 79: #else
 80:   #if defined(PETSC_USE_REAL_SINGLE)
 81:     #define mkl_sparse_x_export_csr mkl_sparse_c_export_csr
 82:   #elif defined(PETSC_USE_REAL_DOUBLE)
 83:     #define mkl_sparse_x_export_csr mkl_sparse_z_export_csr
 84:   #endif
 85: #endif