34 #include <cudnn_backend.h> 64 Knob(cudnnBackendKnobType_t type_, int64_t max, int64_t min, int64_t stride_)
73 ss <<
" Stride: " <<
stride;
87 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 (std::uint32_t 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");
224 std::vector<Knob>
const &
230 bool is_knob_set =
false;
231 for (
auto i = 0; i <
numKnobs; i++) {
253 m_engine.opGraph = opGraph_.get_desc();
254 m_engine.opGraphTag = opGraph_.getTag();
261 m_engine.opGraph = desc_;
276 if (m_engine.idx < 0) {
279 CUDNN_STATUS_BAD_PARAM,
280 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: Check and Set the CUDNN_ATTR_ENGINE_GLOBAL_INDEX to valid value");
281 return std::move(m_engine);
283 if (m_engine.opGraph ==
nullptr) {
286 CUDNN_STATUS_BAD_PARAM,
287 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: Check and Set CUDNN_ATTR_ENGINE_OPERATION_GRAPH to valid value");
288 return std::move(m_engine);
292 auto status = m_engine.initialize_managed_backend_pointer(CUDNN_BACKEND_ENGINE_DESCRIPTOR);
293 if (
status != CUDNN_STATUS_SUCCESS) {
295 &m_engine,
status,
"CUDNN_BACKEND_ENGINE_DESCRIPTOR: cudnnCreate Descriptor Failed");
296 return std::move(m_engine);
299 status = cudnnBackendSetAttribute(m_engine.pointer->get_backend_descriptor(),
300 CUDNN_ATTR_ENGINE_OPERATION_GRAPH,
301 CUDNN_TYPE_BACKEND_DESCRIPTOR,
303 &(m_engine.opGraph->get_backend_descriptor()));
304 if (
status != CUDNN_STATUS_SUCCESS) {
308 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: SetAttribute CUDNN_ATTR_ENGINE_OPERATION_GRAPH Failed");
309 return std::move(m_engine);
312 status = cudnnBackendSetAttribute(m_engine.pointer->get_backend_descriptor(),
313 CUDNN_ATTR_ENGINE_GLOBAL_INDEX,
317 if (
status != CUDNN_STATUS_SUCCESS) {
321 "CUDNN_BACKEND_ENGINE_DESCRIPTOR: SetAttribute CUDNN_ATTR_ENGINE_GLOBAL_INDEX Failed");
322 return std::move(m_engine);
326 status = cudnnBackendFinalize(m_engine.pointer->get_backend_descriptor());
327 if (
status != CUDNN_STATUS_SUCCESS) {
329 return std::move(m_engine);
332 getLogger() <<
"[cudnn_frontend] " << m_engine << std::endl;
333 return std::move(m_engine);
int64_t choice
Choice set by the user.
Engine_v8 & operator=(Engine_v8 const &)=delete
auto setOperationGraph(ManagedOpaqueDescriptor desc_) -> EngineBuilder_v8 &
Set operationGraph for the engine.
ConditionalStreamer & getLogger()
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)
cudnnBackendKnobType_t getKnobType() const
auto setGlobalEngineIdx(int64_t idx_) -> EngineBuilder_v8 &
Set engine index for the engine.
friend class EngineBuilder_v8
int64_t getStride() const
std::string const & getTag() const
int64_t idx
Global Index of the engine for the given operationGraph.
static ManagedOpaqueDescriptor make_shared_backend_pointer(cudnnBackendDescriptorType_t type)
int64_t getMinValue() const
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.
auto setOperationGraph(OperationGraph_v8 const &opGraph_) -> EngineBuilder_v8 &
Set operationGraph for the engine.
int64_t getMaxValue() const
int64_t getChoice() const
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.