00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifdef ARMA_USE_BLAS
00017
00018
00019 namespace blas
00020 {
00021 extern "C"
00022 {
00023 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);
00024 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);
00025 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);
00026 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);
00027
00028 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);
00029 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);
00030 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);
00031 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);
00032
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 template<typename eT>
00070 inline
00071 void
00072 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)
00073 {
00074 arma_type_check<is_supported_blas_type<eT>::value == false>::apply();
00075
00076 if(is_float<eT>::value == true)
00077 {
00078 typedef float T;
00079 sgemv_(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);
00080 }
00081 else
00082 if(is_double<eT>::value == true)
00083 {
00084 typedef double T;
00085 dgemv_(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);
00086 }
00087 else
00088 if(is_supported_complex_float<eT>::value == true)
00089 {
00090 typedef std::complex<float> T;
00091 cgemv_(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);
00092 }
00093 else
00094 if(is_supported_complex_double<eT>::value == true)
00095 {
00096 typedef std::complex<double> T;
00097 zgemv_(transA, m, n, (const T*)alpha, (const T*)A, ldA, (const T*)x, incx, (const T*)beta, (T*)y, incy);
00098 }
00099
00100 }
00101
00102
00103
00104 template<typename eT>
00105 inline
00106 void
00107 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)
00108 {
00109 arma_type_check<is_supported_blas_type<eT>::value == false>::apply();
00110
00111 if(is_float<eT>::value == true)
00112 {
00113 typedef float T;
00114 sgemm_(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);
00115 }
00116 else
00117 if(is_double<eT>::value == true)
00118 {
00119 typedef double T;
00120 dgemm_(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);
00121 }
00122 else
00123 if(is_supported_complex_float<eT>::value == true)
00124 {
00125 typedef std::complex<float> T;
00126 cgemm_(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);
00127 }
00128 else
00129 if(is_supported_complex_double<eT>::value == true)
00130 {
00131 typedef std::complex<double> T;
00132 zgemm_(transA, transB, m, n, k, (const T*)alpha, (const T*)A, ldA, (const T*)B, ldB, (const T*)beta, (T*)C, ldC);
00133 }
00134
00135 }
00136
00137 }
00138
00139 #endif