46 using descr_type = mkl_dft::descriptor<prec, dom>;
50 : descr_(dimensions), queue_ptr_{}
55 void commit(sycl::queue &q)
57 mkl_dft::precision fft_prec = get_precision();
58 if (fft_prec == mkl_dft::precision::DOUBLE &&
59 !q.get_device().has(sycl::aspect::fp64)) {
60 throw py::value_error(
"Descriptor is double precision but the "
61 "device does not support double precision.");
65 queue_ptr_ = std::make_unique<sycl::queue>(q);
68 descr_type &get_descriptor() {
return descr_; }
70 const sycl::queue &get_queue()
const
76 throw std::runtime_error(
77 "Attempt to get queue when it is not yet set");
82 template <
typename valT = std::
int64_t>
86 descr_.get_value(mkl_dft::config_param::DIMENSION, &dim);
92 template <
typename valT = std::
int64_t>
93 const valT get_number_of_transforms()
95 valT transforms_count{};
97 descr_.get_value(mkl_dft::config_param::NUMBER_OF_TRANSFORMS,
99 return transforms_count;
102 template <
typename valT = std::
int64_t>
103 void set_number_of_transforms(
const valT &num)
105 descr_.set_value(mkl_dft::config_param::NUMBER_OF_TRANSFORMS, num);
109 template <
typename valT = std::vector<std::
int64_t>>
110 const valT get_fwd_strides()
112 const typename valT::value_type dim = get_dim();
114 valT fwd_strides(dim + 1);
115#if defined(USE_ONEMATH)
117 descr_.get_value(mkl_dft::config_param::FWD_STRIDES,
120 descr_.get_value(mkl_dft::config_param::FWD_STRIDES, &fwd_strides);
125 template <
typename valT = std::vector<std::
int64_t>>
126 void set_fwd_strides(
const valT &strides)
128 const typename valT::value_type dim = get_dim();
130 if (
static_cast<size_t>(dim + 1) != strides.size()) {
131 throw py::value_error(
132 "Strides length does not match descriptor's dimension");
134#if defined(USE_ONEMATH)
136 descr_.set_value(mkl_dft::config_param::FWD_STRIDES, strides.data());
138 descr_.set_value(mkl_dft::config_param::FWD_STRIDES, strides);
143 template <
typename valT = std::vector<std::
int64_t>>
144 const valT get_bwd_strides()
146 const typename valT::value_type dim = get_dim();
148 valT bwd_strides(dim + 1);
149#if defined(USE_ONEMATH)
151 descr_.get_value(mkl_dft::config_param::BWD_STRIDES,
154 descr_.get_value(mkl_dft::config_param::BWD_STRIDES, &bwd_strides);
159 template <
typename valT = std::vector<std::
int64_t>>
160 void set_bwd_strides(
const valT &strides)
162 const typename valT::value_type dim = get_dim();
164 if (
static_cast<size_t>(dim + 1) != strides.size()) {
165 throw py::value_error(
166 "Strides length does not match descriptor's dimension");
168#if defined(USE_ONEMATH)
170 descr_.set_value(mkl_dft::config_param::BWD_STRIDES, strides.data());
172 descr_.set_value(mkl_dft::config_param::BWD_STRIDES, strides);
177 template <
typename valT = std::
int64_t>
178 const valT get_fwd_distance()
182 descr_.get_value(mkl_dft::config_param::FWD_DISTANCE, &dist);
186 template <
typename valT = std::
int64_t>
187 void set_fwd_distance(
const valT &dist)
189 descr_.set_value(mkl_dft::config_param::FWD_DISTANCE, dist);
193 template <
typename valT = std::
int64_t>
194 const valT get_bwd_distance()
198 descr_.get_value(mkl_dft::config_param::BWD_DISTANCE, &dist);
202 template <
typename valT = std::
int64_t>
203 void set_bwd_distance(
const valT &dist)
205 descr_.set_value(mkl_dft::config_param::BWD_DISTANCE, dist);
211 mkl_dft::config_value placement;
212 descr_.get_value(mkl_dft::config_param::PLACEMENT, &placement);
213 return (placement == mkl_dft::config_value::INPLACE);
216 void set_in_place(
const bool &in_place_request)
218 descr_.set_value(mkl_dft::config_param::PLACEMENT,
220 ? mkl_dft::config_value::INPLACE
221 : mkl_dft::config_value::NOT_INPLACE);
225 mkl_dft::precision get_precision()
227 mkl_dft::precision fft_prec;
229 descr_.get_value(mkl_dft::config_param::PRECISION, &fft_prec);
236 mkl_dft::config_value committed;
237 descr_.get_value(mkl_dft::config_param::COMMIT_STATUS, &committed);
238 return (committed == mkl_dft::config_value::COMMITTED);
242 mkl_dft::descriptor<prec, dom> descr_;
243 std::unique_ptr<sycl::queue> queue_ptr_;