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  void addNullInput() { m_idx[m_pos++] = 0; }
29 
30  void addInput(const D& item) {
31  // Could issue prefetch requests here.
32 
33  m_idx[m_pos] = &item - m_base;
34 
35  ++m_pos;
36  }
37 
38  void addInputAt(int pos, const D& item) {
39  while (m_pos < pos) {
40  // We might not care about initialization / reset to 0.
41  // Or we could be building an additional mask (on top of N_proc).
42  m_idx[m_pos++] = 0;
43  }
44 
45  addInput(item);
46  }
47 
48  template <typename TM>
49  void pack(TM& mplex, int base_offset) {
50  assert(m_pos > 0 && m_pos <= NN);
51 
52 #if defined(GATHER_INTRINSICS)
53  GATHER_IDX_LOAD(vi, m_idx);
54  mplex.slurpIn(m_base + base_offset, vi, D(), m_pos);
55 #else
56  mplex.slurpIn(m_base + base_offset, m_idx, m_pos);
57 #endif
58  }
59  };
60 
61  //==============================================================================
62  // MatriplexErrParPackerSlurpIn
63  //==============================================================================
64 
65  // T - input class (Track or Hit), D - data type (float)
66 
67  template <typename T, typename D>
70 
71  public:
73  : MatriplexPackerSlurpIn<D>(t ? t->errArray() : nullptr), m_off_param(t ? (t->posArray() - this->m_base) : 0) {}
74 
75  void addInput(const T& item) {
76  // Could issue L1 prefetch requests here.
77 
78  this->m_idx[this->m_pos] = item.errArray() - this->m_base;
79 
80  ++this->m_pos;
81  }
82 
83  void addInputAt(int pos, const T& item) {
84  while (this->m_pos < pos) {
85  // We might not care about initialization / reset to 0.
86  // Or we could be building an additional mask (on top of N_proc).
87  this->m_idx[this->m_pos++] = 0;
88  }
89 
90  addInput(item);
91  }
92 
93  template <typename TMerr, typename TMpar>
94  void pack(TMerr& err, TMpar& par) {
95  assert(this->m_pos > 0 && this->m_pos <= NN);
96 
97 #if defined(GATHER_INTRINSICS)
98  GATHER_IDX_LOAD(vi, this->m_idx);
99  err.slurpIn(this->m_base, vi, D(), this->m_pos);
100  par.slurpIn(this->m_base + m_off_param, vi, D(), this->m_pos);
101 #else
102  err.slurpIn(this->m_base, this->m_idx, this->m_pos);
103  par.slurpIn(this->m_base + m_off_param, this->m_idx, this->m_pos);
104 #endif
105  }
106  };
107 
108  //==============================================================================
109  // MatriplexTrackPackerPlexify
110  //==============================================================================
111 
112  template <typename T, typename D>
113  class MatriplexTrackPackerPlexify // : public MatriplexTrackPackerBase
114  {
115  public:
117 
118  void reset() {}
119 
120  void addNullInput() {}
121 
122  void addInput(const T& item) {}
123 
124  void addInputAt(int pos, const T& item) {}
125 
126  template <typename TMerr, typename TMpar>
127  void pack(TMerr& err, TMpar& par) {}
128  };
129 
130  //==============================================================================
131  // Packer Selection
132  //==============================================================================
133 
134  // Optionally ifdef with defines from Makefile.config
135 
138 
140 } // namespace mkfit
141 
142 #endif
void addInput(const D &item)
base
Main Program
Definition: newFWLiteAna.py:92
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)