cursor_pseudo_dot.hpp
来自「矩阵运算源码最新版本」· HPP 代码 · 共 88 行
HPP
88 行
// Software License for MTL// // Copyright (c) 2007 The Trustees of Indiana University. All rights reserved.// Authors: Peter Gottschling and Andrew Lumsdaine// // This file is part of the Matrix Template Library// // See also license.mtl.txt in the distribution.#ifndef MTL_CURSOR_PSEUDO_DOT_INCLUDE#define MTL_CURSOR_PSEUDO_DOT_INCLUDEnamespace mtl {namespace functor { template <unsigned MaxDepth, typename Value, typename Cursor1, typename Prop1, typename Cursor2, typename Prop2, unsigned Depth> struct cursor_pseudo_dot_block { static unsigned const offset= MaxDepth - Depth; void operator() (Cursor1 i1, Prop1& prop1, Cursor2 i2, Prop2& prop2, Value& s0, Value& s1, Value& s2, Value& s3, Value& s4, Value& s5, Value& s6, Value& s7) { Cursor1 tmp1(i1); tmp1+= offset; Cursor2 tmp2(i2); tmp2+= offset; s0+= prop1(*tmp1) * prop2(*tmp2); // s0+= prop1(i1 + offset) * prop2(i2 + offset); typedef cursor_pseudo_dot_block<MaxDepth, Value, Cursor1, Prop1, Cursor2, Prop2, Depth-1> block_rest; block_rest() (i1, prop1, i2, prop2, s1, s2, s3, s4, s5, s6, s7, s0); } }; //template <> template <unsigned MaxDepth, typename Value, typename Cursor1, typename Prop1, typename Cursor2, typename Prop2> struct cursor_pseudo_dot_block<MaxDepth, Value, Cursor1, Prop1, Cursor2, Prop2, 1> { static unsigned const offset= MaxDepth - 1; void operator() (Cursor1 i1, Prop1& prop1, Cursor2 i2, Prop2& prop2, Value& s0, Value&, Value&, Value&, Value&, Value&, Value&, Value&) { s0+= prop1(*(i1 + offset)) * prop2(*(i2 + offset)); } }; template <unsigned MaxDepth, typename Value, typename Cursor1, typename Prop1, typename Cursor2, typename Prop2> struct cursor_pseudo_dot_t { Value operator() (Cursor1 i1, Cursor1 end1, Prop1& prop1, Cursor2 i2, Prop2& prop2) { using math::zero; Value ref, my_zero(zero(ref)), s0= my_zero, s1= my_zero, s2= my_zero, s3= my_zero, s4= my_zero, s5= my_zero, s6= my_zero, s7= my_zero; std::size_t size= end1 - i1, blocks= size / MaxDepth, blocked_size= blocks * MaxDepth; typedef cursor_pseudo_dot_block<MaxDepth, Value, Cursor1, Prop1, Cursor2, Prop2, MaxDepth> dot_block_type; for (unsigned i= 0; i < blocked_size; i+= MaxDepth, i1+= MaxDepth, i2+= MaxDepth) { dot_block_type()(i1, prop1, i2, prop2, s0, s1, s2, s3, s4, s5, s6, s7); } typedef cursor_pseudo_dot_block<MaxDepth, Value, Cursor1, Prop1, Cursor2, Prop2, MaxDepth> dot_single_type; s0+= s1 + s2 + s3 + s4 + s5 + s6 + s7; for (unsigned i= blocked_size; i < size; ++i, ++i1, ++i2) dot_single_type()(i1, prop1, i2, prop2, s0, s1, s2, s3, s4, s5, s6, s7); return s0; } }; } // namespace functor template <unsigned MaxDepth, typename Value, typename Cursor1, typename Prop1, typename Cursor2, typename Prop2>Value cursor_pseudo_dot(Cursor1 i1, Cursor1 end1, Prop1 prop1, Cursor2 i2, Prop2 prop2, Value){ return functor::cursor_pseudo_dot_t<MaxDepth, Value, Cursor1, Prop1, Cursor2, Prop2>()(i1, end1, prop1, i2, prop2);}} // namespace mtl#endif // MTL_CURSOR_PSEUDO_DOT_INCLUDE
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?