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_GEMTM_H
00025 #define TVMET_LOOP_GEMTM_H
00026
00027 namespace tvmet {
00028
00029 namespace loop {
00030
00031
00058 template<std::size_t Rows1, std::size_t Cols1,
00059 std::size_t Cols2>
00060 class gemtm
00061 {
00062 gemtm(const gemtm&);
00063 gemtm& operator=(const gemtm&);
00064
00065 private:
00066 enum {
00067 count = Cols1,
00068 N = (count+7)/8
00069 };
00070
00071 public:
00072 gemtm() { }
00073
00074 public:
00075 template<class E1, class E2>
00076 static inline
00077 typename PromoteTraits<
00078 typename E1::value_type,
00079 typename E2::value_type
00080 >::value_type
00081 prod(const E1& lhs, const E2& rhs, std::size_t i, std::size_t j) {
00082 typename PromoteTraits<
00083 typename E1::value_type,
00084 typename E2::value_type
00085 >::value_type sum(0);
00086 std::size_t k(0);
00087 std::size_t n(N);
00088
00089
00090 switch(count % 8) {
00091 case 0: do { sum += lhs(k, i) * rhs(k, j); ++k;
00092 case 7: sum += lhs(k, i) * rhs(k, j); ++k;
00093 case 6: sum += lhs(k, i) * rhs(k, j); ++k;
00094 case 5: sum += lhs(k, i) * rhs(k, j); ++k;
00095 case 4: sum += lhs(k, i) * rhs(k, j); ++k;
00096 case 3: sum += lhs(k, i) * rhs(k, j); ++k;
00097 case 2: sum += lhs(k, i) * rhs(k, j); ++k;
00098 case 1: sum += lhs(k, i) * rhs(k, j); ++k;
00099 } while(--n != 0);
00100 }
00101
00102 return sum;
00103 }
00104 };
00105
00106
00107 }
00108
00109 }
00110
00111 #endif
00112
00113
00114
00115
00116