DiFfRG
Loading...
Searching...
No Matches
tex_linear_interpolation_1D_stack.hh
Go to the documentation of this file.
1#pragma once
2
3// DiFfRG
7
8// standard library
9#include <memory>
10
11// external libraries
12#include <autodiff/forward/real.hpp>
13
14namespace DiFfRG
15{
22 template <typename NT, typename Coordinates, uint max_stack_size = 64> class TexLinearInterpolator1DStack
23 {
24 static_assert(Coordinates::dim == 2, "TexLinearInterpolator1DStack requires 2D coordinates");
25
26 public:
33 TexLinearInterpolator1DStack(const std::vector<NT> &data, const Coordinates &coordinates);
40 TexLinearInterpolator1DStack(const NT *data, const Coordinates &coordinates);
47
48 template <typename Coordinates2>
49 TexLinearInterpolator1DStack(const Coordinates2 &coordinates, const uint m_start, const uint m_end, const double T)
50 : TexLinearInterpolator1DStack(Coordinates(coordinates, m_start, m_end, T))
51 {
52 }
59
61
62 template <typename NT2> void update(const NT2 *data)
63 {
64 if (!owner) throw std::runtime_error("Cannot update data of non-owner interpolator");
65
66 if constexpr (std::is_same_v<NT2, autodiff::real>)
67 for (uint s = 0; s < stack_size; ++s)
68 for (uint i = 0; i < p_size; ++i) {
69 m_data[s][i] = static_cast<float>(val(data[s * p_size + i]));
70 m_data_AD[s][i] = static_cast<float>(derivative(data[s * p_size + i]));
71 }
72 else
73 for (uint s = 0; s < stack_size; ++s)
74 for (uint i = 0; i < p_size; ++i)
75 m_data[s][i] = static_cast<float>(data[s * p_size + i]);
76
77 update();
78 }
79 void update();
80
81 float *data(const uint i) const;
82 float *data_AD(const uint i) const;
83
85
92 __device__ __host__ ReturnType operator()(const float m, const float p) const
93 {
94 auto [m_idx, p_idx] = coordinates.backward(m, p);
95#ifdef __CUDA_ARCH__
96 if constexpr (std::is_same_v<ReturnType, autodiff::real>)
97 return std::array<double, 2>{tex1D<float>(texture[m_idx], p_idx + 0.5),
98 tex1D<float>(texture_AD[m_idx], p_idx + 0.5)};
99 else if constexpr (std::is_same_v<ReturnType, float>)
100 return tex1D<float>(texture[m_idx], p_idx + 0.5);
101#else
102 p_idx = std::max(static_cast<decltype(p_idx)>(0.), std::min(p_idx, static_cast<decltype(p_idx)>(p_size - 1)));
103 if constexpr (std::is_same_v<ReturnType, autodiff::real>)
104 return std::array<double, 2>{{m_data[m_idx][uint(std::floor(p_idx))] * (1.f - p_idx + std::floor(p_idx)) +
105 m_data[m_idx][uint(std::ceil(p_idx))] * (p_idx - std::floor(p_idx)),
106 m_data_AD[m_idx][uint(std::floor(p_idx))] * (1.f - p_idx + std::floor(p_idx)) +
107 m_data_AD[m_idx][uint(std::ceil(p_idx))] * (p_idx - std::floor(p_idx))}};
108 else if constexpr (std::is_same_v<ReturnType, float>)
109 return m_data[m_idx][uint(std::floor(p_idx))] * (1.f - p_idx + std::floor(p_idx)) +
110 m_data[m_idx][uint(std::ceil(p_idx))] * (p_idx - std::floor(p_idx));
111#endif
112 }
113
115 const ReturnType &operator[](const uint i) const;
116
122 const Coordinates &get_coordinates() const { return coordinates; }
123
124 private:
126 const Coordinates coordinates;
127
128 std::vector<std::shared_ptr<float[]>> m_data;
129 std::vector<cudaArray_t> device_array;
130 cudaTextureObject_t texture[max_stack_size];
131
132 std::vector<std::shared_ptr<float[]>> m_data_AD;
133 std::vector<cudaArray_t> device_array_AD;
134 cudaTextureObject_t texture_AD[max_stack_size];
135
136 const bool owner;
137 };
138} // namespace DiFfRG
A linear interpolator for 1D data, using texture memory on the GPU and floating point arithmetic on t...
Definition tex_linear_interpolation_1D_stack.hh:23
const Coordinates & get_coordinates() const
Get the coordinate system of the data.
Definition tex_linear_interpolation_1D_stack.hh:122
const uint p_size
Definition tex_linear_interpolation_1D_stack.hh:125
const uint stack_size
Definition tex_linear_interpolation_1D_stack.hh:125
TexLinearInterpolator1DStack(const std::vector< NT > &data, const Coordinates &coordinates)
Construct a TexLinearInterpolator1D object from a vector of data and a coordinate system.
ReturnType & operator[](const uint i)
cudaTextureObject_t texture[max_stack_size]
Definition tex_linear_interpolation_1D_stack.hh:130
typename internal::__TLITypes< NT >::ReturnType ReturnType
Definition tex_linear_interpolation_1D_stack.hh:84
std::vector< cudaArray_t > device_array
Definition tex_linear_interpolation_1D_stack.hh:129
TexLinearInterpolator1DStack(const Coordinates &coordinates)
Construct a TexLinearInterpolator1D with internal, zeroed data and a coordinate system.
__device__ __host__ ReturnType operator()(const float m, const float p) const
Interpolate the data at a given point.
Definition tex_linear_interpolation_1D_stack.hh:92
void update(const NT2 *data)
Definition tex_linear_interpolation_1D_stack.hh:62
std::vector< std::shared_ptr< float[]> > m_data
Definition tex_linear_interpolation_1D_stack.hh:128
float * data(const uint i) const
const bool owner
Definition tex_linear_interpolation_1D_stack.hh:136
std::vector< cudaArray_t > device_array_AD
Definition tex_linear_interpolation_1D_stack.hh:133
std::vector< std::shared_ptr< float[]> > m_data_AD
Definition tex_linear_interpolation_1D_stack.hh:132
const ReturnType & operator[](const uint i) const
TexLinearInterpolator1DStack(const TexLinearInterpolator1DStack &other)
Construct a copy of a TexLinearInterpolator1D object.
TexLinearInterpolator1DStack(const Coordinates2 &coordinates, const uint m_start, const uint m_end, const double T)
Definition tex_linear_interpolation_1D_stack.hh:49
cudaTextureObject_t texture_AD[max_stack_size]
Definition tex_linear_interpolation_1D_stack.hh:134
float * data_AD(const uint i) const
TexLinearInterpolator1DStack(const NT *data, const Coordinates &coordinates)
Construct a TexLinearInterpolator1D object from a pointer to data and a coordinate system.
const Coordinates coordinates
Definition tex_linear_interpolation_1D_stack.hh:126
Definition complex_math.hh:14
unsigned int uint
Definition utils.hh:22
Definition common.hh:10