blas_complex.c 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. /* StarPU --- Runtime system for heterogeneous multicore architectures.
  2. *
  3. * Copyright (C) 2011 Inria
  4. * Copyright (C) 2010,2012,2015,2017 CNRS
  5. * Copyright (C) 2009-2010,2014, 2018 Université de Bordeaux
  6. *
  7. * StarPU is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU Lesser General Public License as published by
  9. * the Free Software Foundation; either version 2.1 of the License, or (at
  10. * your option) any later version.
  11. *
  12. * StarPU is distributed in the hope that it will be useful, but
  13. * WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  15. *
  16. * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  17. */
  18. #include <ctype.h>
  19. #include <stdio.h>
  20. #include <complex.h>
  21. #include <starpu.h>
  22. #include "blas_complex.h"
  23. /*
  24. This files contains BLAS wrappers for the different BLAS implementations
  25. (eg. REFBLAS, STARPU_ATLAS, GOTOBLAS ...). We assume a Fortran orientation as most
  26. libraries do not supply C-based ordering.
  27. */
  28. #ifdef STARPU_ATLAS
  29. #error not implemented
  30. #elif defined(STARPU_GOTO) || defined(STARPU_SYSTEM_BLAS)
  31. #error not implemented
  32. #elif defined(STARPU_OPENBLAS) || defined(STARPU_MKL)
  33. inline void CGEMM(char *transa, char *transb, int M, int N, int K,
  34. complex float alpha, complex float *A, int lda, complex float *B, int ldb,
  35. complex float beta, complex float *C, int ldc)
  36. {
  37. cgemm_(transa, transb, &M, &N, &K, &alpha,
  38. A, &lda, B, &ldb,
  39. &beta, C, &ldc);
  40. }
  41. inline void ZGEMM(char *transa, char *transb, int M, int N, int K,
  42. complex double alpha, complex double *A, int lda, complex double *B, int ldb,
  43. complex double beta, complex double *C, int ldc)
  44. {
  45. zgemm_(transa, transb, &M, &N, &K, &alpha,
  46. A, &lda, B, &ldb,
  47. &beta, C, &ldc);
  48. }
  49. inline void CGEMV(char *transa, int M, int N, complex float alpha, complex float *A, int lda,
  50. complex float *X, int incX, complex float beta, complex float *Y, int incY)
  51. {
  52. cgemv_(transa, &M, &N, &alpha, A, &lda, X, &incX, &beta, Y, &incY);
  53. }
  54. inline void ZGEMV(char *transa, int M, int N, complex double alpha, complex double *A, int lda,
  55. complex double *X, int incX, complex double beta, complex double *Y, int incY)
  56. {
  57. zgemv_(transa, &M, &N, &alpha, A, &lda, X, &incX, &beta, Y, &incY);
  58. }
  59. inline float SCASUM(int N, complex float *X, int incX)
  60. {
  61. return scasum_(&N, X, &incX);
  62. }
  63. inline double DZASUM(int N, complex double *X, int incX)
  64. {
  65. return dzasum_(&N, X, &incX);
  66. }
  67. void CSCAL(int N, complex float alpha, complex float *X, int incX)
  68. {
  69. cscal_(&N, &alpha, X, &incX);
  70. }
  71. void ZSCAL(int N, complex double alpha, complex double *X, int incX)
  72. {
  73. zscal_(&N, &alpha, X, &incX);
  74. }
  75. void CTRSM (const char *side, const char *uplo, const char *transa,
  76. const char *diag, const int m, const int n,
  77. const complex float alpha, const complex float *A, const int lda,
  78. complex float *B, const int ldb)
  79. {
  80. ctrsm_(side, uplo, transa, diag, &m, &n, &alpha, A, &lda, B, &ldb);
  81. }
  82. void ZTRSM (const char *side, const char *uplo, const char *transa,
  83. const char *diag, const int m, const int n,
  84. const complex double alpha, const complex double *A, const int lda,
  85. complex double *B, const int ldb)
  86. {
  87. ztrsm_(side, uplo, transa, diag, &m, &n, &alpha, A, &lda, B, &ldb);
  88. }
  89. void CSYR (const char *uplo, const int n, const complex float alpha,
  90. const complex float *x, const int incx, complex float *A, const int lda)
  91. {
  92. csyr_(uplo, &n, &alpha, x, &incx, A, &lda);
  93. }
  94. void CSYRK (const char *uplo, const char *trans, const int n,
  95. const int k, const complex float alpha, const complex float *A,
  96. const int lda, const complex float beta, complex float *C,
  97. const int ldc)
  98. {
  99. csyrk_(uplo, trans, &n, &k, &alpha, A, &lda, &beta, C, &ldc);
  100. }
  101. void CGERU(const int m, const int n, const complex float alpha,
  102. const complex float *x, const int incx, const complex float *y,
  103. const int incy, complex float *A, const int lda)
  104. {
  105. cgeru_(&m, &n, &alpha, x, &incx, y, &incy, A, &lda);
  106. }
  107. void ZGERU(const int m, const int n, const complex double alpha,
  108. const complex double *x, const int incx, const complex double *y,
  109. const int incy, complex double *A, const int lda)
  110. {
  111. zgeru_(&m, &n, &alpha, x, &incx, y, &incy, A, &lda);
  112. }
  113. void CTRSV (const char *uplo, const char *trans, const char *diag,
  114. const int n, const complex float *A, const int lda, complex float *x,
  115. const int incx)
  116. {
  117. ctrsv_(uplo, trans, diag, &n, A, &lda, x, &incx);
  118. }
  119. void CTRMM(const char *side, const char *uplo, const char *transA,
  120. const char *diag, const int m, const int n,
  121. const complex float alpha, const complex float *A, const int lda,
  122. complex float *B, const int ldb)
  123. {
  124. ctrmm_(side, uplo, transA, diag, &m, &n, &alpha, A, &lda, B, &ldb);
  125. }
  126. void ZTRMM(const char *side, const char *uplo, const char *transA,
  127. const char *diag, const int m, const int n,
  128. const complex double alpha, const complex double *A, const int lda,
  129. complex double *B, const int ldb)
  130. {
  131. ztrmm_(side, uplo, transA, diag, &m, &n, &alpha, A, &lda, B, &ldb);
  132. }
  133. void CTRMV(const char *uplo, const char *transA, const char *diag,
  134. const int n, const complex float *A, const int lda, complex float *X,
  135. const int incX)
  136. {
  137. ctrmv_(uplo, transA, diag, &n, A, &lda, X, &incX);
  138. }
  139. void CAXPY(const int n, const complex float alpha, complex float *X, const int incX, complex float *Y, const int incY)
  140. {
  141. caxpy_(&n, &alpha, X, &incX, Y, &incY);
  142. }
  143. void ZAXPY(const int n, const complex double alpha, complex double *X, const int incX, complex double *Y, const int incY)
  144. {
  145. zaxpy_(&n, &alpha, X, &incX, Y, &incY);
  146. }
  147. int ICAMAX (const int n, complex float *X, const int incX)
  148. {
  149. int retVal;
  150. retVal = icamax_ (&n, X, &incX);
  151. return retVal;
  152. }
  153. int IZAMAX (const int n, complex double *X, const int incX)
  154. {
  155. int retVal;
  156. retVal = izamax_ (&n, X, &incX);
  157. return retVal;
  158. }
  159. complex float CDOTU(const int n, const complex float *x, const int incx, const complex float *y, const int incy)
  160. {
  161. complex float retVal = 0;
  162. /* GOTOBLAS will return a FLOATRET which is a double, not a float */
  163. retVal = (float)cdotu_(&n, x, &incx, y, &incy);
  164. return retVal;
  165. }
  166. complex double ZDOTU(const int n, const complex double *x, const int incx, const complex double *y, const int incy)
  167. {
  168. return zdotu_(&n, x, &incx, y, &incy);
  169. }
  170. void CSWAP(const int n, complex float *X, const int incX, complex float *Y, const int incY)
  171. {
  172. cswap_(&n, X, &incX, Y, &incY);
  173. }
  174. void ZSWAP(const int n, complex double *X, const int incX, complex double *Y, const int incY)
  175. {
  176. zswap_(&n, X, &incX, Y, &incY);
  177. }
  178. #else
  179. #error "no BLAS lib available..."
  180. #endif