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_base);
98  assert(this->m_pos > 0 && this->m_pos <= NN);
99 
100 #if defined(GATHER_INTRINSICS)
101  GATHER_IDX_LOAD(vi, this->m_idx);
102  err.slurpIn(this->m_base, vi, D(), this->m_pos);
103  par.slurpIn(this->m_base + m_off_param, vi, D(), this->m_pos);
104 #else
105  err.slurpIn(this->m_base, this->m_idx, this->m_pos);
106  par.slurpIn(this->m_base + m_off_param, this->m_idx, this->m_pos);
107 #endif
108  }
109  };
110 
111  //==============================================================================
112  // MatriplexTrackPackerPlexify
113  //==============================================================================
114 
115  template <typename T, typename D>
116  class MatriplexTrackPackerPlexify // : public MatriplexTrackPackerBase
117  {
118  public:
120 
121  void reset() {}
122 
123  void addNullInput() {}
124 
125  void addInput(const T& item) {}
126 
127  void addInputAt(int pos, const T& item) {}
128 
129  template <typename TMerr, typename TMpar>
130  void pack(TMerr& err, TMpar& par) {}
131  };
132 
133  //==============================================================================
134  // Packer Selection
135  //==============================================================================
136 
137  // Optionally ifdef with defines from Makefile.config
138 
141 
143 } // namespace mkfit
144 
145 #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:48
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)