return all kernel selection error message of specific kernel_name: 1. If target_key not supports target backend, output "Selected wrong Backend ..." 2. If target_key not supports target datatype, output "Selected wrong DataType ..." 3. `target_key` is still not supported, output all kernel keys of corresponding kernel_name: { (CPU, NCHW, [int8, int16, ...]); (GPU, Undefined(AnyLayout), [float32, f
| 582 | // ... |
| 583 | // } |
| 584 | std::string KernelSelectionErrorMessage(const std::string& kernel_name, |
| 585 | const KernelKey& target_key) { |
| 586 | PADDLE_ENFORCE_NE(KernelFactory::Instance().kernels().find(kernel_name), |
| 587 | KernelFactory::Instance().kernels().end(), |
| 588 | common::errors::NotFound( |
| 589 | "The kernel `%s` is not registered.", kernel_name)); |
| 590 | |
| 591 | // Init data structure |
| 592 | bool support_backend = false; |
| 593 | bool support_dtype = false; |
| 594 | std::unordered_map<std::string, std::vector<std::string>> all_kernel_key; |
| 595 | std::unordered_set<std::string> backend_set; |
| 596 | std::unordered_set<std::string> dtype_set; |
| 597 | |
| 598 | // Record all kernel information of kernel_name |
| 599 | for (auto const& iter : KernelFactory::Instance().kernels()[kernel_name]) { |
| 600 | KernelKey kernel_key = iter.first; |
| 601 | if (kernel_key.backend() == target_key.backend()) { |
| 602 | support_backend = true; |
| 603 | if (kernel_key.dtype() == target_key.dtype()) { |
| 604 | support_dtype = true; |
| 605 | } |
| 606 | dtype_set.insert(DataTypeToString(kernel_key.dtype())); |
| 607 | } |
| 608 | backend_set.insert( |
| 609 | paddle::experimental::BackendToString(kernel_key.backend())); |
| 610 | all_kernel_key[paddle::experimental::BackendToString(kernel_key.backend()) + |
| 611 | ", " + common::DataLayoutToString(kernel_key.layout())] |
| 612 | .push_back(DataTypeToString(kernel_key.dtype())); |
| 613 | } |
| 614 | // 1. If target_key not supports target backend, output "Selected wrong |
| 615 | // Backend ..." |
| 616 | if (!support_backend) { |
| 617 | std::string error_message = paddle::string::join_strings(backend_set, ", "); |
| 618 | return "Selected wrong Backend `" + |
| 619 | paddle::experimental::BackendToString(target_key.backend()) + |
| 620 | "`. Paddle support following Backends: " + error_message + "."; |
| 621 | } |
| 622 | // 2. If target_key not supports target datatype, output "Selected wrong |
| 623 | // DataType ..." |
| 624 | if (!support_dtype) { |
| 625 | std::string error_message = paddle::string::join_strings(dtype_set, ", "); |
| 626 | return "Selected wrong DataType `" + DataTypeToString(target_key.dtype()) + |
| 627 | "`. Paddle support following DataTypes: " + error_message + "."; |
| 628 | } |
| 629 | // 3. `target_key` is still not supported, output all kernel keys of |
| 630 | // corresponding kernel_name |
| 631 | std::string message = "Currently, paddle support following kernel keys of `" + |
| 632 | kernel_name + "`: { "; |
| 633 | for (auto& item : all_kernel_key) { |
| 634 | std::vector<std::string>& dtype_vec = item.second; |
| 635 | message += "(" + item.first + ", ["; |
| 636 | message += paddle::string::join_strings(dtype_vec, ", "); |
| 637 | message += "]); "; |
| 638 | } |
| 639 | message += "}."; |
| 640 | return message; |
| 641 | } |
no test coverage detected