33 #include <cudnn_backend.h> 73 ss <<
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR : ";
75 ss <<
"numeric_notes:" <<
" ";
78 #if (CUDNN_VERSION >= 8200) 79 ss <<
"behavior_notes:" <<
" ";
80 for (
auto note : behavior_notes)
102 std::array<cudnnBackendNumericalNote_t,CUDNN_NUMERICAL_NOTE_TYPE_COUNT>
const &
107 #if (CUDNN_VERSION >= 8200) 108 std::array<cudnnBackendBehaviorNote_t, CUDNN_BEHAVIOR_NOTE_TYPE_COUNT>
const &
109 getBehaviorNotes()
const {
110 return behavior_notes;
120 auto status = CUDNN_STATUS_SUCCESS;
121 int64_t elem_count = 0;
122 cudnnBackendDescriptor_t extractedEngine_ = extractedEngine->get_backend_descriptor();
123 status = cudnnBackendGetAttribute(extractedEngine_,
124 CUDNN_ATTR_ENGINE_NUMERICAL_NOTE,
125 CUDNN_TYPE_NUMERICAL_NOTE,
126 CUDNN_NUMERICAL_NOTE_TYPE_COUNT,
129 if (
status != CUDNN_STATUS_SUCCESS) {
132 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 133 "CUDNN_ATTR_ENGINE_NUMERICAL_NOTE Failed");
135 #if (CUDNN_VERSION >= 8200) 136 status = cudnnBackendGetAttribute(extractedEngine_,
137 CUDNN_ATTR_ENGINE_BEHAVIOR_NOTE,
138 CUDNN_TYPE_BEHAVIOR_NOTE,
139 CUDNN_BEHAVIOR_NOTE_TYPE_COUNT,
141 behavior_notes.data());
142 if (
status != CUDNN_STATUS_SUCCESS) {
145 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 146 "CUDNN_ATTR_ENGINE_BEHAVIOR_NOTE Failed");
154 auto status = CUDNN_STATUS_SUCCESS;
155 std::stringstream tag{
""};
156 int64_t elemCount = 0, engineId = 0, numKnobs = 0;
158 std::array<ManagedOpaqueDescriptor, CUDNN_KNOB_TYPE_COUNTS> extractedKnobs{{
nullptr}};
159 for (
auto &knob : extractedKnobs) {
161 status = knob->get_status();
162 if (
status != CUDNN_STATUS_SUCCESS) {
164 this,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnCreate Failed when compute tag");
168 cudnnBackendDescriptor_t extractedEngine_ = extractedEngine->get_backend_descriptor();
169 std::array<cudnnBackendDescriptor_t, CUDNN_KNOB_TYPE_COUNTS> extractedKnobs_{{
nullptr}};
170 for (std::uint32_t i = 0; i < extractedKnobs.size(); i++) {
171 extractedKnobs_[i] = extractedKnobs[i]->get_backend_descriptor();
174 status = cudnnBackendGetAttribute(
175 extractedEngine_, CUDNN_ATTR_ENGINE_GLOBAL_INDEX, CUDNN_TYPE_INT64, 1, &elemCount, &engineId);
176 if (
status != CUDNN_STATUS_SUCCESS) {
179 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 180 "CUDNN_ATTR_ENGINE_GLOBAL_INDEX Failed");
182 tag <<
"eng" << engineId;
185 CUDNN_ATTR_ENGINECFG_KNOB_CHOICES,
186 CUDNN_TYPE_BACKEND_DESCRIPTOR,
187 CUDNN_KNOB_TYPE_COUNTS,
189 &(extractedKnobs_[0]));
190 if (
status != CUDNN_STATUS_SUCCESS) {
193 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 194 "CUDNN_ATTR_ENGINECFG_KNOB_CHOICES Failed");
196 if (numKnobs > CUDNN_KNOB_TYPE_COUNTS) {
199 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 200 "numKnobs exceed the CUDNN_KNOB_TYPE_COUNTS");
202 for (int64_t idx = 0; idx < numKnobs; ++idx) {
203 const cudnnBackendDescriptor_t &knob = extractedKnobs_[idx];
204 cudnnBackendKnobType_t
type = CUDNN_KNOB_TYPE_COUNTS;
206 status = cudnnBackendGetAttribute(
207 knob, CUDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, CUDNN_TYPE_KNOB_TYPE, 1,
nullptr, &type);
208 if (
status != CUDNN_STATUS_SUCCESS) {
211 "computeTag CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 212 "CUDNN_ATTR_KNOB_CHOICE_KNOB_TYPE Failed");
214 status = cudnnBackendGetAttribute(
215 knob, CUDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, CUDNN_TYPE_INT64, 1,
nullptr, &choice);
216 if (
status != CUDNN_STATUS_SUCCESS) {
219 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 220 "CUDNN_ATTR_KNOB_CHOICE_KNOB_VALUE Failed");
222 tag <<
"_k" << type <<
"=" << choice;
230 auto status = cudnnBackendGetAttribute(
pointer->get_backend_descriptor(),
231 CUDNN_ATTR_EXECUTION_PLAN_WORKSPACE_SIZE,
236 if (
status != CUDNN_STATUS_SUCCESS) {
239 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 240 "CUDNN_ATTR_EXECUTION_PLAN_WORKSPACE_SIZE Failed");
244 this,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute Workspace Size Invalid");
254 std::array<cudnnBackendNumericalNote_t,CUDNN_NUMERICAL_NOTE_TYPE_COUNT>
numeric_notes;
255 #if (CUDNN_VERSION >= 8200) 256 std::array<cudnnBackendBehaviorNote_t, CUDNN_BEHAVIOR_NOTE_TYPE_COUNT> behavior_notes;
275 m_execution_plan.handle = handle_;
281 m_execution_plan.engine_config = engine_config_.get_desc();
282 m_execution_plan.planTag = engine_config_.getTag();
289 m_execution_plan.engine_config = desc;
290 m_execution_plan.planTag = opGraphTag_;
299 if (m_execution_plan.handle ==
nullptr) {
302 CUDNN_STATUS_BAD_PARAM,
303 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: Check and Set the CUDNN_ATTR_EXECUTION_PLAN_HANDLE");
304 return std::move(m_execution_plan);
306 if (m_execution_plan.engine_config ==
nullptr) {
309 CUDNN_STATUS_BAD_PARAM,
310 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: Check and Set the CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG");
311 return std::move(m_execution_plan);
315 auto status = m_execution_plan.initialize_managed_backend_pointer(CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR);
316 if (
status != CUDNN_STATUS_SUCCESS) {
318 &m_execution_plan,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnCreate Failed");
319 return std::move(m_execution_plan);
322 status = cudnnBackendSetAttribute(m_execution_plan.pointer->get_backend_descriptor(),
323 CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG,
324 CUDNN_TYPE_BACKEND_DESCRIPTOR,
326 &(m_execution_plan.engine_config->get_backend_descriptor()));
327 if (
status != CUDNN_STATUS_SUCCESS) {
331 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: SetAttribute CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG Failed");
332 return std::move(m_execution_plan);
334 status = cudnnBackendSetAttribute(m_execution_plan.pointer->get_backend_descriptor(),
335 CUDNN_ATTR_EXECUTION_PLAN_HANDLE,
338 &m_execution_plan.handle);
339 if (
status != CUDNN_STATUS_SUCCESS) {
343 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: SetAttribute CUDNN_ATTR_EXECUTION_PLAN_HANDLE Failed");
344 return std::move(m_execution_plan);
347 status = cudnnBackendFinalize(m_execution_plan.pointer->get_backend_descriptor());
348 if (
status != CUDNN_STATUS_SUCCESS) {
350 &m_execution_plan,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnFinalize Descriptor Failed");
351 return std::move(m_execution_plan);
355 status = extractedEngine->get_status();
356 if (
status != CUDNN_STATUS_SUCCESS) {
358 &m_execution_plan,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnCreate of CUDNN_BACKEND_ENGINE_DESCRIPTOR failed when compute tag");
359 return std::move(m_execution_plan);
361 cudnnBackendDescriptor_t extractedEngine_ = extractedEngine->get_backend_descriptor();
362 int64_t elemCount = 0;
363 status = cudnnBackendGetAttribute(m_execution_plan.engine_config->get_backend_descriptor(),
364 CUDNN_ATTR_ENGINECFG_ENGINE,
365 CUDNN_TYPE_BACKEND_DESCRIPTOR,
369 if (
status != CUDNN_STATUS_SUCCESS) {
372 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 373 "CUDNN_ATTR_ENGINECFG_ENGINE Failed");
374 return std::move(m_execution_plan);
377 m_execution_plan.buildTag(extractedEngine);
378 m_execution_plan.fetchNotes(extractedEngine);
379 m_execution_plan.computeWorkSpaceSize();
381 getLogger() <<
"[cudnn_frontend] " << m_execution_plan << std::endl;
382 return std::move(m_execution_plan);
auto setEngineConfig(EngineConfig_v8 const &engine_config_) -> ExecutionPlanBuilder_v8 &
Set engine Config for the Plan.
ConditionalStreamer & getLogger()
static void set_error_and_throw_exception(BackendDescriptor const *desc, cudnnStatus_t status, const char *message)
static ManagedOpaqueDescriptor make_shared_backend_pointer(cudnnBackendDescriptorType_t type)
void buildTag(ManagedOpaqueDescriptor &extractedEngine)
std::string const & getTag() const
std::int64_t workSpaceSize
auto setEngineConfig(ManagedOpaqueDescriptor &desc, std::string const &opGraphTag_="") -> ExecutionPlanBuilder_v8 &
Set engine Config for the Plan.
void fetchNotes(ManagedOpaqueDescriptor &extractedEngine)
void computeWorkSpaceSize()
ExecutionPlan_v8 && build()
auto setHandle(cudnnHandle_t handle_) -> ExecutionPlanBuilder_v8 &
Set engine for the ExecutionPlan_v8.
ExecutionPlan_v8 m_execution_plan
std::shared_ptr< OpaqueBackendPointer > ManagedOpaqueDescriptor
std::string describe() const override
Return a string describing the backend Descriptor.
ManagedOpaqueDescriptor engine_config
ExecutionPlan_v8 & operator=(ExecutionPlan_v8 &&)=default
std::array< cudnnBackendNumericalNote_t, CUDNN_NUMERICAL_NOTE_TYPE_COUNT > const & getNumericNotes() const
std::array< cudnnBackendNumericalNote_t, CUDNN_NUMERICAL_NOTE_TYPE_COUNT > numeric_notes
float getExecutionTime() const
friend class ExecutionPlanBuilder_v8
ExecutionPlan_v8()=default
~ExecutionPlan_v8()=default
void setExecutionTime(float time_)
cudnnStatus_t status
Shared pointer of the OpaqueBackendPointer.
ManagedOpaqueDescriptor pointer
auto getWorkspaceSize(void) const -> int64_t
Query the workspace requirement for the given plan.