34 #include <cudnn_backend.h> 64 Knob(cudnnBackendKnobType_t type_, int64_t max, int64_t min, int64_t stride_)
73 ss <<
" Stride: " <<
stride;
87 const cudnnBackendKnobType_t
108 cudnnBackendKnobType_t
knobType = CUDNN_KNOB_TYPE_COUNTS;
116 std::array<ManagedOpaqueDescriptor, CUDNN_KNOB_TYPE_COUNTS>
bKnobs = {};
124 for (
auto i = 0; i <
numKnobs; i++) {
125 auto bKnob = bKnobs[i]->get_backend_descriptor();
126 cudnnBackendKnobType_t type;
129 cudnnBackendGetAttribute(bKnob, CUDNN_ATTR_KNOB_INFO_TYPE, CUDNN_TYPE_KNOB_TYPE, 1, &elemCount, &type);
130 if (status != CUDNN_STATUS_SUCCESS) {
133 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: CUDNN_BACKEND_KNOB_INFO_DESCRIPTOR " 134 "GetAttribute CUDNN_ATTR_KNOB_INFO_TYPE failed");
136 status = cudnnBackendGetAttribute(
137 bKnob, CUDNN_ATTR_KNOB_INFO_MAXIMUM_VALUE, CUDNN_TYPE_INT64, 1, &elemCount, &maxValue);
138 if (status != CUDNN_STATUS_SUCCESS) {
141 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: CUDNN_BACKEND_KNOB_INFO_DESCRIPTOR " 142 "GetAttribute CUDNN_ATTR_KNOB_INFO_MAXIMUM_VALUE Failed");
144 status = cudnnBackendGetAttribute(
145 bKnob, CUDNN_ATTR_KNOB_INFO_MINIMUM_VALUE, CUDNN_TYPE_INT64, 1, &elemCount, &minValue);
146 if (status != CUDNN_STATUS_SUCCESS) {
149 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: CUDNN_BACKEND_KNOB_INFO_DESCRIPTOR " 150 "GetAttribute CUDNN_ATTR_KNOB_INFO_MINIMUM_VALUE Failed");
153 cudnnBackendGetAttribute(bKnob, CUDNN_ATTR_KNOB_INFO_STRIDE, CUDNN_TYPE_INT64, 1, &elemCount, &stride);
154 if (status != CUDNN_STATUS_SUCCESS) {
157 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: CUDNN_BACKEND_KNOB_INFO_DESCRIPTOR " 158 "GetAttribute CUDNN_ATTR_KNOB_INFO_STRIDE Failed");
160 knobs.emplace_back(
Knob(type, maxValue, minValue, stride));
168 std::stringstream ss;
169 ss <<
"CUDNN_BACKEND_ENGINE_DESCRIPTOR :";
170 ss <<
" ID: " <<
idx;
171 ss <<
" Has " << numKnobs <<
" knobs";
176 opGraph(from.opGraph),
178 opGraphTag(from.opGraphTag) {
180 for (uint64_t i = 0; i < bKnobs.size(); i++) {
182 if (bKnobs[i]->is_good() ==
false) {
183 status = bKnobs[i]->get_status();
187 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: CUDNN_BACKEND_KNOB_INFO_DESCRIPTOR cudnnCreate Failed");
191 std::array<cudnnBackendDescriptor_t, CUDNN_KNOB_TYPE_COUNTS> bKnobs_ =
193 for (
auto i = 0; i < bKnobs.size(); i++) {
194 bKnobs_[i] = bKnobs[i]->get_backend_descriptor();
196 status = cudnnBackendGetAttribute(
pointer->get_backend_descriptor(),
197 CUDNN_ATTR_ENGINE_KNOB_INFO,
198 CUDNN_TYPE_BACKEND_DESCRIPTOR,
199 CUDNN_KNOB_TYPE_COUNTS,
202 if (status != CUDNN_STATUS_SUCCESS) {
204 this, status,
"CUDNN_BACKEND_ENGINE_DESCRIPTOR: GetAttribute CUDNN_ATTR_ENGINE_KNOB_INFO Query Failed");
222 std::vector<Knob>
const &
240 m_engine.opGraph = opGraph_.get_desc();
241 m_engine.opGraphTag = opGraph_.getTag();
253 m_engine.opGraph = desc_;
268 if (m_engine.idx < 0) {
271 CUDNN_STATUS_BAD_PARAM,
272 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: Check and Set the CUDNN_ATTR_ENGINE_GLOBAL_INDEX to valid value");
273 return std::move(m_engine);
275 if (m_engine.opGraph ==
nullptr) {
278 CUDNN_STATUS_BAD_PARAM,
279 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: Check and Set CUDNN_ATTR_ENGINE_OPERATION_GRAPH to valid value");
280 return std::move(m_engine);
284 auto status = m_engine.initialize_managed_backend_pointer(CUDNN_BACKEND_ENGINE_DESCRIPTOR);
285 if (
status != CUDNN_STATUS_SUCCESS) {
287 &m_engine,
status,
"CUDNN_BACKEND_ENGINE_DESCRIPTOR: cudnnCreate Descriptor Failed");
288 return std::move(m_engine);
291 status = cudnnBackendSetAttribute(m_engine.pointer->get_backend_descriptor(),
292 CUDNN_ATTR_ENGINE_OPERATION_GRAPH,
293 CUDNN_TYPE_BACKEND_DESCRIPTOR,
295 &(m_engine.opGraph->get_backend_descriptor()));
296 if (
status != CUDNN_STATUS_SUCCESS) {
300 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: SetAttribute CUDNN_ATTR_ENGINE_OPERATION_GRAPH Failed");
301 return std::move(m_engine);
304 status = cudnnBackendSetAttribute(m_engine.pointer->get_backend_descriptor(),
305 CUDNN_ATTR_ENGINE_GLOBAL_INDEX,
309 if (
status != CUDNN_STATUS_SUCCESS) {
313 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: SetAttribute CUDNN_ATTR_ENGINE_GLOBAL_INDEX Failed");
314 return std::move(m_engine);
318 status = cudnnBackendFinalize(m_engine.pointer->get_backend_descriptor());
319 if (
status != CUDNN_STATUS_SUCCESS) {
321 return std::move(m_engine);
324 return std::move(m_engine);
int64_t choice
Choice set by the user.
Engine_v8 & operator=(Engine_v8 const &)=delete
const int64_t getMaxValue() const
auto setOperationGraph(ManagedOpaqueDescriptor desc_) -> EngineBuilder_v8 &
Set operationGraph for the engine.
int64_t stride
min, max and stride of the knob value
static void set_error_and_throw_exception(BackendDescriptor const *desc, cudnnStatus_t status, const char *message)
const int64_t getMinValue() const
auto setGlobalEngineIdx(int64_t idx_) -> EngineBuilder_v8 &
Set engine index for the engine.
friend class EngineBuilder_v8
const int64_t getStride() const
std::string const & getTag() const
int64_t idx
Global Index of the engine for the given operationGraph.
const int64_t getChoice() const
static ManagedOpaqueDescriptor make_shared_backend_pointer(cudnnBackendDescriptorType_t type)
std::string describe() const
void buildKnobs()
Called from the constructor builds the internal knobs vector.
ManagedOpaqueDescriptor opGraph
ManagedOpaqueDescriptor get_desc() const
Returns a copy of underlying managed descriptor.
cudnnBackendKnobType_t knobType
std::array< ManagedOpaqueDescriptor, CUDNN_KNOB_TYPE_COUNTS > bKnobs
Opaque pointer to the backend knobs.
const cudnnBackendKnobType_t getKnobType() const
auto setOperationGraph(OperationGraph_v8 const &opGraph_) -> EngineBuilder_v8 &
Set operationGraph for the engine.
auto setOperationGraph(cudnnBackendDescriptor_t desc_) -> EngineBuilder_v8 &
Set operationGraph for the engine.
cudnnStatus_t get_status() const
Current status of the descriptor.
std::vector< Knob > const & getFinalizedKnobs() const
Returns a final vector of knobs. Used in EngineConfigBuilder.
std::vector< Knob > & getSupportedKnobs()
Returns a vector of knobs to the user for modification.
std::shared_ptr< OpaqueBackendPointer > ManagedOpaqueDescriptor
std::string describe() const override
Return a string describing the backend Descriptor.
const char * get_error() const
Diagonistic error message if any.
Engine_v8(Engine_v8 &&from)
void setChoice(uint64_t val_)
std::vector< Knob > knobs
Knob(cudnnBackendKnobType_t type_, int64_t max, int64_t min, int64_t stride_)
cudnnStatus_t status
Shared pointer of the OpaqueBackendPointer.
ManagedOpaqueDescriptor pointer
int64_t numKnobs
Count of the backend knobs in the engine.