CMS 3D CMS Logo

MatriplexPackers.h
Go to the documentation of this file.
1 #ifndef RecoTracker_MkFitCore_src_MatriplexPackers_h
2 #define RecoTracker_MkFitCore_src_MatriplexPackers_h
3 
4 #include "Matrix.h"
5 
8 
9 namespace mkfit {
10 
11  //==============================================================================
12  // MatriplexPackerSlurpIn
13  //==============================================================================
14 
15  template <typename D>
17  protected:
18  alignas(64) int m_idx[NN];
19 
20  const D* m_base;
21  int m_pos;
22 
23  public:
25 
26  void reset() { m_pos = 0; }
27 
28  int size() const { return m_pos; }
29 
30  void addNullInput() { m_idx[m_pos++] = 0; }
31 
32  void addInput(const D& item) {
33  // Could issue prefetch requests here.
34 
35  m_idx[m_pos] = &item - m_base;
36 
37  ++m_pos;
38  }
39 
40  void addInputAt(int pos, const D& item) {
41  while (m_pos < pos) {
42  // We might not care about initialization / reset to 0.
43  // Or we could be building an additional mask (on top of N_proc).
44  m_idx[m_pos++] = 0;
45  }
46 
47  addInput(item);
48  }
49 
50  template <typename TM>
51  void pack(TM& mplex, int base_offset) {
52  assert(m_pos > 0 && m_pos <= NN);
53 
54 #if defined(GATHER_INTRINSICS)
55  GATHER_IDX_LOAD(vi, m_idx);
56  mplex.slurpIn(m_base + base_offset, vi, D(), m_pos);
57 #else
58  mplex.slurpIn(m_base + base_offset, m_idx, m_pos);
59 #endif
60  }
61  };
62 
63  //==============================================================================
64  // MatriplexErrParPackerSlurpIn
65  //==============================================================================
66 
67  // T - input class (Track or Hit), D - data type (float)
68 
69  template <typename T, typename D>
72 
73  public:
75  : MatriplexPackerSlurpIn<D>(t ? t->errArray() : nullptr), m_off_param(t ? (t->posArray() - this->m_base) : 0) {}
76 
77  void addInput(const T& item) {
78  // Could issue L1 prefetch requests here.
79 
80  this->m_idx[this->m_pos] = item.errArray() - this->m_base;
81 
82  ++this->m_pos;
83  }
84 
85  void addInputAt(int pos, const T& item) {
86  while (this->m_pos < pos) {
87  // We might not care about initialization / reset to 0.
88  // Or we could be building an additional mask (on top of N_proc).
89  this->m_idx[this->m_pos++] = 0;
90  }
91 
92  addInput(item);
93  }
94 
95  template <typename TMerr, typename TMpar>
96  void pack(TMerr& err, TMpar& par) {
97  assert(this->m_pos > 0 && this->m_pos <= NN);
98 
99 #if defined(GATHER_INTRINSICS)
100  GATHER_IDX_LOAD(vi, this->m_idx);
101  err.slurpIn(this->m_base, vi, D(), this->m_pos);
102  par.slurpIn(this->m_base + m_off_param, vi, D(), this->m_pos);
103 #else
104  err.slurpIn(this->m_base, this->m_idx, this->m_pos);
105  par.slurpIn(this->m_base + m_off_param, this->m_idx, this->m_pos);
106 #endif
107  }
108  };
109 
110  //==============================================================================
111  // MatriplexTrackPackerPlexify
112  //==============================================================================
113 
114  template <typename T, typename D>
115  class MatriplexTrackPackerPlexify // : public MatriplexTrackPackerBase
116  {
117  public:
119 
120  void reset() {}
121 
122  void addNullInput() {}
123 
124  void addInput(const T& item) {}
125 
126  void addInputAt(int pos, const T& item) {}
127 
128  template <typename TMerr, typename TMpar>
129  void pack(TMerr& err, TMpar& par) {}
130  };
131 
132  //==============================================================================
133  // Packer Selection
134  //==============================================================================
135 
136  // Optionally ifdef with defines from Makefile.config
137 
140 
142 } // namespace mkfit
143 
144 #endif
void addInput(const D &item)
void addInputAt(int pos, const T &item)
assert(be >=bs)
void pack(TM &mplex, int base_offset)
constexpr Matriplex::idx_t NN
Definition: Matrix.h:43
void addInputAt(int pos, const D &item)
void pack(TMerr &err, TMpar &par)
void pack(TMerr &err, TMpar &par)
DecomposeProduct< arg, typename Div::arg > D
Definition: Factorize.h:141
long double T
void addInputAt(int pos, const T &item)