CMS 3D CMS Logo

eigenSoA.h
Go to the documentation of this file.
1 #ifndef HeterogeneousCore_CUDAUtilities_interface_eigenSoA_h
2 #define HeterogeneousCore_CUDAUtilities_interface_eigenSoA_h
3 
4 #include <algorithm>
5 #include <cmath>
6 #include <cstdint>
7 
8 #include <Eigen/Core>
9 
11 
12 namespace eigenSoA {
13 
14  constexpr bool isPowerOf2(int32_t v) { return v && !(v & (v - 1)); }
15 
16  template <typename T, int S>
17  class alignas(128) ScalarSoA {
18  public:
19  using Scalar = T;
20 
21  __host__ __device__ constexpr Scalar& operator()(int32_t i) { return data_[i]; }
22  __device__ constexpr const Scalar operator()(int32_t i) const { return __ldg(data_ + i); }
23  __host__ __device__ constexpr Scalar& operator[](int32_t i) { return data_[i]; }
24  __device__ constexpr const Scalar operator[](int32_t i) const { return __ldg(data_ + i); }
25 
26  __host__ __device__ constexpr Scalar* data() { return data_; }
27  __host__ __device__ constexpr Scalar const* data() const { return data_; }
28 
29  private:
31  static_assert(isPowerOf2(S), "SoA stride not a power of 2");
32  static_assert(sizeof(data_) % 128 == 0, "SoA size not a multiple of 128");
33  };
34 
35  template <typename M, int S>
36  class alignas(128) MatrixSoA {
37  public:
38  using Scalar = typename M::Scalar;
39  using Map = Eigen::Map<M, 0, Eigen::Stride<M::RowsAtCompileTime * S, S> >;
40  using CMap = Eigen::Map<const M, 0, Eigen::Stride<M::RowsAtCompileTime * S, S> >;
41 
42  __host__ __device__ constexpr Map operator()(int32_t i) { return Map(data_ + i); }
43  __host__ __device__ constexpr CMap operator()(int32_t i) const { return CMap(data_ + i); }
44  __host__ __device__ constexpr Map operator[](int32_t i) { return Map(data_ + i); }
45  __host__ __device__ constexpr CMap operator[](int32_t i) const { return CMap(data_ + i); }
46 
47  private:
48  Scalar data_[S * M::RowsAtCompileTime * M::ColsAtCompileTime];
49  static_assert(isPowerOf2(S), "SoA stride not a power of 2");
50  static_assert(sizeof(data_) % 128 == 0, "SoA size not a multiple of 128");
51  };
52 
53 } // namespace eigenSoA
54 
55 #endif // HeterogeneousCore_CUDAUtilities_interface_eigenSoA_h
eigenSoA::MatrixSoA< Vector15f, S >::Map
Eigen::Map< Vector15f, 0, Eigen::Stride< Vector15f ::RowsAtCompileTime *S, S > > Map
Definition: eigenSoA.h:39
mps_fire.i
i
Definition: mps_fire.py:428
eigenSoA::isPowerOf2
constexpr bool isPowerOf2(int32_t v)
Definition: eigenSoA.h:14
eigenSoA::ScalarSoA
Definition: eigenSoA.h:17
eigenSoA::MatrixSoA::operator()
__host__ constexpr __device__ Map operator()(int32_t i)
Definition: eigenSoA.h:42
findQualityFiles.v
v
Definition: findQualityFiles.py:179
align::Scalar
double Scalar
Definition: Definitions.h:25
eigenSoA::MatrixSoA< Vector15f, S >::CMap
Eigen::Map< const Vector15f, 0, Eigen::Stride< Vector15f ::RowsAtCompileTime *S, S > > CMap
Definition: eigenSoA.h:40
eigenSoA::ScalarSoA::operator[]
constexpr const __device__ Scalar operator[](int32_t i) const
Definition: eigenSoA.h:24
eigenSoA::MatrixSoA::operator[]
__host__ constexpr __device__ Map operator[](int32_t i)
Definition: eigenSoA.h:44
eigenSoA::ScalarSoA::data_
Scalar data_[S]
Definition: eigenSoA.h:30
eigenSoA::MatrixSoA::operator()
__host__ constexpr __device__ CMap operator()(int32_t i) const
Definition: eigenSoA.h:43
S
double S(const TLorentzVector &, const TLorentzVector &)
Definition: Particle.cc:97
eigenSoA::ScalarSoA::operator[]
__host__ constexpr __device__ Scalar & operator[](int32_t i)
Definition: eigenSoA.h:23
eigenSoA::ScalarSoA::operator()
constexpr const __device__ Scalar operator()(int32_t i) const
Definition: eigenSoA.h:22
__device__
#define __device__
Definition: SiPixelGainForHLTonGPU.h:15
eigenSoA::ScalarSoA::operator()
__host__ constexpr __device__ Scalar & operator()(int32_t i)
Definition: eigenSoA.h:21
eigenSoA::ScalarSoA::data
__host__ constexpr __device__ Scalar const * data() const
Definition: eigenSoA.h:27
eigenSoA::MatrixSoA
Definition: eigenSoA.h:36
eigenSoA::MatrixSoA::data_
Scalar data_[S *M::RowsAtCompileTime *M::ColsAtCompileTime]
Definition: eigenSoA.h:48
T
long double T
Definition: Basic3DVectorLD.h:48
eigenSoA::ScalarSoA< uint8_t, S >::Scalar
uint8_t Scalar
Definition: eigenSoA.h:19
eigenSoA::ScalarSoA::data
__host__ constexpr __device__ Scalar * data()
Definition: eigenSoA.h:26
S
Definition: CSCDBL1TPParametersExtended.h:16
cudaCompat.h
eigenSoA
Definition: eigenSoA.h:12
cms::cudacompat::__ldg
T __ldg(T const *x)
Definition: cudaCompat.h:82
eigenSoA::MatrixSoA::operator[]
__host__ constexpr __device__ CMap operator[](int32_t i) const
Definition: eigenSoA.h:45
__host__
#define __host__
Definition: SiPixelGainForHLTonGPU.h:12
eigenSoA::MatrixSoA< Vector15f, S >::Scalar
typename Vector15f ::Scalar Scalar
Definition: eigenSoA.h:38