33 #include <cudnn_backend.h> 68 uint64_t workSpaceSize = 0;
69 auto status = cudnnBackendGetAttribute(
pointer->get_backend_descriptor(),
70 CUDNN_ATTR_EXECUTION_PLAN_WORKSPACE_SIZE,
75 if (
status != CUDNN_STATUS_SUCCESS) {
78 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 79 "CUDNN_ATTR_EXECUTION_PLAN_WORKSPACE_SIZE Failed");
82 if (workSpaceSize < 0) {
84 this,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute Workspace Size Invalid");
93 ss <<
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR :";
106 auto status = CUDNN_STATUS_SUCCESS;
107 std::stringstream tag{
""};
108 int64_t elemCount = 0, engineId = 0, numKnobs = 0;
111 status = extractedEngine->get_status();
112 std::array<ManagedOpaqueDescriptor, CUDNN_KNOB_TYPE_COUNTS> extractedKnobs{{
nullptr}};
113 if (
status != CUDNN_STATUS_SUCCESS) {
115 this,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnCreate Failed when compute tag");
118 for (
auto &knob : extractedKnobs) {
120 status = knob->get_status();
121 if (
status != CUDNN_STATUS_SUCCESS) {
123 this,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnCreate Failed when compute tag");
127 cudnnBackendDescriptor_t extractedEngine_ = extractedEngine->get_backend_descriptor();
128 std::array<cudnnBackendDescriptor_t, CUDNN_KNOB_TYPE_COUNTS> extractedKnobs_{{
nullptr}};
129 for (
auto i = 0; i < extractedKnobs.size(); i++) {
130 extractedKnobs_[i] = extractedKnobs[i]->get_backend_descriptor();
134 CUDNN_ATTR_ENGINECFG_ENGINE,
135 CUDNN_TYPE_BACKEND_DESCRIPTOR,
139 if (
status != CUDNN_STATUS_SUCCESS) {
142 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 143 "CUDNN_ATTR_ENGINECFG_ENGINE Failed");
145 status = cudnnBackendGetAttribute(
146 extractedEngine_, CUDNN_ATTR_ENGINE_GLOBAL_INDEX, CUDNN_TYPE_INT64, 1, &elemCount, &engineId);
147 if (
status != CUDNN_STATUS_SUCCESS) {
150 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 151 "CUDNN_ATTR_ENGINE_GLOBAL_INDEX Failed");
153 tag <<
"eng" << engineId;
156 CUDNN_ATTR_ENGINECFG_KNOB_CHOICES,
157 CUDNN_TYPE_BACKEND_DESCRIPTOR,
158 CUDNN_KNOB_TYPE_COUNTS,
160 &(extractedKnobs_[0]));
161 if (
status != CUDNN_STATUS_SUCCESS) {
164 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 165 "CUDNN_ATTR_ENGINECFG_KNOB_CHOICES Failed");
167 if (numKnobs > CUDNN_KNOB_TYPE_COUNTS) {
170 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 171 "numKnobs exceed the CUDNN_KNOB_TYPE_COUNTS");
173 for (int64_t idx = 0; idx < numKnobs; ++idx) {
174 const cudnnBackendDescriptor_t &knob = extractedKnobs_[idx];
175 cudnnBackendKnobType_t type = CUDNN_KNOB_TYPE_COUNTS;
177 status = cudnnBackendGetAttribute(
178 knob, CUDNN_ATTR_KNOB_CHOICE_KNOB_TYPE, CUDNN_TYPE_KNOB_TYPE, 1,
nullptr, &type);
179 if (
status != CUDNN_STATUS_SUCCESS) {
182 "computeTag CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 183 "CUDNN_ATTR_KNOB_CHOICE_KNOB_TYPE Failed");
185 status = cudnnBackendGetAttribute(
186 knob, CUDNN_ATTR_KNOB_CHOICE_KNOB_VALUE, CUDNN_TYPE_INT64, 1,
nullptr, &choice);
187 if (
status != CUDNN_STATUS_SUCCESS) {
190 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: GetAttribute " 191 "CUDNN_ATTR_KNOB_CHOICE_KNOB_VALUE Failed");
193 tag <<
"_k" << type <<
"(" << choice <<
")";
220 m_execution_plan.handle = handle_;
226 m_execution_plan.engine_config = engine_config_.get_desc();
227 m_execution_plan.planTag = engine_config_.getTag();
238 m_execution_plan.engine_config = desc;
239 m_execution_plan.planTag = opGraphTag_;
248 if (m_execution_plan.handle ==
nullptr) {
251 CUDNN_STATUS_BAD_PARAM,
252 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: Check and Set the CUDNN_ATTR_EXECUTION_PLAN_HANDLE");
253 return std::move(m_execution_plan);
255 if (m_execution_plan.engine_config ==
nullptr) {
258 CUDNN_STATUS_BAD_PARAM,
259 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: Check and Set the CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG");
260 return std::move(m_execution_plan);
264 auto status = m_execution_plan.initialize_managed_backend_pointer(CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR);
265 if (
status != CUDNN_STATUS_SUCCESS) {
267 &m_execution_plan,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnCreate Failed");
268 return std::move(m_execution_plan);
271 status = cudnnBackendSetAttribute(m_execution_plan.pointer->get_backend_descriptor(),
272 CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG,
273 CUDNN_TYPE_BACKEND_DESCRIPTOR,
275 &(m_execution_plan.engine_config->get_backend_descriptor()));
276 if (
status != CUDNN_STATUS_SUCCESS) {
280 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: SetAttribute CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG Failed");
281 return std::move(m_execution_plan);
283 status = cudnnBackendSetAttribute(m_execution_plan.pointer->get_backend_descriptor(),
284 CUDNN_ATTR_EXECUTION_PLAN_HANDLE,
287 &m_execution_plan.handle);
288 if (
status != CUDNN_STATUS_SUCCESS) {
292 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: SetAttribute CUDNN_ATTR_EXECUTION_PLAN_HANDLE Failed");
293 return std::move(m_execution_plan);
296 status = cudnnBackendFinalize(m_execution_plan.pointer->get_backend_descriptor());
297 if (
status != CUDNN_STATUS_SUCCESS) {
299 &m_execution_plan,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnFinalize Descriptor Failed");
300 return std::move(m_execution_plan);
303 m_execution_plan.computeTag();
305 return std::move(m_execution_plan);
auto setEngineConfig(EngineConfig_v8 const &engine_config_) -> ExecutionPlanBuilder_v8 &
Set engine Config for the Plan.
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)
ExecutionPlan_v8 & operator=(ExecutionPlan_v8 const &)=delete
std::string const & getTag() const
ManagedOpaqueDescriptor get_desc() const
Returns a copy of underlying managed descriptor.
auto setEngineConfig(ManagedOpaqueDescriptor &desc, std::string const &opGraphTag_="") -> ExecutionPlanBuilder_v8 &
Set engine Config for the Plan.
ExecutionPlan_v8 && build()
ExecutionPlan_v8(ExecutionPlan_v8 &&from)
cudnnStatus_t get_status() const
Current status of the descriptor.
auto setHandle(cudnnHandle_t handle_) -> ExecutionPlanBuilder_v8 &
Set engine for the ExecutionPlan_v8.
ExecutionPlan_v8 m_execution_plan
std::shared_ptr< OpaqueBackendPointer > ManagedOpaqueDescriptor
auto setEngineConfig(cudnnBackendDescriptor_t &desc, std::string const &opGraphTag_="") -> ExecutionPlanBuilder_v8 &
std::string describe() const override
Return a string describing the backend Descriptor.
ManagedOpaqueDescriptor engine_config
const char * get_error() const
Diagonistic error message if any.
friend class ExecutionPlanBuilder_v8
ExecutionPlan_v8()=default
~ExecutionPlan_v8()=default
cudnnStatus_t status
Shared pointer of the OpaqueBackendPointer.
ManagedOpaqueDescriptor pointer
auto getWorkspaceSize(void) const -> int64_t
Query the workspace requirement for the given plan.