00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef TVMET_LOOP_GEMV_H
00025 #define TVMET_LOOP_GEMV_H
00026
00027 namespace tvmet {
00028
00029 namespace loop {
00030
00031
00053 template<std::size_t Rows, std::size_t Cols>
00054 class gemv
00055 {
00056 gemv(const gemv&);
00057 gemv& operator=(const gemv&);
00058
00059 private:
00060 enum {
00061 count = Cols,
00062 N = (count+7)/8
00063 };
00064
00065 public:
00066 gemv() { }
00067
00068 public:
00069 template<class E1, class E2>
00070 static inline
00071 typename PromoteTraits<
00072 typename E1::value_type,
00073 typename E2::value_type
00074 >::value_type
00075 prod(const E1& lhs, const E2& rhs, std::size_t i) {
00076 typename PromoteTraits<
00077 typename E1::value_type,
00078 typename E2::value_type
00079 >::value_type sum(0);
00080 std::size_t j(0);
00081 std::size_t n(N);
00082
00083
00084 switch(count % 8) {
00085 case 0: do { sum += lhs(i, j) * rhs(j); ++j;
00086 case 7: sum += lhs(i, j) * rhs(j); ++j;
00087 case 6: sum += lhs(i, j) * rhs(j); ++j;
00088 case 5: sum += lhs(i, j) * rhs(j); ++j;
00089 case 4: sum += lhs(i, j) * rhs(j); ++j;
00090 case 3: sum += lhs(i, j) * rhs(j); ++j;
00091 case 2: sum += lhs(i, j) * rhs(j); ++j;
00092 case 1: sum += lhs(i, j) * rhs(j); ++j;
00093 } while(--n != 0);
00094 }
00095
00096 return sum;
00097 }
00098 };
00099
00100
00101 }
00102
00103 }
00104
00105 #endif
00106
00107
00108
00109
00110