mkl_jit_blas_lp64.f90 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. !===============================================================================
  2. ! Copyright 2021-2022 Intel Corporation.
  3. !
  4. ! This software and the related documents are Intel copyrighted materials, and
  5. ! your use of them is governed by the express license under which they were
  6. ! provided to you (License). Unless the License provides otherwise, you may not
  7. ! use, modify, copy, publish, distribute, disclose or transmit this software or
  8. ! the related documents without Intel's prior written permission.
  9. !
  10. ! This software and the related documents are provided as is, with no express
  11. ! or implied warranties, other than those that are expressly stated in the
  12. ! License.
  13. !===============================================================================
  14. ! Content:
  15. ! Intel(R) Math Kernel Library (Intel(R) MKL) FORTRAN interface for JIT
  16. ! BLAS routines
  17. !*******************************************************************************
  18. MODULE MKL_JIT_BLAS_LP64
  19. USE, INTRINSIC :: ISO_C_BINDING , ONLY : C_INTPTR_T, C_PTR, C_INT, C_FUNPTR, &
  20. C_FLOAT, C_DOUBLE, C_FLOAT_COMPLEX, C_DOUBLE_COMPLEX
  21. ! return status of the routines
  22. ENUM, BIND(C)
  23. ENUMERATOR :: MKL_JIT_SUCCESS = 0_4, & ! jitter was created and kernel jitted
  24. MKL_NO_JIT = 1_4, & ! jitter was created but no kernel jitted, will use standard GEMM
  25. MKL_JIT_ERROR = 2_4 ! jitter was not created
  26. END ENUM
  27. ! define corresponding fortran type of jit_get_?gemm_ptr returned function pointer
  28. ABSTRACT INTERFACE
  29. subroutine sgemm_jit_kernel_t ( jitter, a, b, c ) BIND(C)
  30. use, intrinsic :: ISO_C_BINDING, only : c_float, c_intptr_t, c_ptr
  31. TYPE(C_PTR), INTENT(IN), VALUE :: jitter
  32. real(c_float) :: a(*), b(*), c(*)
  33. end subroutine sgemm_jit_kernel_t
  34. subroutine dgemm_jit_kernel_t ( jitter, a, b, c ) BIND(C)
  35. use, intrinsic :: ISO_C_BINDING, only : c_double, c_intptr_t, c_ptr
  36. TYPE(C_PTR), INTENT(IN), VALUE :: jitter
  37. real(c_double) :: a(*), b(*), c(*)
  38. end subroutine dgemm_jit_kernel_t
  39. subroutine cgemm_jit_kernel_t ( jitter, a, b, c ) BIND(C)
  40. use, intrinsic :: ISO_C_BINDING, only : c_float, c_intptr_t, c_ptr
  41. TYPE(C_PTR), INTENT(IN), VALUE :: jitter
  42. COMPLEX (c_float) :: a(*), b(*), c(*)
  43. end subroutine cgemm_jit_kernel_t
  44. subroutine zgemm_jit_kernel_t ( jitter, a, b, c ) BIND(C)
  45. use, intrinsic :: ISO_C_BINDING, only : c_double, c_intptr_t, c_ptr
  46. TYPE(C_PTR), INTENT(IN), VALUE :: jitter
  47. COMPLEX (c_double) :: a(*), b(*), c(*)
  48. end subroutine zgemm_jit_kernel_t
  49. END INTERFACE
  50. ! JIT API interface
  51. INTERFACE
  52. ! create a jitter, store it in first argument, generate the corresponding GEMM kernel (can be a call to standard GEMM), return status is either MKL_JIT_ERROR, MKL_JIT_SUCCESS, MKL_NO_JIT
  53. function mkl_jit_create_dgemm ( jitter, transa, transb, m, n, k, alpha, lda, ldb, beta, ldc ) RESULT (status) BIND(C)
  54. use, intrinsic :: ISO_C_BINDING, only : c_intptr_t, c_ptr, c_int, c_double, c_char
  55. integer(c_int) :: status
  56. TYPE(C_PTR) :: jitter
  57. character(len=1, kind=c_char) :: transa, transb
  58. integer(c_int) :: m, n, k, lda, ldb, ldc
  59. real(c_double) :: alpha, beta
  60. END function mkl_jit_create_dgemm
  61. function mkl_jit_create_sgemm ( jitter, transa, transb, m, n, k, alpha, lda, ldb, beta, ldc ) RESULT (status) BIND(C)
  62. use, intrinsic :: ISO_C_BINDING, only : c_intptr_t, c_ptr, c_int, c_float, c_char
  63. integer(c_int) :: status
  64. TYPE(C_PTR) :: jitter
  65. character(len=1, kind=c_char) :: transa, transb
  66. integer(c_int) :: m, n, k, lda, ldb, ldc
  67. real(c_float) :: alpha, beta
  68. END function mkl_jit_create_sgemm
  69. function mkl_jit_create_cgemm ( jitter, transa, transb, m, n, k, alpha, lda, ldb, beta, ldc ) RESULT (status) BIND(C)
  70. use, intrinsic :: ISO_C_BINDING, only : c_intptr_t, c_ptr, c_int, c_float, c_char
  71. integer(c_int) :: status
  72. TYPE(C_PTR) :: jitter
  73. character(len=1, kind=c_char) :: transa, transb
  74. integer(c_int) :: m, n, k, lda, ldb, ldc
  75. complex(c_float) :: alpha, beta
  76. END function mkl_jit_create_cgemm
  77. function mkl_jit_create_zgemm ( jitter, transa, transb, m, n, k, alpha, lda, ldb, beta, ldc ) RESULT (status) BIND(C)
  78. use, intrinsic :: ISO_C_BINDING, only : c_intptr_t, c_ptr, c_int, c_double, c_char
  79. integer(c_int) :: status
  80. TYPE(C_PTR) :: jitter
  81. character(len=1, kind=c_char) :: transa, transb
  82. integer(c_int) :: m, n, k, lda, ldb, ldc
  83. complex(c_double) :: alpha, beta
  84. END function mkl_jit_create_zgemm
  85. ! destroy jitter and free memory, return status is either MKL_JIT_SUCCESS or MKL_JIT_ERROR (if given pointer is not a handle on a jitter)
  86. function mkl_jit_destroy ( jitter ) RESULT (status) BIND(C)
  87. use, intrinsic :: ISO_C_BINDING, only : c_intptr_t, c_ptr, c_int
  88. integer(c_int) :: status
  89. TYPE(C_PTR), INTENT(IN), VALUE :: jitter
  90. END function mkl_jit_destroy
  91. ! return a C procedure pointer to the generated GEMM kernel
  92. ! this pointer needs to be converted to a Fortran procedure pointer using ?gemm_kernel_t interfaces above
  93. function mkl_jit_get_dgemm_ptr ( jitter ) RESULT (ptr) BIND(C)
  94. use, intrinsic :: ISO_C_BINDING, only : c_funptr, c_intptr_t, c_ptr
  95. TYPE(C_FUNPTR) :: ptr
  96. TYPE(C_PTR), INTENT(IN), VALUE :: jitter
  97. END function mkl_jit_get_dgemm_ptr
  98. function mkl_jit_get_sgemm_ptr ( jitter ) RESULT (ptr) BIND(C)
  99. use, intrinsic :: ISO_C_BINDING, only : c_funptr, c_intptr_t, c_ptr
  100. TYPE(C_FUNPTR) :: ptr
  101. TYPE(C_PTR), INTENT(IN), VALUE :: jitter
  102. END function mkl_jit_get_sgemm_ptr
  103. function mkl_jit_get_cgemm_ptr ( jitter ) RESULT (ptr) BIND(C)
  104. use, intrinsic :: ISO_C_BINDING, only : c_funptr, c_intptr_t, c_ptr
  105. TYPE(C_FUNPTR) :: ptr
  106. TYPE(C_PTR), INTENT(IN), VALUE :: jitter
  107. END function mkl_jit_get_cgemm_ptr
  108. function mkl_jit_get_zgemm_ptr ( jitter ) RESULT (ptr) BIND(C)
  109. use, intrinsic :: ISO_C_BINDING, only : c_funptr, c_intptr_t, c_ptr
  110. TYPE(C_FUNPTR) :: ptr
  111. TYPE(C_PTR), INTENT(IN), VALUE :: jitter
  112. END function mkl_jit_get_zgemm_ptr
  113. END INTERFACE
  114. END MODULE MKL_JIT_BLAS_LP64