CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
4.7 KiB
4.7 KiB
hipDNN Knobs Usage Sample
This sample demonstrates how to use hipDNN's engine configuration knobs system.
What are Knobs?
Knobs are runtime-configurable parameters that control engine behavior, performance tuning, and feature selection. They allow you to:
- Enable/disable features (e.g., benchmarking mode)
- Tune performance parameters (e.g., workspace size limits)
- Select algorithmic variants
- Control memory usage
What This Sample Demonstrates
- Querying Available Knobs: How to discover what knobs an engine supports
- Knob Metadata: Understanding knob types, constraints, and default values
- Setting Knob Values: Creating execution plans with custom knob settings
- Knob Validation: Validating settings against knob constraints
- Knob Value Types: Using integer, float, and string knobs
- Real Execution: Running graphs with different knob configurations
Building
The sample is built as part of the hipDNN samples:
cd /path/to/hipdnn/samples/build
cmake ..
make knobs_usage
Running
Basic Usage
./knobs_usage
This runs all demonstrations including actual graph executions.
Skip Execution Examples
To see knob API demonstrations without running graphs:
./knobs_usage --skip-execution
This is faster and useful when you only want to learn about the knob API.
Help
./knobs_usage --help
Sample Output
The sample produces detailed output organized into sections:
=========================================
hipDNN Knobs Usage Sample
=========================================
1. Querying Available Knobs
- Lists all knobs for an engine
- Shows knob metadata (type, description, constraints, defaults)
2. Using Knob Lookup Map
- Demonstrates map-based knob lookup
- Shows how to find specific knobs by ID
3. Using Default Knob Values
- Creates execution plan with defaults
- Demonstrates simplest knob usage
4. Setting Custom Knob Values
- Shows how to set integer knob values
- Demonstrates creating plans with custom settings
5. Knob Validation
- Validates settings against constraints
- Shows both valid and invalid examples
6. Different Knob Value Types
- Integer knobs (int64_t)
- Float knobs (double)
- String knobs
7. Execution with Default Knobs
- Runs actual batchnorm graph with defaults
8. Execution with Benchmarking Enabled
- Runs graph with global.benchmarking=1
Key Code Patterns
Query Available Knobs
std::vector<Knob> knobs;
auto error = graph.get_knobs_for_engine(engineId, knobs);
for (const auto& knob : knobs) {
std::cout << knob.knobId() << ": " << knob.description() << "\n";
}
Set Custom Knob Values
std::vector<KnobSetting> settings;
settings.emplace_back("global.benchmarking", 1);
settings.emplace_back("global.workspace_size_limit", 64 * 1024 * 1024);
auto error = graph.create_execution_plan_ext(engineId, settings);
Validate Knob Settings
KnobSetting setting("global.benchmarking", 1);
auto validationError = knob.validate(setting);
if (validationError.is_good()) {
std::cout << "Valid!\n";
}
Common Knobs
global.benchmarking
- Type: int64
- Default: 0 (disabled)
- Range: 0-1
- Purpose: Enable MIOpen kernel benchmarking for optimal performance
global.workspace_size_limit
- Type: int64
- Default: Maximum
- Range: Dynamic (operation-specific)
- Purpose: Limit workspace memory for convolution operations
- Note: Only available for convolution operations
Related Documentation
For comprehensive information about knobs:
- hipDNN Knobs Documentation - Complete guide with API reference
- HowTo Guide - Quick start guide
- Plugin Development Guide - For plugin authors
- MIOpen Provider Knobs - MIOpen-specific knobs
Notes
- The sample uses a batchnorm operation for demonstration, but knobs work with all operations
- Not all engines support all knobs; always query available knobs first
- Unknown knobs are ignored with a warning (not an error)
- Invalid knob values will cause execution plan creation to fail
- Knobs are set at execution plan creation time, not at execution time
Tips
- Always query first: Use
get_knobs_for_engine()to understand what's available - Check constraints: Look at the constraint object to understand valid ranges
- Use defaults when possible: Only customize knobs when needed
- Handle errors: Always check error return values when setting knobs
- Read the docs: See the comprehensive documentation for advanced usage