GeezerVisonThe World Wide Web, restored to 800 pixels of glory. |
| Home|About|Gaming cabinet|Archives|How it works|Starter sites |
GeezerVison is showing github.com — fool/math_util.cpp at master · DaFuCoding/fool Expand file tree/ Copy pathmath_util.cppMore file actions 126 lines (118 loc) · 2.85 KB / Copy pathmath_util.cppFile metadata and controls126 lines (118 loc) · 2.85 KB 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 #include "block.hpp" #include "math_util.hpp" namespace fool { template<typename Dtype> void fool_set(const int N, const Dtype value, Dtype* Y){ if(value == 0) { memset(Y, 0, N); return; } for(int i=0; i<N; ++i) Y[i] = value; } template void fool_set<int>(const int N, const int value,int* Y); template void fool_set<float>(const int N, const float value, float* Y); template void fool_set<double>(const int N, const double value, double* Y); namespace math{ // General matrix multiplication #ifdef USE_EIGEN_FOR_BLAS template<> void Gemm<float>( const CBLAS_TRANSPOSE TransA, const CBLAS_TRANSPOSE TransB, const int M, const int N, const int K, const float alpha, const float* A, const float* B, const float beta, float* C ){ // Like caffe2/utils/math_cpu.cc auto C_mat = EigenMatrixMap<float>(C, N, M); if (beta == 0) { C_mat.setZero(); } else { C_mat *= beta; } switch (TransA) { case CblasNoTrans: { switch (TransB) { case CblasNoTrans: C_mat.noalias() += alpha * ( ConstEigenMatrixMap<float>(B, N, K) * ConstEigenMatrixMap<float>(A, K, M)); return; case CblasTrans: C_mat.noalias() += alpha * ( ConstEigenMatrixMap<float>(B, K, N).transpose() * ConstEigenMatrixMap<float>(A, K, M)); return; default: LOG(FATAL) << "Unexpected CBLAS_TRANSPOSE for TransB"; } } case CblasTrans: { switch (TransB) { case CblasNoTrans: C_mat.noalias() += alpha * ( ConstEigenMatrixMap<float>(B, N, K) * ConstEigenMatrixMap<float>(A, M, K).transpose()); return; case CblasTrans: C_mat.noalias() += alpha * ( ConstEigenMatrixMap<float>(B, K, N).transpose() * ConstEigenMatrixMap<float>(A, M, K).transpose()); return; default: LOG(FATAL) << "Unexpected CBLAS_TRANSPOSE for TransB"; } } default: LOG(FATAL) << "Unexpected CBLAS_TRANSPOSE for TransA"; } } template<> void Gemv<float>( const CBLAS_TRANSPOSE TransA, const int M, const int N, const float alpha, const float* A, const float* x, const float beta, float* y){ // Like caffe2/utils/math_cpu.cc EigenVectorMap<float> y_vec(y, TransA == CblasNoTrans ? M : N); if (beta == 0) { // In Caffe2 we often do a lazy initialization, which may contain NaNs in // the float values. As a result, if beta is 0, we explicitly do a setzero. y_vec.setZero(); } else { y_vec *= beta; } switch (TransA) { case CblasNoTrans: { y_vec.noalias() += alpha * ( ConstEigenMatrixMap<float>(A, N, M).transpose() * ConstEigenVectorMap<float>(x, N)); return; } case CblasTrans: { y_vec.noalias() += alpha * ( ConstEigenMatrixMap<float>(A, N, M) * ConstEigenVectorMap<float>(x, M)); return; } default: LOG(FATAL) << "Gemv float found an unexpected CBLAS_TRANSPOSE input."; } } template<> void Axpy<float>(){ } #else #endif } // math namespace } // fool namespace |
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |