00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifdef ARMA_USE_BLAS
00018
00019
00020 namespace blas
00021 {
00022 extern "C"
00023 {
00024 void sgemv_(const char* transA, const int* m, const int* n, const float* alpha, const float* A, const int* ldA, const float* x, const int* incx, const float* beta, float* y, const int* incy);
00025 void dgemv_(const char* transA, const int* m, const int* n, const double* alpha, const double* A, const int* ldA, const double* x, const int* incx, const double* beta, double* y, const int* incy);
00026 void cgemv_(const char* transA, const int* m, const int* n, const void* alpha, const void* A, const int* ldA, const void* x, const int* incx, const void* beta, void* y, const int* incy);
00027 void zgemv_(const char* transA, const int* m, const int* n, const void* alpha, const void* A, const int* ldA, const void* x, const int* incx, const void* beta, void* y, const int* incy);
00028
00029 void sgemm_(const char* transA, const char* transB, const int* m, const int* n, const int* k, const float* alpha, const float* A, const int* ldA, const float* B, const int* ldB, const float* beta, float* C, const int* ldC);
00030 void dgemm_(const char* transA, const char* transB, const int* m, const int* n, const int* k, const double* alpha, const double* A, const int* ldA, const double* B, const int* ldB, const double* beta, double* C, const int* ldC);
00031 void cgemm_(const char* transA, const char* transB, const int* m, const int* n, const int* k, const void* alpha, const void* A, const int* ldA, const void* B, const int* ldB, const void* beta, void* C, const int* ldC);
00032 void zgemm_(const char* transA, const char* transB, const int* m, const int* n, const int* k, const void* alpha, const void* A, const int* ldA, const void* B, const int* ldB, const void* beta, void* C, const int* ldC);
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 }
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 template<typename eT>
00071 inline
00072 void
00073 gemv_(const char* transA, const int* m, const int* n, const eT* alpha, const eT* A, const int* ldA, const eT* x, const int* incx, const eT* beta, eT* y, const int* incy)
00074 {
00075 arma_type_check<is_supported_blas_type<eT>::value == false>::apply();
00076
00077 if(is_float<eT>::value == true)
00078 {
00079 typedef float T;
00080 sgemv_(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);
00081 }
00082 else
00083 if(is_double<eT>::value == true)
00084 {
00085 typedef double T;
00086 dgemv_(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);
00087 }
00088 else
00089 if(is_supported_complex_float<eT>::value == true)
00090 {
00091 typedef std::complex<float> T;
00092 cgemv_(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);
00093 }
00094 else
00095 if(is_supported_complex_double<eT>::value == true)
00096 {
00097 typedef std::complex<double> T;
00098 zgemv_(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);
00099 }
00100
00101 }
00102
00103
00104
00105 template<typename eT>
00106 inline
00107 void
00108 gemm_(const char* transA, const char* transB, const int* m, const int* n, const int* k, const eT* alpha, const eT* A, const int* ldA, const eT* B, const int* ldB, const eT* beta, eT* C, const int* ldC)
00109 {
00110 arma_type_check<is_supported_blas_type<eT>::value == false>::apply();
00111
00112 if(is_float<eT>::value == true)
00113 {
00114 typedef float T;
00115 sgemm_(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);
00116 }
00117 else
00118 if(is_double<eT>::value == true)
00119 {
00120 typedef double T;
00121 dgemm_(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);
00122 }
00123 else
00124 if(is_supported_complex_float<eT>::value == true)
00125 {
00126 typedef std::complex<float> T;
00127 cgemm_(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);
00128 }
00129 else
00130 if(is_supported_complex_double<eT>::value == true)
00131 {
00132 typedef std::complex<double> T;
00133 zgemm_(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);
00134 }
00135
00136 }
00137
00138 }
00139
00140 #endif