DiFfRG
Loading...
Searching...
No Matches
tex_linear_interpolation_1D.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> class TexLinearInterpolator1D
23 {
24 static_assert(Coordinates::dim == 1, "TexLinearInterpolator1D requires 1D coordinates");
25
26 static constexpr int max_device_count = 4;
27
28 public:
35 TexLinearInterpolator1D(const std::vector<NT> &data, const Coordinates &coordinates);
42 TexLinearInterpolator1D(const NT *data, const Coordinates &coordinates);
55
57
58 template <typename NT2> void update(const NT2 *data)
59 {
60 if (!owner) throw std::runtime_error("Cannot update data of non-owner interpolator");
61
62 if constexpr (std::is_same_v<NT2, autodiff::real>)
63 for (uint i = 0; i < size; ++i) {
64 m_data[i] = static_cast<float>(val(data[i]));
65 m_data_AD[i] = static_cast<float>(derivative(data[i]));
66 }
67 else
68 for (uint i = 0; i < size; ++i)
69 m_data[i] = static_cast<float>(data[i]);
70
71 update();
72 }
73 void update();
74
75 float *data() const;
76 float *data_AD() const;
77
79
86 __device__ __host__ ReturnType operator()(const float x) const
87 {
88#ifdef __CUDA_ARCH__
89 if constexpr (std::is_same_v<ReturnType, autodiff::real>)
90 return std::array<double, 2>{tex1D<float>(texture[0], coordinates.backward(x) + 0.5f),
91 tex1D<float>(texture_AD[0], coordinates.backward(x) + 0.5f)};
92 else if constexpr (std::is_same_v<ReturnType, float>)
93 return tex1D<float>(texture[0], coordinates.backward(x) + 0.5f);
94#else
95 float idx = coordinates.backward(x);
96 idx = std::max(0.f, std::min(idx, static_cast<float>(size - 1)));
97 if constexpr (std::is_same_v<ReturnType, autodiff::real>)
98 return std::array<double, 2>{{m_data[uint(std::floor(idx))] * (1.f - idx + std::floor(idx)) +
99 m_data[uint(std::ceil(idx))] * (idx - std::floor(idx)),
100 m_data_AD[uint(std::floor(idx))] * (1.f - idx + std::floor(idx)) +
101 m_data_AD[uint(std::ceil(idx))] * (idx - std::floor(idx))}};
102 else if constexpr (std::is_same_v<ReturnType, float>)
103 return m_data[uint(std::floor(idx))] * (1.f - idx + std::floor(idx)) +
104 m_data[uint(std::ceil(idx))] * (idx - std::floor(idx));
105#endif
106 }
107
109 const ReturnType &operator[](const uint i) const;
110
116 const Coordinates &get_coordinates() const { return coordinates; }
117
118 private:
119 const uint size;
120 const Coordinates coordinates;
121
122 std::shared_ptr<float[]> m_data;
123 std::vector<cudaArray_t> device_array;
124 cudaTextureObject_t texture[max_device_count];
125
126 std::shared_ptr<float[]> m_data_AD;
127 std::vector<cudaArray_t> device_array_AD;
128 cudaTextureObject_t texture_AD[max_device_count];
129
130 const bool owner;
132 };
133} // 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.hh:23
std::shared_ptr< float[]> m_data
Definition tex_linear_interpolation_1D.hh:122
TexLinearInterpolator1D(const Coordinates &coordinates)
Construct a TexLinearInterpolator1D with internal, zeroed data and a coordinate system.
TexLinearInterpolator1D(const TexLinearInterpolator1D &other)
Construct a copy of a TexLinearInterpolator1D object.
void update(const NT2 *data)
Definition tex_linear_interpolation_1D.hh:58
const bool owner
Definition tex_linear_interpolation_1D.hh:130
std::vector< cudaArray_t > device_array
Definition tex_linear_interpolation_1D.hh:123
std::vector< cudaArray_t > device_array_AD
Definition tex_linear_interpolation_1D.hh:127
std::shared_ptr< float[]> m_data_AD
Definition tex_linear_interpolation_1D.hh:126
__device__ __host__ ReturnType operator()(const float x) const
Interpolate the data at a given point.
Definition tex_linear_interpolation_1D.hh:86
typename internal::__TLITypes< NT >::ReturnType ReturnType
Definition tex_linear_interpolation_1D.hh:78
ReturnType & operator[](const uint i)
cudaTextureObject_t texture[max_device_count]
Definition tex_linear_interpolation_1D.hh:124
TexLinearInterpolator1D(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.hh:120
cudaTextureObject_t texture_AD[max_device_count]
Definition tex_linear_interpolation_1D.hh:128
TexLinearInterpolator1D(const std::vector< NT > &data, const Coordinates &coordinates)
Construct a TexLinearInterpolator1D object from a vector of data and a coordinate system.
const uint size
Definition tex_linear_interpolation_1D.hh:119
int n_devices
Definition tex_linear_interpolation_1D.hh:131
static constexpr int max_device_count
Definition tex_linear_interpolation_1D.hh:26
const ReturnType & operator[](const uint i) const
const Coordinates & get_coordinates() const
Get the coordinate system of the data.
Definition tex_linear_interpolation_1D.hh:116
Definition complex_math.hh:14
unsigned int uint
Definition utils.hh:22
Definition common.hh:10