33 #include <cudnn_backend.h> 68 std::int64_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 (std::uint32_t 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();
234 m_execution_plan.engine_config = desc;
235 m_execution_plan.planTag = opGraphTag_;
244 if (m_execution_plan.handle ==
nullptr) {
247 CUDNN_STATUS_BAD_PARAM,
248 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: Check and Set the CUDNN_ATTR_EXECUTION_PLAN_HANDLE");
249 return std::move(m_execution_plan);
251 if (m_execution_plan.engine_config ==
nullptr) {
254 CUDNN_STATUS_BAD_PARAM,
255 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: Check and Set the CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG");
256 return std::move(m_execution_plan);
260 auto status = m_execution_plan.initialize_managed_backend_pointer(CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR);
261 if (
status != CUDNN_STATUS_SUCCESS) {
263 &m_execution_plan,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnCreate Failed");
264 return std::move(m_execution_plan);
267 status = cudnnBackendSetAttribute(m_execution_plan.pointer->get_backend_descriptor(),
268 CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG,
269 CUDNN_TYPE_BACKEND_DESCRIPTOR,
271 &(m_execution_plan.engine_config->get_backend_descriptor()));
272 if (
status != CUDNN_STATUS_SUCCESS) {
276 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: SetAttribute CUDNN_ATTR_EXECUTION_PLAN_ENGINE_CONFIG Failed");
277 return std::move(m_execution_plan);
279 status = cudnnBackendSetAttribute(m_execution_plan.pointer->get_backend_descriptor(),
280 CUDNN_ATTR_EXECUTION_PLAN_HANDLE,
283 &m_execution_plan.handle);
284 if (
status != CUDNN_STATUS_SUCCESS) {
288 "CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: SetAttribute CUDNN_ATTR_EXECUTION_PLAN_HANDLE Failed");
289 return std::move(m_execution_plan);
292 status = cudnnBackendFinalize(m_execution_plan.pointer->get_backend_descriptor());
293 if (
status != CUDNN_STATUS_SUCCESS) {
295 &m_execution_plan,
status,
"CUDNN_BACKEND_EXECUTION_PLAN_DESCRIPTOR: cudnnFinalize Descriptor Failed");
296 return std::move(m_execution_plan);
299 m_execution_plan.computeTag();
301 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
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.