33 #include <cudnn_backend.h> 61 ss <<
"CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR :" 62 <<
" Datatype: " << std::to_string(
data_type) <<
" Mode: " << std::to_string(
mode)
63 <<
" Num Dimensions: " << std::to_string(
nDims);
65 std::for_each(std::begin(
padLower), std::end(
padLower), [&ss, sep](
int x)
mutable {
69 ss <<
" ] PadUpper [";
70 std::for_each(std::begin(
padUpper), std::end(
padUpper), [&ss, sep](
int x)
mutable {
74 ss <<
" ] Dilation [";
75 std::for_each(std::begin(
dilation), std::end(
dilation), [&ss, sep](
int x)
mutable {
80 std::for_each(std::begin(
stride), std::end(
stride), [&ss, sep](
int x)
mutable {
93 std::copy(std::begin(from.padLower), std::end(from.padLower),
padLower);
94 std::copy(std::begin(from.padUpper), std::end(from.padUpper),
padUpper);
95 std::copy(std::begin(from.dilation), std::end(from.dilation),
dilation);
96 std::copy(std::begin(from.stride), std::end(from.stride),
stride);
108 cudnnConvolutionMode_t
mode = CUDNN_CONVOLUTION;
113 int64_t
stride[CUDNN_DIM_MAX + 1] = {-1};
128 m_convDesc.data_type = data_type_;
134 std::copy(padding, padding + ndims, m_convDesc.padLower);
140 std::copy(padding, padding + ndims, m_convDesc.padUpper);
152 std::copy(strides, strides + ndims, m_convDesc.stride);
158 m_convDesc.nDims = nDims_;
164 m_convDesc.mode = mode_;
174 if (m_convDesc.nDims <= 0) {
177 CUDNN_STATUS_BAD_PARAM,
178 "CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: Check and Set the CUDNN_ATTR_CONVOLUTION_SPATIAL_DIMS field");
179 return std::move(m_convDesc);
181 if (m_convDesc.stride[0] <= 0) {
184 CUDNN_STATUS_BAD_PARAM,
185 "CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: Check and Set the CUDNN_ATTR_CONVOLUTION_FILTER_STRIDES field");
186 return std::move(m_convDesc);
190 auto status = m_convDesc.initialize_managed_backend_pointer(CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR);
191 if (
status != CUDNN_STATUS_SUCCESS) {
193 &m_convDesc,
status,
"CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: Bad descriptor created");
194 return std::move(m_convDesc);
197 if (
status != CUDNN_STATUS_SUCCESS) {
199 &m_convDesc,
status,
"CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: cudnnCreate Failed");
200 return std::move(m_convDesc);
204 status = cudnnBackendSetAttribute(m_convDesc.pointer->get_backend_descriptor(),
205 CUDNN_ATTR_CONVOLUTION_COMP_TYPE,
206 CUDNN_TYPE_DATA_TYPE,
208 &m_convDesc.data_type);
209 if (
status != CUDNN_STATUS_SUCCESS) {
213 "CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: SetAttribute CUDNN_ATTR_CONVOLUTION_COMP_TYPE Failed");
214 return std::move(m_convDesc);
217 status = cudnnBackendSetAttribute(m_convDesc.pointer->get_backend_descriptor(),
218 CUDNN_ATTR_CONVOLUTION_CONV_MODE,
219 CUDNN_TYPE_CONVOLUTION_MODE,
222 if (
status != CUDNN_STATUS_SUCCESS) {
226 "CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: SetAttribute CUDNN_ATTR_CONVOLUTION_CONV_MODE Failed");
227 return std::move(m_convDesc);
230 status = cudnnBackendSetAttribute(m_convDesc.pointer->get_backend_descriptor(),
231 CUDNN_ATTR_CONVOLUTION_SPATIAL_DIMS,
235 if (
status != CUDNN_STATUS_SUCCESS) {
239 "CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: SetAttribute CUDNN_ATTR_CONVOLUTION_SPATIAL_DIMS Failed");
240 return std::move(m_convDesc);
243 status = cudnnBackendSetAttribute(m_convDesc.pointer->get_backend_descriptor(),
244 CUDNN_ATTR_CONVOLUTION_PRE_PADDINGS,
247 m_convDesc.padLower);
248 if (
status != CUDNN_STATUS_SUCCESS) {
252 "CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: SetAttribute CUDNN_ATTR_CONVOLUTION_PRE_PADDINGS Failed");
253 return std::move(m_convDesc);
256 status = cudnnBackendSetAttribute(m_convDesc.pointer->get_backend_descriptor(),
257 CUDNN_ATTR_CONVOLUTION_POST_PADDINGS,
260 m_convDesc.padUpper);
261 if (
status != CUDNN_STATUS_SUCCESS) {
265 "CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: SetAttribute CUDNN_ATTR_CONVOLUTION_POST_PADDINGS Failed");
266 return std::move(m_convDesc);
269 status = cudnnBackendSetAttribute(m_convDesc.pointer->get_backend_descriptor(),
270 CUDNN_ATTR_CONVOLUTION_DILATIONS,
273 m_convDesc.dilation);
274 if (
status != CUDNN_STATUS_SUCCESS) {
278 "CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: SetAttribute CUDNN_ATTR_CONVOLUTION_DILATIONS Failed");
279 return std::move(m_convDesc);
282 status = cudnnBackendSetAttribute(m_convDesc.pointer->get_backend_descriptor(),
283 CUDNN_ATTR_CONVOLUTION_FILTER_STRIDES,
287 if (
status != CUDNN_STATUS_SUCCESS) {
291 "CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: SetAttribute CUDNN_ATTR_CONVOLUTION_FILTER_STRIDES Failed");
292 return std::move(m_convDesc);
296 status = cudnnBackendFinalize(m_convDesc.pointer->get_backend_descriptor());
297 if (
status != CUDNN_STATUS_SUCCESS) {
299 &m_convDesc,
status,
"CUDNN_BACKEND_CONVOLUTION_DESCRIPTOR: cudnnFinalize Failed");
300 return std::move(m_convDesc);
303 return std::move(m_convDesc);
int64_t padUpper[CUDNN_DIM_MAX+1]
n, g, c, d, h, w
static void set_error_and_throw_exception(BackendDescriptor const *desc, cudnnStatus_t status, const char *message)
ManagedOpaqueDescriptor get_desc() const
Returns a copy of underlying managed descriptor.
int64_t dilation[CUDNN_DIM_MAX+1]
n, g, c, d, h, w
int64_t nDims
Convolution vs cross correlation.
auto setNDims(int64_t nDims_) -> ConvDescBuilder_v8 &
Set Num Spatial Dimensions of the convolution Operation.
auto setPrePadding(int64_t ndims, int64_t const *padding) -> ConvDescBuilder_v8 &
Set Padding Lower of the convDesc.
ConvDesc_v8(ConvDesc_v8 &&from)
cudnnStatus_t get_status() const
Current status of the descriptor.
auto setDilation(int64_t ndims, int64_t const *dilation) -> ConvDescBuilder_v8 &
Set Dilation of the convDesc.
auto setMathMode(cudnnConvolutionMode_t mode_) -> ConvDescBuilder_v8 &
Set Convolution Mode of the convolution Operation.
int64_t stride[CUDNN_DIM_MAX+1]
n, g, c, d, h, w
ConvDesc_v8 & operator=(ConvDesc_v8 const &)=delete
auto setStrides(int64_t ndims, int64_t const *strides) -> ConvDescBuilder_v8 &
Set Strides of the convDesc.
const char * get_error() const
Diagonistic error message if any.
auto setPostPadding(int64_t ndims, int64_t const *padding) -> ConvDescBuilder_v8 &
Set Padding Upper of the convDesc.
int64_t padLower[CUDNN_DIM_MAX+1]
number of dimensions
std::string describe() const override
Return a string describing the backend Descriptor.
auto setDataType(cudnnDataType_t data_type_) -> ConvDescBuilder_v8 &
Set Datatype for the Convolution Operation.
cudnnConvolutionMode_t mode
Convolution operation data type.
cudnnDataType_t data_type
cudnnStatus_t status
Shared pointer of the OpaqueBackendPointer.
friend class ConvDescBuilder_v8