{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/huggingface-co/2025-11-17-easily-build-and-share-rocm-kernels-with-hugging-face/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "[![Easily Build and Share ROCm Kernels with Hugging Face](https://huggingface.co/blog/assets/build-rocm-kernels/thumbnail.png)](https://huggingface.co/blog/assets/build-rocm-kernels/thumbnail.png)\n\n## Intoduction\n\nCustom kernels are the backbone of high-performance deep learning, enabling GPU operations tailored precisely to your workload; whether that’s image processing, tensor transformations, or other compute-heavy tasks. But compiling these kernels for the right architectures, wiring all the build flags, and integrating them cleanly into PyTorch extensions can quickly become a mess of CMake/Nix, compiler errors, and ABI issues, which is not fun. Hugging Face’s [**kernels**](https://github.com/huggingface/kernels) library makes it easy to build (with [**kernel-builder**](https://github.com/huggingface/kernels/tree/main/kernel-builder)) and share these kernels with the [**kernels-community**](https://huggingface.co/kernels-community), with support for multiple GPU and accelerator backends, including CUDA, ROCm, Metal, and XPU. This ensures your kernels are fast, portable, and seamlessly integrated with PyTorch.\n\nIn this guide, we focus exclusively on ROCm-compatible kernels and show how to build, test, and share them using [kernels](https://github.com/huggingface/kernels/tree/main). You’ll learn how to create kernels that run efficiently on AMD GPUs, along with best practices for reproducibility, packaging, and deployment.\n\nThis ROCm-specific walkthrough is a streamlined version of the original kernel-builder guide. If you’re looking for the broader CUDA-focused version, you can find it here: [A Guide to Building and Scaling Production-Ready CUDA Kernels](https://huggingface.co/blog/kernel-builder).\n\n## Build Steps\n\nWe will use the GEMM kernel from [RadeonFlow\\_Kernels](https://github.com/RadeonFlow/RadeonFlow_Kernels) as an example. If you want to go straight to the guide, [click here](https://huggingface.co/blog/build-rocm-kernels#step-1-project-structure).\n\n### About the kernel\n\n> This section was written by the **RadeonFlow GEMM** kernel authors to introduce the kernel.\\\n> Authors: [ColorsWind](https://huggingface.co/ColorsWind), [Zesen Liu](https://huggingface.co/ftyghome), and [Andy](https://huggingface.co/jpy794)\n\nThe **RadeonFlow GEMM** kernel is a high-performance, FP8 block-wise matrix multiplication implementation optimized for the AMD Instinct MI300X GPU. GEMM (General Matrix Multiplication) is the core building block behind most deep learning workloads: given two matrices A and B, you compute their product C = A × B. Here it’s implemented in FP8, a low-precision floating-point format that trades a bit of accuracy for much higher throughput and lower memory bandwidth. This kernel was developed for the [AMD Developer Challenge 2025](https://www.datamonsters.com/amd-developer-challenge-2025), it was awarded the 🏆 **Grand Prize** in **June 2025**, recognizing its excellence in performance and innovation on AMD hardware.\n\nThe kernel operates on quantized inputs using the `e4m3fnuz` floating-point format and applies per-block scaling to preserve accuracy during low-precision computation. The `e4m3fnuz` format is an FP8 variant with 4 exponent bits and 3 mantissa bits, designed to be efficient for neural network workloads. Because FP8 has a much smaller dynamic range than FP16/FP32, we apply per-block scaling factors (a\\_scale and b\\_scale) so that each block of values is rescaled into a numerically “comfortable” range before and after computation, which helps preserve accuracy despite the low precision. It takes the following arguments:\n\n```\n(a, b, a_scale, b_scale, c)\n```\n\nwhere `a` and `b` are the input matrices, `a_scale` and `b_scale` are the scaling factors for `a` and `b` respectively, and `c` is the output matrix:\n\n- `a` is K × M in e4m3fnuz\n- `b` is K × N in e4m3fnuz\n- `a_scale` is (K // 128) × M in fp32\n- `b_scale` is (K // 128) × (N // 128) in fp32\n- `c` is M × N in bf16\n\nThe kernel is precompiled for specific matrix shapes and assumes a transposed memory layout (as required by the competition). To support additional shapes or alternative memory layouts, you must modify the kernel launcher.\n\nSo now that we have a high-performance ROCm kernel, the natural question is: how do we integrate it into a real PyTorch workflow and share it with others? That’s exactly what we’ll cover next, using `kernels` to structure, build, and publish the ROCm kernel.\n\n> This is a fairly technical guide, but you can still follow it step by step without understanding every detail and everything will work fine. If you’re curious, you can always come back later to dig deeper into the concepts.\n\n### Step 1: Project Structure\n\nThe Hugging Face Kernel Builder expects your files to be organized like this:\n\n```\ngemm/\n├── build.toml\n├── gemm\n│   └── gemm_kernel.h\n├── flake.nix\n└── torch-ext\n    ├── torch_binding.cpp\n    ├── torch_binding.h\n    └── gemm\n        └── __init__.py\n```\n\n- **build.toml**: The project manifest; it’s the brain of the build process.\n- **gemm/**: Your raw CUDA source code where the GPU magic happens.\n- **flake.nix**: The key to a perfectly reproducible build environment.\n- **torch-ext/gemm/**: The Python wrapper for the raw PyTorch operators\n\nSometimes your project might depend on other files, like tests or helper scripts, and you can add them without any issues. In our case, our project will be structured like this:\n\n```\ngemm/\n├── build.toml\n├── gemm\n│   ├── gemm_kernel.h\n│   ├── gemm_kernel_legacy.h\n│   ├── transpose_kernel.h\n│   └── gemm_launcher.hip\n├── include\n│   ├── clangd_workaround.h\n│   ├── gpu_libs.h\n│   ├── gpu_types.h\n│   └── timer.h\n├── src/utils\n│   ├── arithmetic.h\n│   └── timer.hip\n├── tests/checker\n│   ├── checker.cpp\n│   ├── metrics.h\n│   └── checker.h\n├── flake.nix\n└── torch-ext\n    ├── torch_binding.cpp\n    ├── torch_binding.h\n    └── gemm\n        └── __init__.py\n```\n\nIf you look at the original files of the gemm kernel in the RadeonFlow Kernels, they are HIP source files with `.cpp` extensions. As a first step, you need to change these extensions to either .h or .hip depending on their content and usage:\n\n- Use `.h` for header files containing kernel declarations, inline functions, or template code that will be included in other files\n- Use `.hip` for implementation files containing HIP/GPU code that needs to be compiled separately (e.g., kernel launchers, device functions with complex implementations)\n\nIn our example, `gemm_kernel.h`, `gemm_kernel_legacy.h`, and `transpose_kernel.h` are header files, while `gemm_launcher.hip` is a HIP implementation file. This naming convention helps the kernel-builder ([`kernels/builder`](https://github.com/huggingface/kernels/tree/main/kernel-builder)) correctly identify and compile each file type.\n\n### Step 2: Configuration Files Setup\n\n#### The `build.toml` Manifest\n\nThis file orchestrates the entire build. It tells the kernel-builder what to compile and how everything connects.\n\n```toml\n[general]\nname = \"gemm\"\nuniversal = false\n\n[torch]\nsrc = [\n  \"torch-ext/torch_binding.cpp\",\n  \"torch-ext/torch_binding.h\",\n]\n\n[kernel.gemm]\nbackend = \"rocm\"\nrocm-archs = [\n    \"gfx942\",\n]\n\ndepends = [\"torch\"]\n\nsrc = [\n  \"include/clangd_workaround.h\",\n  \"include/gpu_libs.h\",\n  \"include/gpu_types.h\",\n  \"include/timer.h\",\n  \"gemm/gemm_kernel.h\",\n  \"gemm/gemm_kernel_legacy.h\",\n  \"gemm/gemm_launcher.hip\",\n  \"gemm/transpose_kernel.h\",\n  \"src/utils/arithmetic.h\",\n  \"src/utils/timer.hip\",\n  \"tests/checker/metrics.h\",\n]\n\ninclude = [\"include\"]\n```\n\n**general**\n\nThis section contains general project configuration settings.\n\n- **name** (required): The name of your project. This should match your kernel name and will be used for the Python package.\n- **universal** (optional): the kernel is a universal kernel when set to `true`. A universal kernel is a pure Python package (no compiled files). Universal kernels do not use the other sections described below. A good example of a universal kernel is a Triton kernel. Default: `false`\n\n**torch**\n\nThis section describes the Torch extension configuration. It defines the Python bindings that will expose your kernel to PyTorch.\n\n- **src** (required): A list of source files and headers for the PyTorch extension. In our case, this includes the C++ binding files that create the Python interface.\n\n**kernel.gemm**\n\nSpecification of a kernel named \"gemm\". You can define multiple kernel sections in the same build.toml file if you have multiple kernels.\n\n- **backend** (required): The compute backend for the kernel. We use \"rocm\" for AMD GPU support.\n- **rocm-archs** (required for ROCm): A list of ROCm architectures that the kernel should be compiled for. \"gfx942\" targets the MI300 series GPUs.\n- **depends** (required): A list of dependencies. We depend on \"torch\" to use PyTorch's tensor operations.\n- **include** (optional): Include directories relative to the project root. This helps the compiler find header files.\n\n#### The `flake.nix` Reproducibility File\n\nTo ensure anyone can build your kernel on any machine, we use a flake.nix file. It locks the exact version of the kernel-builder and its dependencies. (You can just copy and paste this example and change the description)\n\n```nix\n{\n  description = \"Flake for GEMM kernel\";\n\n  inputs = {\n    kernel-builder.url = \"github:huggingface/kernels\";\n  };\n\n  outputs =\n    {\n      self,\n      kernel-builder,\n    }:\n\n    kernel-builder.lib.genFlakeOutputs {\n      inherit self;\n      path = ./.;\n    };\n}\n```\n\n#### Writing the Kernel\n\nNow for the GPU code. Inside `gemm/gemm_launcher.hip`, we define how the GEMM kernel is launched. Depending on the configuration, we either call the new optimized `gemm/gemm_kernel` or fall back to the legacy implementation (`gemm/gemm_kernel_legacy`).\n\n```c\n// ... previous includes and definitions\nextern \"C\" void run(\n    void *a, void *b, void *as, void *bs, void *c,\n    int m, int n, int k,\n    PerfMetrics *metrics, hipStream_t job_stream0\n) {\n    const __FP8_TYPE *a_ptr = static_cast<const __FP8_TYPE *>(a);\n    const __FP8_TYPE *b_ptr = static_cast<const __FP8_TYPE *>(b);\n    __BF16_TYPE *c_ptr = static_cast<__BF16_TYPE *>(c);\n    const float *as_ptr = static_cast<const float *>(as);\n    const float *bs_ptr = static_cast<const float *>(bs);\n\n    KernelTimerScoped timer(timers, 2LL * m * n * k,\n        metrics ? &metrics->entries[0].time : nullptr,\n        metrics ? &metrics->entries[0].gflops : nullptr, job_stream0);\n\n    // Dispatch GEMM to the fastest available implementation\n    switch (pack_shape(m, n, k)) {\n        DISPATCH_GEMM(1024, 1536, 7168, 256, 128, 128, 4, 2, 512, 4, 16);\n        DISPATCH_GEMM(6144, 7168, 2304, 256, 128, 128, 4, 2, 512, 1, 16);\n        default: {\n            printf(\"Error: Unsupported shape M=%d, K=%d, N=%d\\n\", m, k, n);\n            abort();\n        }\n    }\n}\n// ...\n```\n\n#### Registering a Native PyTorch Operator\n\nThis step is key. We’re not just making the function available in Python; we’re turning it into a native PyTorch operator. That means it becomes a first-class part of PyTorch itself, accessible through `torch.ops`.\n\nThe file `torch-ext/torch_binding.cpp` handles this registration.\n\n```c\n#include <torch/all.h>\n#include <torch/library.h>\n#include <hip/hip_runtime.h>\n\n#include \"registration.h\"\n#include \"torch_binding.h\"\n\n// Forward declaration of the C function from gemm_launcher.hip\nextern \"C\" {\n    struct PerfMetrics;\n    void run(void *a, void *b, void *as, void *bs, void *c, int m, int n, int k, PerfMetrics *metrics, hipStream_t job_stream0);\n}\n\nvoid gemm(torch::Tensor &out, torch::Tensor const &a, torch::Tensor const &b, \n          torch::Tensor const &as, torch::Tensor const &bs) {\n    \n    // Validate tensor properties\n    TORCH_CHECK(a.device().is_cuda(), \"Input tensor a must be on GPU device\");\n    TORCH_CHECK(b.device().is_cuda(), \"Input tensor b must be on GPU device\");\n    TORCH_CHECK(as.device().is_cuda(), \"Scale tensor as must be on GPU device\");\n    TORCH_CHECK(bs.device().is_cuda(), \"Scale tensor bs must be on GPU device\");\n    TORCH_CHECK(out.device().is_cuda(), \"Output tensor out must be on GPU device\");\n    \n    TORCH_CHECK(a.is_contiguous(), \"Input tensor a must be contiguous\");\n    TORCH_CHECK(b.is_contiguous(), \"Input tensor b must be contiguous\");\n    TORCH_CHECK(as.is_contiguous(), \"Scale tensor as must be contiguous\");\n    TORCH_CHECK(bs.is_contiguous(), \"Scale tensor bs must be contiguous\");\n    TORCH_CHECK(out.is_contiguous(), \"Output tensor out must be contiguous\");\n    \n    // Get matrix dimensions from tensor shapes\n    // Assuming a is [M, K], b is [K, N], out is [M, N]\n    int M = a.size(0);\n    int K = a.size(1);\n    int N = b.size(1);\n    \n    TORCH_CHECK(b.size(0) == K, \"Matrix dimensions mismatch: a.size(1) != b.size(0)\");\n    TORCH_CHECK(out.size(0) == M, \"Output tensor dimension mismatch: out.size(0) != M\");\n    TORCH_CHECK(out.size(1) == N, \"Output tensor dimension mismatch: out.size(1) != N\");\n    \n    // Use default HIP stream (stream 0)\n    const hipStream_t stream = 0;\n    \n    // Call the C function\n    run(a.data_ptr(), b.data_ptr(), as.data_ptr(), bs.data_ptr(), out.data_ptr(),\n        M, N, K, nullptr, stream);\n}\n\nTORCH_LIBRARY_EXPAND(TORCH_EXTENSION_NAME, ops) {\n  ops.def(\"gemm(Tensor! out, Tensor a, Tensor b, Tensor a_scale, Tensor b_scale) -> ()\");\n  ops.impl(\"gemm\", torch::kCUDA, &gemm);\n}\n\nREGISTER_EXTENSION(TORCH_EXTENSION_NAME)\n```\n\nThe `torch_binding.h` file contains function declarations. For instance, the `gemm` kernel has the following declaration in `torch_binding.h`:\n\n```h\n#pragma once\n\n#include <torch/torch.h>\n\nvoid gemm(torch::Tensor &out, torch::Tensor const &a, torch::Tensor const &b, \n          torch::Tensor const &as, torch::Tensor const &bs);\n```\n\n#### Setting up the `__init__.py` wrapper\n\nIn `torch-ext/gemm/` we need an `__init__.py` file to make this directory a Python package and to expose our custom operator in a user-friendly way.\n\n```python\nfrom typing import Optional\nimport torch\nfrom ._ops import ops\n\ndef gemm(a: torch.Tensor, b: torch.Tensor, as_: torch.Tensor, bs: torch.Tensor, \n         out: Optional[torch.Tensor] = None) -> torch.Tensor:\n         \n    if out is None:\n        # Create output tensor with appropriate shape and dtype\n        M, K = a.shape\n        K_b, N = b.shape\n        assert K == K_b, f\"Matrix dimension mismatch: A has {K} cols, B has {K_b} rows\"\n        \n        # Output should be BF16 type on the same device as inputs\n        out = torch.empty((M, N), dtype=torch.bfloat16, device=a.device)\n    \n    ops.gemm(out, a, b, as_, bs)\n    return out\n```\n\n### Step 3: Building the Kernel\n\nThe kernel builder uses Nix for building kernels. You can build or run the kernels directly if you have Nix installed on your system. We recommend installing Nix in the following way:\n\n- **Linux**: use the [official Nix installer](https://nixos.org/download/).\n- **macOS**: use the [Determinate Nix installer](https://docs.determinate.systems/determinate-nix/). In addition, Xcode 16.x is currently required to build kernels.\n\n#### Getting Started with Nix\n\nFirst of all, run this:\n\n```bash\nnix flake update\n```\n\nThis generates a `flake.lock` file that pins the kernel builder and all its transitive dependencies. Commit both `flake.nix` and `flake.lock` to your repository to ensure that kernel builds are reproducible.\n\nSince the kernel builder depends on many packages (e.g., every supported PyTorch version), it is recommended to enable the Hugging Face cache to avoid expensive rebuilds:\n\n```bash\n# Install cachix and configure the cache\ncachix use huggingface\n```\n\nOr run it once without installing cachix permanently:\n\n```bash\n# Use cachix without installing it\nnix run nixpkgs#cachix -- use huggingface\n```\n\n#### Building Kernels with Nix\n\nA kernel that has a `flake.nix` file can be built with the build-and-copy command:\n\n```bash\ncd Build_RadeonFlow_Kernels/gemm\nnix build . -L\n```\n\nThe compiled kernel will then be in the local `build/` directory.\n\n#### Development Shell for Local Development\n\nThe kernel-builder provides shells for developing kernels. In such a shell, all required dependencies are available, as well as `build2cmake` for generating project files:\n\n```bash\n$ nix develop\n$ build2cmake generate-torch build.toml\n$ cmake -B build-ext\n$ cmake --build build-ext\n```\n\nIf you want to test the kernel as a Python package, you can do so. `nix develop` will automatically create a virtual environment in `.venv` and activate it:\n\n```bash\n$ nix develop\n$ build2cmake generate-torch build.toml\n$ pip install --no-build-isolation -e .\n```\n\nDevelopment shells are available for every build configuration. For instance, you can get a Torch 2.7 development shell with ROCm 6.3 using:\n\n```bash\n$ rm -rf .venv  # Remove existing venv if any\n$ nix develop .#devShells.torch27-cxx11-rocm63-x86_64-linux\n```\n\n### Step 4: Uploading the kernel to the Hub\n\nNow that we built our kernel, we can test it and upload it to the Hub.\n\n#### Building the Kernel for All PyTorch and ROCm Versions\n\nOne small thing we'll want to do before we share is clean up all of the development artifacts that were generated during the build process to avoid uploading unnecessary files.\n\n```bash\nbuild2cmake clean build.toml \n```\n\nTo build the kernel for all supported versions of PyTorch and ROCm, the kernel-builder tool automates the process:\n\n```bash\n# Outside of the dev shell, run the following command\n# if you are inside of the sandbox you can leave with `exit`\nnix build . -L\n```\n\n> **Note:**\\\n> This process may take a while, as it will build the kernel for all supported versions of PyTorch and ROCm.\\\n> The output will be in the `result` directory.\n\nThe last step is to move the results into the expected build directory (this is where the kernels library will look for them).\n\n```bash\nmkdir -p build\nrsync -av --delete --chmod=Du+w,Fu+w result/ build/\n```\n\n#### Pushing to the Hugging Face Hub\n\nPushing the build artifacts to the Hub will make it straightforward for other developers to use your kernel. We can use the `kernels upload` command for this:\n\n```bash\nkernels upload <path_to_kernel> --repo_id hub-username/img2gray\n```\n\nYou can also follow a standard git-based process for the upload.\n\nFirst, create a new repo:\n\n```bash\nhf repo create gemm\n```\n\n> Make sure you are logged in to the Hugging Face Hub using huggingface-cli login.\n\nNow, in your project directory, connect your project to the new repository and push your code:\n\n```bash\n# Initialize git and connect to the Hugging Face Hub\ngit init\ngit remote add origin https://huggingface.co/<your-username>/gemm\n\n# Pull the changes (just the default .gitattributes file)\ngit pull origin main\ngit xet install\ngit checkout -b main\n\n# Update to use Xet for the binary files\ngit xet track \"*.so\"\n\n# Add and commit your changes (being careful to only include the necessary files\n# since our build2cmake command generated a lot of dev-specific files)\ngit add \\\n  build/ gemm/ include/ src/utils tests/checker \\\n  torch-ext/torch_binding.cpp torch-ext/torch_binding.h torch-ext/gemm \\\n  flake.nix flake.lock build.toml\n\ngit commit -m \"feat: Created a compliant gemm kernel\"\ngit push -u origin main\n```\n\nFantastic! Your kernel is now on the Hugging Face Hub, ready for others to use and fully compliant with the kernels library.\n\n### Step 5: Let's use it :)\n\nWith the **kernels** library, you don't \"install\" the kernel in the traditional sense. You load it directly from its Hub repository, which automatically registers the new operator.\n\n```python\nimport torch\nfrom kernels import get_kernel\n\n# Load the kernel from the Hub\ngemm = get_kernel(\"kernels-community/gemm\")\n\n# Matrix dimensions (must be supported - see gemm_launcher.cpp)\nM, N, K = 1024, 1536, 7168\nQUANT_SIZE = 128\n\n# Setup device\ndevice = torch.device(\"cuda\")\n\n# Create inputs - kernel expects A:(K,M), B:(K,N)\nA_fp32 = torch.randn(M, K, device=device)\nB_fp32 = torch.randn(K, N, device=device)\n\n# Convert to FP8\nA_fp8 = A_fp32.to(torch.float8_e4m3fnuz)\nB_fp8 = B_fp32.to(torch.float8_e4m3fnuz)\n\n# Create scale factors (uniform scaling)\nA_scale = torch.ones(K // QUANT_SIZE, M, device=device, dtype=torch.float32)\nB_scale = torch.ones(K // QUANT_SIZE, N // QUANT_SIZE, device=device, dtype=torch.float32)\n\nC = torch.zeros(M, N, device=device, dtype=torch.bfloat16)\n\n# Use the kernel\nresult = gemm.gemm(A_fp8, B_fp8, A_scale, B_scale, C)\n```\n\nThat's it! Your ROCm kernel is now ready to use from the Hugging Face Hub.\n\n## Conclusion\n\nBuilding and sharing ROCm kernels with the Hugging Face is now easier than ever. With a clean, reproducible workflow powered by Nix and seamless integration into PyTorch, developers can focus on optimizing performance rather than setup. Once built, your custom kernel can be shared on the Hugging Face Hub; making it instantly accessible to the community and usable across projects with just a few lines of code. 🚀\n\n## Related Libraries & Hub\n\n- [kernels](https://github.com/huggingface/kernels) – Library to build, manage and load kernels from the Hub. It contains the [kernel-builder](https://github.com/huggingface/kernels/tree/main/kernel-builder) tooling.\n- [Kernels Community Hub](https://huggingface.co/kernels-community) – Share and discover kernels from the community.\n",
  "authors": [],
  "captured_at": "2026-10-04T12:50:30.804479567+00:00",
  "category": "ai",
  "content_html": "<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/assets/build-rocm-kernels/thumbnail.png\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://huggingface.co/blog/assets/build-rocm-kernels/thumbnail.png\" alt=\"Easily Build and Share ROCm Kernels with Hugging Face\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></a></p>\n<h2>Intoduction</h2>\n<p>Custom kernels are the backbone of high-performance deep learning, enabling GPU operations tailored precisely to your workload; whether that’s image processing, tensor transformations, or other compute-heavy tasks. But compiling these kernels for the right architectures, wiring all the build flags, and integrating them cleanly into PyTorch extensions can quickly become a mess of CMake/Nix, compiler errors, and ABI issues, which is not fun. Hugging Face’s <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/huggingface/kernels\"><strong>kernels</strong></a> library makes it easy to build (with <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/huggingface/kernels/tree/main/kernel-builder\"><strong>kernel-builder</strong></a>) and share these kernels with the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/kernels-community\"><strong>kernels-community</strong></a>, with support for multiple GPU and accelerator backends, including CUDA, ROCm, Metal, and XPU. This ensures your kernels are fast, portable, and seamlessly integrated with PyTorch.</p>\n<p>In this guide, we focus exclusively on ROCm-compatible kernels and show how to build, test, and share them using <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/huggingface/kernels/tree/main\">kernels</a>. You’ll learn how to create kernels that run efficiently on AMD GPUs, along with best practices for reproducibility, packaging, and deployment.</p>\n<p>This ROCm-specific walkthrough is a streamlined version of the original kernel-builder guide. If you’re looking for the broader CUDA-focused version, you can find it here: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/kernel-builder\">A Guide to Building and Scaling Production-Ready CUDA Kernels</a>.</p>\n<h2>Build Steps</h2>\n<p>We will use the GEMM kernel from <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/RadeonFlow/RadeonFlow_Kernels\">RadeonFlow_Kernels</a> as an example. If you want to go straight to the guide, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/blog/build-rocm-kernels#step-1-project-structure\">click here</a>.</p>\n<h3>About the kernel</h3>\n<blockquote>\n<p>This section was written by the <strong>RadeonFlow GEMM</strong> kernel authors to introduce the kernel.<br />\nAuthors: <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ColorsWind\">ColorsWind</a>, <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/ftyghome\">Zesen Liu</a>, and <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/jpy794\">Andy</a></p>\n</blockquote>\n<p>The <strong>RadeonFlow GEMM</strong> kernel is a high-performance, FP8 block-wise matrix multiplication implementation optimized for the AMD Instinct MI300X GPU. GEMM (General Matrix Multiplication) is the core building block behind most deep learning workloads: given two matrices A and B, you compute their product C = A × B. Here it’s implemented in FP8, a low-precision floating-point format that trades a bit of accuracy for much higher throughput and lower memory bandwidth. This kernel was developed for the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://www.datamonsters.com/amd-developer-challenge-2025\">AMD Developer Challenge 2025</a>, it was awarded the 🏆 <strong>Grand Prize</strong> in <strong>June 2025</strong>, recognizing its excellence in performance and innovation on AMD hardware.</p>\n<p>The kernel operates on quantized inputs using the <code>e4m3fnuz</code> floating-point format and applies per-block scaling to preserve accuracy during low-precision computation. The <code>e4m3fnuz</code> format is an FP8 variant with 4 exponent bits and 3 mantissa bits, designed to be efficient for neural network workloads. Because FP8 has a much smaller dynamic range than FP16/FP32, we apply per-block scaling factors (a_scale and b_scale) so that each block of values is rescaled into a numerically “comfortable” range before and after computation, which helps preserve accuracy despite the low precision. It takes the following arguments:</p>\n<pre><code><span class=\"code-snippet\">(a, b, a_scale, b_scale, c)\n</span></code></pre>\n<p>where <code>a</code> and <code>b</code> are the input matrices, <code>a_scale</code> and <code>b_scale</code> are the scaling factors for <code>a</code> and <code>b</code> respectively, and <code>c</code> is the output matrix:</p>\n<ul>\n<li><code>a</code> is K × M in e4m3fnuz</li>\n<li><code>b</code> is K × N in e4m3fnuz</li>\n<li><code>a_scale</code> is (K // 128) × M in fp32</li>\n<li><code>b_scale</code> is (K // 128) × (N // 128) in fp32</li>\n<li><code>c</code> is M × N in bf16</li>\n</ul>\n<p>The kernel is precompiled for specific matrix shapes and assumes a transposed memory layout (as required by the competition). To support additional shapes or alternative memory layouts, you must modify the kernel launcher.</p>\n<p>So now that we have a high-performance ROCm kernel, the natural question is: how do we integrate it into a real PyTorch workflow and share it with others? That’s exactly what we’ll cover next, using <code>kernels</code> to structure, build, and publish the ROCm kernel.</p>\n<blockquote>\n<p>This is a fairly technical guide, but you can still follow it step by step without understanding every detail and everything will work fine. If you’re curious, you can always come back later to dig deeper into the concepts.</p>\n</blockquote>\n<h3>Step 1: Project Structure</h3>\n<p>The Hugging Face Kernel Builder expects your files to be organized like this:</p>\n<pre><code><span class=\"code-snippet\">gemm/\n├── build.toml\n├── gemm\n│   └── gemm_kernel.h\n├── flake.nix\n└── torch-ext\n    ├── torch_binding.cpp\n    ├── torch_binding.h\n    └── gemm\n        └── __init__.py\n</span></code></pre>\n<ul>\n<li><strong>build.toml</strong>: The project manifest; it’s the brain of the build process.</li>\n<li><strong>gemm/</strong>: Your raw CUDA source code where the GPU magic happens.</li>\n<li><strong>flake.nix</strong>: The key to a perfectly reproducible build environment.</li>\n<li><strong>torch-ext/gemm/</strong>: The Python wrapper for the raw PyTorch operators</li>\n</ul>\n<p>Sometimes your project might depend on other files, like tests or helper scripts, and you can add them without any issues. In our case, our project will be structured like this:</p>\n<pre><code><span class=\"code-snippet\">gemm/\n├── build.toml\n├── gemm\n│   ├── gemm_kernel.h\n│   ├── gemm_kernel_legacy.h\n│   ├── transpose_kernel.h\n│   └── gemm_launcher.hip\n├── include\n│   ├── clangd_workaround.h\n│   ├── gpu_libs.h\n│   ├── gpu_types.h\n│   └── timer.h\n├── src/utils\n│   ├── arithmetic.h\n│   └── timer.hip\n├── tests/checker\n│   ├── checker.cpp\n│   ├── metrics.h\n│   └── checker.h\n├── flake.nix\n└── torch-ext\n    ├── torch_binding.cpp\n    ├── torch_binding.h\n    └── gemm\n        └── __init__.py\n</span></code></pre>\n<p>If you look at the original files of the gemm kernel in the RadeonFlow Kernels, they are HIP source files with <code>.cpp</code> extensions. As a first step, you need to change these extensions to either .h or .hip depending on their content and usage:</p>\n<ul>\n<li>Use <code>.h</code> for header files containing kernel declarations, inline functions, or template code that will be included in other files</li>\n<li>Use <code>.hip</code> for implementation files containing HIP/GPU code that needs to be compiled separately (e.g., kernel launchers, device functions with complex implementations)</li>\n</ul>\n<p>In our example, <code>gemm_kernel.h</code>, <code>gemm_kernel_legacy.h</code>, and <code>transpose_kernel.h</code> are header files, while <code>gemm_launcher.hip</code> is a HIP implementation file. This naming convention helps the kernel-builder (<a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/huggingface/kernels/tree/main/kernel-builder\"><code>kernels/builder</code></a>) correctly identify and compile each file type.</p>\n<h3>Step 2: Configuration Files Setup</h3>\n<h4>The <code>build.toml</code> Manifest</h4>\n<p>This file orchestrates the entire build. It tells the kernel-builder what to compile and how everything connects.</p>\n<pre><code class=\"language-toml\"><span class=\"code-snippet\" data-language=\"TOML\">[general]\nname = &quot;gemm&quot;\nuniversal = false\n\n[torch]\nsrc = [\n  &quot;torch-ext/torch_binding.cpp&quot;,\n  &quot;torch-ext/torch_binding.h&quot;,\n]\n\n[kernel.gemm]\nbackend = &quot;rocm&quot;\nrocm-archs = [\n    &quot;gfx942&quot;,\n]\n\ndepends = [&quot;torch&quot;]\n\nsrc = [\n  &quot;include/clangd_workaround.h&quot;,\n  &quot;include/gpu_libs.h&quot;,\n  &quot;include/gpu_types.h&quot;,\n  &quot;include/timer.h&quot;,\n  &quot;gemm/gemm_kernel.h&quot;,\n  &quot;gemm/gemm_kernel_legacy.h&quot;,\n  &quot;gemm/gemm_launcher.hip&quot;,\n  &quot;gemm/transpose_kernel.h&quot;,\n  &quot;src/utils/arithmetic.h&quot;,\n  &quot;src/utils/timer.hip&quot;,\n  &quot;tests/checker/metrics.h&quot;,\n]\n\ninclude = [&quot;include&quot;]\n</span></code></pre>\n<p><strong>general</strong></p>\n<p>This section contains general project configuration settings.</p>\n<ul>\n<li><strong>name</strong> (required): The name of your project. This should match your kernel name and will be used for the Python package.</li>\n<li><strong>universal</strong> (optional): the kernel is a universal kernel when set to <code>true</code>. A universal kernel is a pure Python package (no compiled files). Universal kernels do not use the other sections described below. A good example of a universal kernel is a Triton kernel. Default: <code>false</code></li>\n</ul>\n<p><strong>torch</strong></p>\n<p>This section describes the Torch extension configuration. It defines the Python bindings that will expose your kernel to PyTorch.</p>\n<ul>\n<li><strong>src</strong> (required): A list of source files and headers for the PyTorch extension. In our case, this includes the C++ binding files that create the Python interface.</li>\n</ul>\n<p><strong>kernel.gemm</strong></p>\n<p>Specification of a kernel named &quot;gemm&quot;. You can define multiple kernel sections in the same build.toml file if you have multiple kernels.</p>\n<ul>\n<li><strong>backend</strong> (required): The compute backend for the kernel. We use &quot;rocm&quot; for AMD GPU support.</li>\n<li><strong>rocm-archs</strong> (required for ROCm): A list of ROCm architectures that the kernel should be compiled for. &quot;gfx942&quot; targets the MI300 series GPUs.</li>\n<li><strong>depends</strong> (required): A list of dependencies. We depend on &quot;torch&quot; to use PyTorch's tensor operations.</li>\n<li><strong>include</strong> (optional): Include directories relative to the project root. This helps the compiler find header files.</li>\n</ul>\n<h4>The <code>flake.nix</code> Reproducibility File</h4>\n<p>To ensure anyone can build your kernel on any machine, we use a flake.nix file. It locks the exact version of the kernel-builder and its dependencies. (You can just copy and paste this example and change the description)</p>\n<pre><code class=\"language-nix\"><span class=\"code-snippet\" data-language=\"Nix\">{\n  description = &quot;Flake for GEMM kernel&quot;;\n\n  inputs = {\n    kernel-builder.url = &quot;github:huggingface/kernels&quot;;\n  };\n\n  outputs =\n    {\n      self,\n      kernel-builder,\n    }:\n\n    kernel-builder.lib.genFlakeOutputs {\n      inherit self;\n      path = ./.;\n    };\n}\n</span></code></pre>\n<h4>Writing the Kernel</h4>\n<p>Now for the GPU code. Inside <code>gemm/gemm_launcher.hip</code>, we define how the GEMM kernel is launched. Depending on the configuration, we either call the new optimized <code>gemm/gemm_kernel</code> or fall back to the legacy implementation (<code>gemm/gemm_kernel_legacy</code>).</p>\n<pre><code class=\"language-c\"><span class=\"code-snippet\" data-language=\"C\"><span class=\"syntax-source syntax-c\"><span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span> ... previous includes and definitions\n</span><span class=\"syntax-storage syntax-modifier syntax-c\">extern</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>C<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span> <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">run</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">\n    <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>a<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>b<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>as<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>bs<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>c<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span>\n    <span class=\"syntax-storage syntax-type syntax-c\">int</span> m<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">int</span> n<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">int</span> k<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span>\n    PerfMetrics <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>metrics<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> hipStream_t job_stream0\n</span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span> <span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c\">{</span>\n    <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> __FP8_TYPE <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>a_ptr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> static_cast<span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span><span class=\"syntax-storage syntax-modifier syntax-c\">const</span> __FP8_TYPE <span class=\"syntax-keyword syntax-operator syntax-c\">*</span><span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span>a<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> __FP8_TYPE <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>b_ptr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> static_cast<span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span><span class=\"syntax-storage syntax-modifier syntax-c\">const</span> __FP8_TYPE <span class=\"syntax-keyword syntax-operator syntax-c\">*</span><span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span>b<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    __BF16_TYPE <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>c_ptr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> static_cast<span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span>__BF16_TYPE <span class=\"syntax-keyword syntax-operator syntax-c\">*</span><span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span>c<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>as_ptr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> static_cast<span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span><span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span><span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span>as<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>bs_ptr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> static_cast<span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span><span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span><span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span>bs<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n\n    KernelTimerScoped <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">timer</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">timers<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">2LL</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> m <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> n <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> k<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span>\n        metrics <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">?</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>metrics<span class=\"syntax-punctuation syntax-accessor syntax-c\">-&gt;</span>entries<span class=\"syntax-meta syntax-brackets syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-c\">[</span><span class=\"syntax-constant syntax-numeric syntax-c\">0</span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-c\">]</span></span><span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-c\">time</span> <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span> nullptr<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span>\n        metrics <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">?</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>metrics<span class=\"syntax-punctuation syntax-accessor syntax-c\">-&gt;</span>entries<span class=\"syntax-meta syntax-brackets syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-c\">[</span><span class=\"syntax-constant syntax-numeric syntax-c\">0</span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-c\">]</span></span><span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-variable syntax-other syntax-member syntax-c\">gflops</span> <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span> nullptr<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> job_stream0</span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n\n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span> Dispatch GEMM to the fastest available implementation\n</span>    <span class=\"syntax-keyword syntax-control syntax-c\">switch</span> <span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">pack_shape</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">m<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> n<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> k</span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c\">{</span>\n        <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">DISPATCH_GEMM</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-constant syntax-numeric syntax-c\">1024</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">1536</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">7168</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">256</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">128</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">128</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">4</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">2</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">512</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">4</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">16</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n        <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">DISPATCH_GEMM</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-constant syntax-numeric syntax-c\">6144</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">7168</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">2304</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">256</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">128</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">128</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">4</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">2</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">512</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">1</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c\">16</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n        <span class=\"syntax-keyword syntax-control syntax-c\">default</span><span class=\"syntax-punctuation syntax-separator syntax-c\">:</span> <span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c\">{</span>\n            <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">printf</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Error: Unsupported shape M=<span class=\"syntax-constant syntax-other syntax-placeholder syntax-c\">%d</span>, K=<span class=\"syntax-constant syntax-other syntax-placeholder syntax-c\">%d</span>, N=<span class=\"syntax-constant syntax-other syntax-placeholder syntax-c\">%d</span><span class=\"syntax-constant syntax-character syntax-escape syntax-c\">\\n</span><span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> m<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> k<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> n</span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n            <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">abort</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n        <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c\">}</span></span>\n    <span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c\">}</span></span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c\">}</span></span>\n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span> ...\n</span></span></span></code></pre>\n<h4>Registering a Native PyTorch Operator</h4>\n<p>This step is key. We’re not just making the function available in Python; we’re turning it into a native PyTorch operator. That means it becomes a first-class part of PyTorch itself, accessible through <code>torch.ops</code>.</p>\n<p>The file <code>torch-ext/torch_binding.cpp</code> handles this registration.</p>\n<pre><code class=\"language-c\"><span class=\"code-snippet\" data-language=\"C\"><span class=\"syntax-source syntax-c\"><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&lt;</span>torch/all.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&lt;</span>torch/library.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&lt;</span>hip/hip_runtime.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&gt;</span></span>\n</span>\n<span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c\">#include</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-include syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>registration.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c\">#include</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-include syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>torch_binding.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span>\n</span>\n<span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span> Forward declaration of the C function from gemm_launcher.hip\n</span><span class=\"syntax-storage syntax-modifier syntax-c\">extern</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>C<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span> <span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c\">{</span>\n    <span class=\"syntax-storage syntax-type syntax-c\">struct</span> PerfMetrics<span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">run</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>a<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>b<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>as<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>bs<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>c<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">int</span> m<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">int</span> n<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">int</span> k<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> PerfMetrics <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>metrics<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> hipStream_t job_stream0</span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c\">}</span></span>\n\n<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-entity syntax-name syntax-function syntax-c\">gemm</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span>Tensor <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c\">out</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span>Tensor <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c\">a</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span>Tensor <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c\">b</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> \n          torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span>Tensor <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c\">as</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span>Tensor <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c\">bs</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c\"> </span><span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-meta syntax-block syntax-c\">\n    \n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span> Validate tensor properties\n</span>    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">a<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">device</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">is_cuda</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Input tensor a must be on GPU device<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">b<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">device</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">is_cuda</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Input tensor b must be on GPU device<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">as<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">device</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">is_cuda</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Scale tensor as must be on GPU device<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">bs<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">device</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">is_cuda</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Scale tensor bs must be on GPU device<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">out<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">device</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">is_cuda</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Output tensor out must be on GPU device<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    \n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">a<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">is_contiguous</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Input tensor a must be contiguous<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">b<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">is_contiguous</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Input tensor b must be contiguous<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">as<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">is_contiguous</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Scale tensor as must be contiguous<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">bs<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">is_contiguous</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Scale tensor bs must be contiguous<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">out<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">is_contiguous</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Output tensor out must be contiguous<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    \n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span> Get matrix dimensions from tensor shapes\n</span>    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span> Assuming a is [M, K], b is [K, N], out is [M, N]\n</span>    <span class=\"syntax-storage syntax-type syntax-c\">int</span> M <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> a<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">size</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-constant syntax-numeric syntax-c\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-storage syntax-type syntax-c\">int</span> K <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> a<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">size</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-constant syntax-numeric syntax-c\">1</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-storage syntax-type syntax-c\">int</span> N <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> b<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">size</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-constant syntax-numeric syntax-c\">1</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    \n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">b<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">size</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-constant syntax-numeric syntax-c\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">==</span> K<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Matrix dimensions mismatch: a.size(1) != b.size(0)<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">out<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">size</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-constant syntax-numeric syntax-c\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">==</span> M<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Output tensor dimension mismatch: out.size(0) != M<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_CHECK</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">out<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">size</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-constant syntax-numeric syntax-c\">1</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">==</span> N<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>Output tensor dimension mismatch: out.size(1) != N<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    \n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span> Use default HIP stream (stream 0)\n</span>    <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> hipStream_t stream <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n    \n    <span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span> Call the C function\n</span>    <span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">run</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">a<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">data_ptr</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> b<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">data_ptr</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> as<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">data_ptr</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> bs<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">data_ptr</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> out<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">data_ptr</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span>\n        M<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> N<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> K<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> nullptr<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> stream</span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c\"><span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c\">}</span></span></span>\n\n<span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">TORCH_LIBRARY_EXPAND</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\">TORCH_EXTENSION_NAME<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> ops</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span> <span class=\"syntax-meta syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c\">{</span>\n  ops<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">def</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>gemm(Tensor! out, Tensor a, Tensor b, Tensor a_scale, Tensor b_scale) -&gt; ()<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n  ops<span class=\"syntax-punctuation syntax-accessor syntax-c\">.</span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-variable syntax-function syntax-c\">impl</span><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-string syntax-quoted syntax-double syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c\">&quot;</span>gemm<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span><span class=\"syntax-constant syntax-other syntax-variable syntax-mac-classic syntax-c\">kCUDA</span><span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>gemm</span></span><span class=\"syntax-meta syntax-function-call syntax-c\"><span class=\"syntax-meta syntax-group syntax-c\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c\">;</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c\">}</span></span>\n\n<span class=\"syntax-meta syntax-assumed-macro syntax-c\"><span class=\"syntax-variable syntax-function syntax-assumed-macro syntax-c\">REGISTER_EXTENSION</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span>TORCH_EXTENSION_NAME<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span>\n</span></span></code></pre>\n<p>The <code>torch_binding.h</code> file contains function declarations. For instance, the <code>gemm</code> kernel has the following declaration in <code>torch_binding.h</code>:</p>\n<pre><code class=\"language-h\"><span class=\"code-snippet\" data-language=\"H\"><span class=\"syntax-source syntax-objc\"><span class=\"syntax-meta syntax-preprocessor syntax-objc\"><span class=\"syntax-keyword syntax-control syntax-import syntax-objc\">#pragma</span> once\n</span>\n<span class=\"syntax-meta syntax-preprocessor syntax-include syntax-objc\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-objc\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-objc\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-objc\">&lt;</span>torch/torch.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-objc\">&gt;</span></span>\n</span>\n<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-function syntax-objc\"><span class=\"syntax-entity syntax-name syntax-function syntax-objc\">gemm</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-objc\"><span class=\"syntax-meta syntax-group syntax-objc\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-objc\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-objc\"><span class=\"syntax-meta syntax-group syntax-objc\">torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span>Tensor <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-objc\">out</span><span class=\"syntax-punctuation syntax-separator syntax-objc\">,</span> torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span>Tensor <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-objc\">a</span><span class=\"syntax-punctuation syntax-separator syntax-objc\">,</span> torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span>Tensor <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-objc\">b</span><span class=\"syntax-punctuation syntax-separator syntax-objc\">,</span> \n          torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span>Tensor <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-objc\">as</span><span class=\"syntax-punctuation syntax-separator syntax-objc\">,</span> torch:<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span>Tensor <span class=\"syntax-storage syntax-modifier syntax-c\">const</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-objc\">bs</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-objc\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-objc\">;</span>\n</span></span></code></pre>\n<h4>Setting up the <code>__init__.py</code> wrapper</h4>\n<p>In <code>torch-ext/gemm/</code> we need an <code>__init__.py</code> file to make this directory a Python package and to expose our custom operator in a user-friendly way.</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">typing</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">Optional</span></span>\n<span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span></span></span>\n<span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-relative syntax-python\">.</span></span><span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">_ops</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">ops</span></span>\n\n<span class=\"syntax-meta syntax-function syntax-python\"><span class=\"syntax-storage syntax-type syntax-function syntax-python\">def</span> <span class=\"syntax-entity syntax-name syntax-function syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">gemm</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-parameters syntax-begin syntax-python\">(</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-variable syntax-parameter syntax-python\">a</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-annotation syntax-python\"><span class=\"syntax-punctuation syntax-separator syntax-annotation syntax-parameter syntax-python\">:</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">Tensor</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-punctuation syntax-separator syntax-parameters syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">b</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-annotation syntax-python\"><span class=\"syntax-punctuation syntax-separator syntax-annotation syntax-parameter syntax-python\">:</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">Tensor</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-punctuation syntax-separator syntax-parameters syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">as_</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-annotation syntax-python\"><span class=\"syntax-punctuation syntax-separator syntax-annotation syntax-parameter syntax-python\">:</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">Tensor</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-punctuation syntax-separator syntax-parameters syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">bs</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-annotation syntax-python\"><span class=\"syntax-punctuation syntax-separator syntax-annotation syntax-parameter syntax-python\">:</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">Tensor</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-punctuation syntax-separator syntax-parameters syntax-python\">,</span> \n         <span class=\"syntax-variable syntax-parameter syntax-python\">out</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-annotation syntax-python\"><span class=\"syntax-punctuation syntax-separator syntax-annotation syntax-parameter syntax-python\">:</span> <span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">Optional</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-python\">[</span></span><span class=\"syntax-meta syntax-item-access syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">Tensor</span></span></span><span class=\"syntax-meta syntax-item-access syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-python\">]</span></span> </span><span class=\"syntax-meta syntax-function syntax-parameters syntax-default-value syntax-python\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-constant syntax-language syntax-python\">None</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-parameters syntax-end syntax-python\">)</span></span><span class=\"syntax-meta syntax-function syntax-python\"> </span><span class=\"syntax-meta syntax-function syntax-annotation syntax-return syntax-python\"><span class=\"syntax-punctuation syntax-separator syntax-annotation syntax-return syntax-python\">-&gt;</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">Tensor</span></span></span><span class=\"syntax-meta syntax-function syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-function syntax-begin syntax-python\">:</span></span>\n         \n    <span class=\"syntax-meta syntax-statement syntax-if syntax-python\"><span class=\"syntax-keyword syntax-control syntax-flow syntax-conditional syntax-python\">if</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">out</span></span> <span class=\"syntax-keyword syntax-operator syntax-logical syntax-python\">is</span> <span class=\"syntax-constant syntax-language syntax-python\">None</span><span class=\"syntax-punctuation syntax-section syntax-block syntax-conditional syntax-python\">:</span></span>\n        <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Create output tensor with appropriate shape and dtype\n</span>        <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">M</span></span>, <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">a</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">shape</span></span>\n        <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K_b</span></span>, <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">N</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">b</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">shape</span></span>\n        <span class=\"syntax-keyword syntax-other syntax-assert syntax-python\">assert</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K</span></span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-python\">==</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K_b</span></span>, <span class=\"syntax-storage syntax-type syntax-string syntax-python\">f</span><span class=\"syntax-meta syntax-string syntax-interpolated syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-interpolated syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">Matrix dimension mismatch: A has </span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-begin syntax-python\">{</span><span class=\"syntax-source syntax-python syntax-embedded\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K</span></span></span></span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-end syntax-python\">}</span></span><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"> cols, B has </span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-begin syntax-python\">{</span><span class=\"syntax-source syntax-python syntax-embedded\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K_b</span></span></span></span><span class=\"syntax-meta syntax-interpolation syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-interpolation syntax-end syntax-python\">}</span></span><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"> rows<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span>\n        \n        <span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Output should be BF16 type on the same device as inputs\n</span>        <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">out</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">empty</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-group syntax-python\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">M</span></span><span class=\"syntax-punctuation syntax-separator syntax-tuple syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">N</span></span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-python\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">dtype</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">bfloat16</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">device</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">a</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">device</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n    \n    <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">ops</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">gemm</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">out</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">a</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">b</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">as_</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">bs</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n    <span class=\"syntax-keyword syntax-control syntax-flow syntax-return syntax-python\">return</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">out</span></span>\n</span></span></code></pre>\n<h3>Step 3: Building the Kernel</h3>\n<p>The kernel builder uses Nix for building kernels. You can build or run the kernels directly if you have Nix installed on your system. We recommend installing Nix in the following way:</p>\n<ul>\n<li><strong>Linux</strong>: use the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://nixos.org/download/\">official Nix installer</a>.</li>\n<li><strong>macOS</strong>: use the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://docs.determinate.systems/determinate-nix/\">Determinate Nix installer</a>. In addition, Xcode 16.x is currently required to build kernels.</li>\n</ul>\n<h4>Getting Started with Nix</h4>\n<p>First of all, run this:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">nix</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> flake update</span>\n</span></span></code></pre>\n<p>This generates a <code>flake.lock</code> file that pins the kernel builder and all its transitive dependencies. Commit both <code>flake.nix</code> and <code>flake.lock</code> to your repository to ensure that kernel builds are reproducible.</p>\n<p>Since the kernel builder depends on many packages (e.g., every supported PyTorch version), it is recommended to enable the Hugging Face cache to avoid expensive rebuilds:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Install cachix and configure the cache</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">cachix</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> use huggingface</span>\n</span></span></code></pre>\n<p>Or run it once without installing cachix permanently:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Use cachix without installing it</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">nix</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> run nixpkgs#cachix<span class=\"syntax-keyword syntax-operator syntax-end-of-options syntax-shell\"> --</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> use huggingface</span>\n</span></span></code></pre>\n<h4>Building Kernels with Nix</h4>\n<p>A kernel that has a <code>flake.nix</code> file can be built with the build-and-copy command:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-support syntax-function syntax-cd syntax-shell\">cd</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> Build_RadeonFlow_Kernels/gemm</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">nix</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> build .<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>L</span></span>\n</span></span></code></pre>\n<p>The compiled kernel will then be in the local <code>build/</code> directory.</p>\n<h4>Development Shell for Local Development</h4>\n<p>The kernel-builder provides shells for developing kernels. In such a shell, all required dependencies are available, as well as <code>build2cmake</code> for generating project files:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> nix develop</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> build2cmake generate-torch build.toml</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> cmake<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>B</span> build-ext</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> cmake<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>build</span> build-ext</span>\n</span></span></code></pre>\n<p>If you want to test the kernel as a Python package, you can do so. <code>nix develop</code> will automatically create a virtual environment in <code>.venv</code> and activate it:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> nix develop</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> build2cmake generate-torch build.toml</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> pip install<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>no-build-isolation</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>e</span> .</span>\n</span></span></code></pre>\n<p>Development shells are available for every build configuration. For instance, you can get a Torch 2.7 development shell with ROCm 6.3 using:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> rm<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>rf</span> .venv  <span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Remove existing venv if any</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span></span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> nix develop .#devShells.torch27-cxx11-rocm63-x86_64-linux</span>\n</span></span></code></pre>\n<h3>Step 4: Uploading the kernel to the Hub</h3>\n<p>Now that we built our kernel, we can test it and upload it to the Hub.</p>\n<h4>Building the Kernel for All PyTorch and ROCm Versions</h4>\n<p>One small thing we'll want to do before we share is clean up all of the development artifacts that were generated during the build process to avoid uploading unnecessary files.</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">build2cmake</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> clean build.toml </span>\n</span></span></code></pre>\n<p>To build the kernel for all supported versions of PyTorch and ROCm, the kernel-builder tool automates the process:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Outside of the dev shell, run the following command</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> if you are inside of the sandbox you can leave with `exit`</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">nix</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> build .<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>L</span></span>\n</span></span></code></pre>\n<blockquote>\n<p><strong>Note:</strong><br />\nThis process may take a while, as it will build the kernel for all supported versions of PyTorch and ROCm.<br />\nThe output will be in the <code>result</code> directory.</p>\n</blockquote>\n<p>The last step is to move the results into the expected build directory (this is where the kernels library will look for them).</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">mkdir</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>p</span> build</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">rsync</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>av</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>delete</span><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>chmod</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-option syntax-shell\">=</span>Du+w,Fu+w result/ build/</span>\n</span></span></code></pre>\n<h4>Pushing to the Hugging Face Hub</h4>\n<p>Pushing the build artifacts to the Hub will make it straightforward for other developers to use your kernel. We can use the <code>kernels upload</code> command for this:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">kernels</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> upload <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&lt;</span>path_to_kernel<span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&gt;</span> <span class=\"syntax-punctuation syntax-terminator syntax-file-descriptor syntax-shell\">-</span>-repo_id hub-username/img2gray</span>\n</span></span></code></pre>\n<p>You can also follow a standard git-based process for the upload.</p>\n<p>First, create a new repo:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">hf</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> repo create gemm</span>\n</span></span></code></pre>\n<blockquote>\n<p>Make sure you are logged in to the Hugging Face Hub using huggingface-cli login.</p>\n</blockquote>\n<p>Now, in your project directory, connect your project to the new repository and push your code:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Initialize git and connect to the Hugging Face Hub</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">git</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> init</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">git</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> remote add origin https://huggingface.co/<span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&lt;</span>your-username<span class=\"syntax-keyword syntax-operator syntax-assignment syntax-redirection syntax-shell\">&gt;</span>/gemm</span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Pull the changes (just the default .gitattributes file)</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">git</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> pull origin main</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">git</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> xet install</span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">git</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> checkout<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>b</span> main</span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Update to use Xet for the binary files</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">git</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> xet track <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>*.so<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> Add and commit your changes (being careful to only include the necessary files</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-begin syntax-shell\">#</span></span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\"> since our build2cmake command generated a lot of dev-specific files)</span><span class=\"syntax-comment syntax-line syntax-number-sign syntax-shell\">\n</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">git</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> add <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span>  build/ gemm/ include/ src/utils tests/checker <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span>  torch-ext/torch_binding.cpp torch-ext/torch_binding.h torch-ext/gemm <span class=\"syntax-punctuation syntax-separator syntax-continuation syntax-line syntax-shell\">\\\n</span>  flake.nix flake.lock build.toml</span>\n\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">git</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> commit<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>m</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&quot;</span>feat: Created a compliant gemm kernel<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&quot;</span></span></span>\n<span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">git</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> push<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>u</span> origin main</span>\n</span></span></code></pre>\n<p>Fantastic! Your kernel is now on the Hugging Face Hub, ready for others to use and fully compliant with the kernels library.</p>\n<h3>Step 5: Let's use it :)</h3>\n<p>With the <strong>kernels</strong> library, you don't &quot;install&quot; the kernel in the traditional sense. You load it directly from its Hub repository, which automatically registers the new operator.</p>\n<pre><code class=\"language-python\"><span class=\"code-snippet\" data-language=\"Python\"><span class=\"syntax-source syntax-python\"><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span></span></span>\n<span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-from syntax-python\">from</span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-meta syntax-import-source syntax-python\"> <span class=\"syntax-meta syntax-import-path syntax-python\"><span class=\"syntax-meta syntax-import-name syntax-python\">kernels</span></span> <span class=\"syntax-meta syntax-statement syntax-import syntax-python\"><span class=\"syntax-keyword syntax-control syntax-import syntax-python\">import</span></span></span></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"></span><span class=\"syntax-meta syntax-statement syntax-import syntax-python\"> <span class=\"syntax-meta syntax-generic-name syntax-python\">get_kernel</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Load the kernel from the Hub\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">gemm</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">get_kernel</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">kernels-community/gemm<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Matrix dimensions (must be supported - see gemm_launcher.cpp)\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">M</span></span>, <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">N</span></span>, <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">1024</span>, <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">1536</span>, <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">7168</span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-other syntax-constant syntax-python\">QUANT_SIZE</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-python\">128</span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Setup device\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">device</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">device</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-python\">&quot;</span></span></span><span class=\"syntax-meta syntax-string syntax-python\"><span class=\"syntax-string syntax-quoted syntax-double syntax-python\">cuda<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-python\">&quot;</span></span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Create inputs - kernel expects A:(K,M), B:(K,N)\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">A_fp32</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">randn</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">M</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">device</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">device</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">B_fp32</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">randn</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">N</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">device</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">device</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Convert to FP8\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">A_fp8</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">A_fp32</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">to</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">float8_e4m3fnuz</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">B_fp8</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">B_fp32</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">to</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">float8_e4m3fnuz</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Create scale factors (uniform scaling)\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">A_scale</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">ones</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">/</span><span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">/</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-other syntax-constant syntax-python\">QUANT_SIZE</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">M</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">device</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">device</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">dtype</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">float32</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">B_scale</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">ones</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">K</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">/</span><span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">/</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-other syntax-constant syntax-python\">QUANT_SIZE</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">N</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">/</span><span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-python\">/</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-other syntax-constant syntax-python\">QUANT_SIZE</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">device</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">device</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">dtype</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">float32</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">C</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">zeros</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">M</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">N</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">device</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">device</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-variable syntax-parameter syntax-python\">dtype</span><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">torch</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span><span class=\"syntax-meta syntax-generic-name syntax-python\">bfloat16</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n\n<span class=\"syntax-comment syntax-line syntax-number-sign syntax-python\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-python\">#</span> Use the kernel\n</span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">result</span></span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-python\">=</span> <span class=\"syntax-meta syntax-function-call syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">gemm</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-python\">.</span></span><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-variable syntax-function syntax-python\">gemm</span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-begin syntax-python\">(</span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-python\"><span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">A_fp8</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">B_fp8</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">A_scale</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">B_scale</span></span><span class=\"syntax-punctuation syntax-separator syntax-arguments syntax-python\">,</span> <span class=\"syntax-meta syntax-qualified-name syntax-python\"><span class=\"syntax-meta syntax-generic-name syntax-python\">C</span></span></span><span class=\"syntax-punctuation syntax-section syntax-arguments syntax-end syntax-python\">)</span></span>\n</span></span></code></pre>\n<p>That's it! Your ROCm kernel is now ready to use from the Hugging Face Hub.</p>\n<h2>Conclusion</h2>\n<p>Building and sharing ROCm kernels with the Hugging Face is now easier than ever. With a clean, reproducible workflow powered by Nix and seamless integration into PyTorch, developers can focus on optimizing performance rather than setup. Once built, your custom kernel can be shared on the Hugging Face Hub; making it instantly accessible to the community and usable across projects with just a few lines of code. 🚀</p>\n<h2>Related Libraries &amp; Hub</h2>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/huggingface/kernels\">kernels</a> – Library to build, manage and load kernels from the Hub. It contains the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/huggingface/kernels/tree/main/kernel-builder\">kernel-builder</a> tooling.</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://huggingface.co/kernels-community\">Kernels Community Hub</a> – Share and discover kernels from the community.</li>\n</ul>\n",
  "content_markdown": "[![Easily Build and Share ROCm Kernels with Hugging Face](https://huggingface.co/blog/assets/build-rocm-kernels/thumbnail.png)](https://huggingface.co/blog/assets/build-rocm-kernels/thumbnail.png)\n\n## Intoduction\n\nCustom kernels are the backbone of high-performance deep learning, enabling GPU operations tailored precisely to your workload; whether that’s image processing, tensor transformations, or other compute-heavy tasks. But compiling these kernels for the right architectures, wiring all the build flags, and integrating them cleanly into PyTorch extensions can quickly become a mess of CMake/Nix, compiler errors, and ABI issues, which is not fun. Hugging Face’s [**kernels**](https://github.com/huggingface/kernels) library makes it easy to build (with [**kernel-builder**](https://github.com/huggingface/kernels/tree/main/kernel-builder)) and share these kernels with the [**kernels-community**](https://huggingface.co/kernels-community), with support for multiple GPU and accelerator backends, including CUDA, ROCm, Metal, and XPU. This ensures your kernels are fast, portable, and seamlessly integrated with PyTorch.\n\nIn this guide, we focus exclusively on ROCm-compatible kernels and show how to build, test, and share them using [kernels](https://github.com/huggingface/kernels/tree/main). You’ll learn how to create kernels that run efficiently on AMD GPUs, along with best practices for reproducibility, packaging, and deployment.\n\nThis ROCm-specific walkthrough is a streamlined version of the original kernel-builder guide. If you’re looking for the broader CUDA-focused version, you can find it here: [A Guide to Building and Scaling Production-Ready CUDA Kernels](https://huggingface.co/blog/kernel-builder).\n\n## Build Steps\n\nWe will use the GEMM kernel from [RadeonFlow\\_Kernels](https://github.com/RadeonFlow/RadeonFlow_Kernels) as an example. If you want to go straight to the guide, [click here](https://huggingface.co/blog/build-rocm-kernels#step-1-project-structure).\n\n### About the kernel\n\n> This section was written by the **RadeonFlow GEMM** kernel authors to introduce the kernel.\\\n> Authors: [ColorsWind](https://huggingface.co/ColorsWind), [Zesen Liu](https://huggingface.co/ftyghome), and [Andy](https://huggingface.co/jpy794)\n\nThe **RadeonFlow GEMM** kernel is a high-performance, FP8 block-wise matrix multiplication implementation optimized for the AMD Instinct MI300X GPU. GEMM (General Matrix Multiplication) is the core building block behind most deep learning workloads: given two matrices A and B, you compute their product C = A × B. Here it’s implemented in FP8, a low-precision floating-point format that trades a bit of accuracy for much higher throughput and lower memory bandwidth. This kernel was developed for the [AMD Developer Challenge 2025](https://www.datamonsters.com/amd-developer-challenge-2025), it was awarded the 🏆 **Grand Prize** in **June 2025**, recognizing its excellence in performance and innovation on AMD hardware.\n\nThe kernel operates on quantized inputs using the `e4m3fnuz` floating-point format and applies per-block scaling to preserve accuracy during low-precision computation. The `e4m3fnuz` format is an FP8 variant with 4 exponent bits and 3 mantissa bits, designed to be efficient for neural network workloads. Because FP8 has a much smaller dynamic range than FP16/FP32, we apply per-block scaling factors (a\\_scale and b\\_scale) so that each block of values is rescaled into a numerically “comfortable” range before and after computation, which helps preserve accuracy despite the low precision. It takes the following arguments:\n\n```\n(a, b, a_scale, b_scale, c)\n```\n\nwhere `a` and `b` are the input matrices, `a_scale` and `b_scale` are the scaling factors for `a` and `b` respectively, and `c` is the output matrix:\n\n- `a` is K × M in e4m3fnuz\n- `b` is K × N in e4m3fnuz\n- `a_scale` is (K // 128) × M in fp32\n- `b_scale` is (K // 128) × (N // 128) in fp32\n- `c` is M × N in bf16\n\nThe kernel is precompiled for specific matrix shapes and assumes a transposed memory layout (as required by the competition). To support additional shapes or alternative memory layouts, you must modify the kernel launcher.\n\nSo now that we have a high-performance ROCm kernel, the natural question is: how do we integrate it into a real PyTorch workflow and share it with others? That’s exactly what we’ll cover next, using `kernels` to structure, build, and publish the ROCm kernel.\n\n> This is a fairly technical guide, but you can still follow it step by step without understanding every detail and everything will work fine. If you’re curious, you can always come back later to dig deeper into the concepts.\n\n### Step 1: Project Structure\n\nThe Hugging Face Kernel Builder expects your files to be organized like this:\n\n```\ngemm/\n├── build.toml\n├── gemm\n│   └── gemm_kernel.h\n├── flake.nix\n└── torch-ext\n    ├── torch_binding.cpp\n    ├── torch_binding.h\n    └── gemm\n        └── __init__.py\n```\n\n- **build.toml**: The project manifest; it’s the brain of the build process.\n- **gemm/**: Your raw CUDA source code where the GPU magic happens.\n- **flake.nix**: The key to a perfectly reproducible build environment.\n- **torch-ext/gemm/**: The Python wrapper for the raw PyTorch operators\n\nSometimes your project might depend on other files, like tests or helper scripts, and you can add them without any issues. In our case, our project will be structured like this:\n\n```\ngemm/\n├── build.toml\n├── gemm\n│   ├── gemm_kernel.h\n│   ├── gemm_kernel_legacy.h\n│   ├── transpose_kernel.h\n│   └── gemm_launcher.hip\n├── include\n│   ├── clangd_workaround.h\n│   ├── gpu_libs.h\n│   ├── gpu_types.h\n│   └── timer.h\n├── src/utils\n│   ├── arithmetic.h\n│   └── timer.hip\n├── tests/checker\n│   ├── checker.cpp\n│   ├── metrics.h\n│   └── checker.h\n├── flake.nix\n└── torch-ext\n    ├── torch_binding.cpp\n    ├── torch_binding.h\n    └── gemm\n        └── __init__.py\n```\n\nIf you look at the original files of the gemm kernel in the RadeonFlow Kernels, they are HIP source files with `.cpp` extensions. As a first step, you need to change these extensions to either .h or .hip depending on their content and usage:\n\n- Use `.h` for header files containing kernel declarations, inline functions, or template code that will be included in other files\n- Use `.hip` for implementation files containing HIP/GPU code that needs to be compiled separately (e.g., kernel launchers, device functions with complex implementations)\n\nIn our example, `gemm_kernel.h`, `gemm_kernel_legacy.h`, and `transpose_kernel.h` are header files, while `gemm_launcher.hip` is a HIP implementation file. This naming convention helps the kernel-builder ([`kernels/builder`](https://github.com/huggingface/kernels/tree/main/kernel-builder)) correctly identify and compile each file type.\n\n### Step 2: Configuration Files Setup\n\n#### The `build.toml` Manifest\n\nThis file orchestrates the entire build. It tells the kernel-builder what to compile and how everything connects.\n\n```toml\n[general]\nname = \"gemm\"\nuniversal = false\n\n[torch]\nsrc = [\n  \"torch-ext/torch_binding.cpp\",\n  \"torch-ext/torch_binding.h\",\n]\n\n[kernel.gemm]\nbackend = \"rocm\"\nrocm-archs = [\n    \"gfx942\",\n]\n\ndepends = [\"torch\"]\n\nsrc = [\n  \"include/clangd_workaround.h\",\n  \"include/gpu_libs.h\",\n  \"include/gpu_types.h\",\n  \"include/timer.h\",\n  \"gemm/gemm_kernel.h\",\n  \"gemm/gemm_kernel_legacy.h\",\n  \"gemm/gemm_launcher.hip\",\n  \"gemm/transpose_kernel.h\",\n  \"src/utils/arithmetic.h\",\n  \"src/utils/timer.hip\",\n  \"tests/checker/metrics.h\",\n]\n\ninclude = [\"include\"]\n```\n\n**general**\n\nThis section contains general project configuration settings.\n\n- **name** (required): The name of your project. This should match your kernel name and will be used for the Python package.\n- **universal** (optional): the kernel is a universal kernel when set to `true`. A universal kernel is a pure Python package (no compiled files). Universal kernels do not use the other sections described below. A good example of a universal kernel is a Triton kernel. Default: `false`\n\n**torch**\n\nThis section describes the Torch extension configuration. It defines the Python bindings that will expose your kernel to PyTorch.\n\n- **src** (required): A list of source files and headers for the PyTorch extension. In our case, this includes the C++ binding files that create the Python interface.\n\n**kernel.gemm**\n\nSpecification of a kernel named \"gemm\". You can define multiple kernel sections in the same build.toml file if you have multiple kernels.\n\n- **backend** (required): The compute backend for the kernel. We use \"rocm\" for AMD GPU support.\n- **rocm-archs** (required for ROCm): A list of ROCm architectures that the kernel should be compiled for. \"gfx942\" targets the MI300 series GPUs.\n- **depends** (required): A list of dependencies. We depend on \"torch\" to use PyTorch's tensor operations.\n- **include** (optional): Include directories relative to the project root. This helps the compiler find header files.\n\n#### The `flake.nix` Reproducibility File\n\nTo ensure anyone can build your kernel on any machine, we use a flake.nix file. It locks the exact version of the kernel-builder and its dependencies. (You can just copy and paste this example and change the description)\n\n```nix\n{\n  description = \"Flake for GEMM kernel\";\n\n  inputs = {\n    kernel-builder.url = \"github:huggingface/kernels\";\n  };\n\n  outputs =\n    {\n      self,\n      kernel-builder,\n    }:\n\n    kernel-builder.lib.genFlakeOutputs {\n      inherit self;\n      path = ./.;\n    };\n}\n```\n\n#### Writing the Kernel\n\nNow for the GPU code. Inside `gemm/gemm_launcher.hip`, we define how the GEMM kernel is launched. Depending on the configuration, we either call the new optimized `gemm/gemm_kernel` or fall back to the legacy implementation (`gemm/gemm_kernel_legacy`).\n\n```c\n// ... previous includes and definitions\nextern \"C\" void run(\n    void *a, void *b, void *as, void *bs, void *c,\n    int m, int n, int k,\n    PerfMetrics *metrics, hipStream_t job_stream0\n) {\n    const __FP8_TYPE *a_ptr = static_cast<const __FP8_TYPE *>(a);\n    const __FP8_TYPE *b_ptr = static_cast<const __FP8_TYPE *>(b);\n    __BF16_TYPE *c_ptr = static_cast<__BF16_TYPE *>(c);\n    const float *as_ptr = static_cast<const float *>(as);\n    const float *bs_ptr = static_cast<const float *>(bs);\n\n    KernelTimerScoped timer(timers, 2LL * m * n * k,\n        metrics ? &metrics->entries[0].time : nullptr,\n        metrics ? &metrics->entries[0].gflops : nullptr, job_stream0);\n\n    // Dispatch GEMM to the fastest available implementation\n    switch (pack_shape(m, n, k)) {\n        DISPATCH_GEMM(1024, 1536, 7168, 256, 128, 128, 4, 2, 512, 4, 16);\n        DISPATCH_GEMM(6144, 7168, 2304, 256, 128, 128, 4, 2, 512, 1, 16);\n        default: {\n            printf(\"Error: Unsupported shape M=%d, K=%d, N=%d\\n\", m, k, n);\n            abort();\n        }\n    }\n}\n// ...\n```\n\n#### Registering a Native PyTorch Operator\n\nThis step is key. We’re not just making the function available in Python; we’re turning it into a native PyTorch operator. That means it becomes a first-class part of PyTorch itself, accessible through `torch.ops`.\n\nThe file `torch-ext/torch_binding.cpp` handles this registration.\n\n```c\n#include <torch/all.h>\n#include <torch/library.h>\n#include <hip/hip_runtime.h>\n\n#include \"registration.h\"\n#include \"torch_binding.h\"\n\n// Forward declaration of the C function from gemm_launcher.hip\nextern \"C\" {\n    struct PerfMetrics;\n    void run(void *a, void *b, void *as, void *bs, void *c, int m, int n, int k, PerfMetrics *metrics, hipStream_t job_stream0);\n}\n\nvoid gemm(torch::Tensor &out, torch::Tensor const &a, torch::Tensor const &b, \n          torch::Tensor const &as, torch::Tensor const &bs) {\n    \n    // Validate tensor properties\n    TORCH_CHECK(a.device().is_cuda(), \"Input tensor a must be on GPU device\");\n    TORCH_CHECK(b.device().is_cuda(), \"Input tensor b must be on GPU device\");\n    TORCH_CHECK(as.device().is_cuda(), \"Scale tensor as must be on GPU device\");\n    TORCH_CHECK(bs.device().is_cuda(), \"Scale tensor bs must be on GPU device\");\n    TORCH_CHECK(out.device().is_cuda(), \"Output tensor out must be on GPU device\");\n    \n    TORCH_CHECK(a.is_contiguous(), \"Input tensor a must be contiguous\");\n    TORCH_CHECK(b.is_contiguous(), \"Input tensor b must be contiguous\");\n    TORCH_CHECK(as.is_contiguous(), \"Scale tensor as must be contiguous\");\n    TORCH_CHECK(bs.is_contiguous(), \"Scale tensor bs must be contiguous\");\n    TORCH_CHECK(out.is_contiguous(), \"Output tensor out must be contiguous\");\n    \n    // Get matrix dimensions from tensor shapes\n    // Assuming a is [M, K], b is [K, N], out is [M, N]\n    int M = a.size(0);\n    int K = a.size(1);\n    int N = b.size(1);\n    \n    TORCH_CHECK(b.size(0) == K, \"Matrix dimensions mismatch: a.size(1) != b.size(0)\");\n    TORCH_CHECK(out.size(0) == M, \"Output tensor dimension mismatch: out.size(0) != M\");\n    TORCH_CHECK(out.size(1) == N, \"Output tensor dimension mismatch: out.size(1) != N\");\n    \n    // Use default HIP stream (stream 0)\n    const hipStream_t stream = 0;\n    \n    // Call the C function\n    run(a.data_ptr(), b.data_ptr(), as.data_ptr(), bs.data_ptr(), out.data_ptr(),\n        M, N, K, nullptr, stream);\n}\n\nTORCH_LIBRARY_EXPAND(TORCH_EXTENSION_NAME, ops) {\n  ops.def(\"gemm(Tensor! out, Tensor a, Tensor b, Tensor a_scale, Tensor b_scale) -> ()\");\n  ops.impl(\"gemm\", torch::kCUDA, &gemm);\n}\n\nREGISTER_EXTENSION(TORCH_EXTENSION_NAME)\n```\n\nThe `torch_binding.h` file contains function declarations. For instance, the `gemm` kernel has the following declaration in `torch_binding.h`:\n\n```h\n#pragma once\n\n#include <torch/torch.h>\n\nvoid gemm(torch::Tensor &out, torch::Tensor const &a, torch::Tensor const &b, \n          torch::Tensor const &as, torch::Tensor const &bs);\n```\n\n#### Setting up the `__init__.py` wrapper\n\nIn `torch-ext/gemm/` we need an `__init__.py` file to make this directory a Python package and to expose our custom operator in a user-friendly way.\n\n```python\nfrom typing import Optional\nimport torch\nfrom ._ops import ops\n\ndef gemm(a: torch.Tensor, b: torch.Tensor, as_: torch.Tensor, bs: torch.Tensor, \n         out: Optional[torch.Tensor] = None) -> torch.Tensor:\n         \n    if out is None:\n        # Create output tensor with appropriate shape and dtype\n        M, K = a.shape\n        K_b, N = b.shape\n        assert K == K_b, f\"Matrix dimension mismatch: A has {K} cols, B has {K_b} rows\"\n        \n        # Output should be BF16 type on the same device as inputs\n        out = torch.empty((M, N), dtype=torch.bfloat16, device=a.device)\n    \n    ops.gemm(out, a, b, as_, bs)\n    return out\n```\n\n### Step 3: Building the Kernel\n\nThe kernel builder uses Nix for building kernels. You can build or run the kernels directly if you have Nix installed on your system. We recommend installing Nix in the following way:\n\n- **Linux**: use the [official Nix installer](https://nixos.org/download/).\n- **macOS**: use the [Determinate Nix installer](https://docs.determinate.systems/determinate-nix/). In addition, Xcode 16.x is currently required to build kernels.\n\n#### Getting Started with Nix\n\nFirst of all, run this:\n\n```bash\nnix flake update\n```\n\nThis generates a `flake.lock` file that pins the kernel builder and all its transitive dependencies. Commit both `flake.nix` and `flake.lock` to your repository to ensure that kernel builds are reproducible.\n\nSince the kernel builder depends on many packages (e.g., every supported PyTorch version), it is recommended to enable the Hugging Face cache to avoid expensive rebuilds:\n\n```bash\n# Install cachix and configure the cache\ncachix use huggingface\n```\n\nOr run it once without installing cachix permanently:\n\n```bash\n# Use cachix without installing it\nnix run nixpkgs#cachix -- use huggingface\n```\n\n#### Building Kernels with Nix\n\nA kernel that has a `flake.nix` file can be built with the build-and-copy command:\n\n```bash\ncd Build_RadeonFlow_Kernels/gemm\nnix build . -L\n```\n\nThe compiled kernel will then be in the local `build/` directory.\n\n#### Development Shell for Local Development\n\nThe kernel-builder provides shells for developing kernels. In such a shell, all required dependencies are available, as well as `build2cmake` for generating project files:\n\n```bash\n$ nix develop\n$ build2cmake generate-torch build.toml\n$ cmake -B build-ext\n$ cmake --build build-ext\n```\n\nIf you want to test the kernel as a Python package, you can do so. `nix develop` will automatically create a virtual environment in `.venv` and activate it:\n\n```bash\n$ nix develop\n$ build2cmake generate-torch build.toml\n$ pip install --no-build-isolation -e .\n```\n\nDevelopment shells are available for every build configuration. For instance, you can get a Torch 2.7 development shell with ROCm 6.3 using:\n\n```bash\n$ rm -rf .venv  # Remove existing venv if any\n$ nix develop .#devShells.torch27-cxx11-rocm63-x86_64-linux\n```\n\n### Step 4: Uploading the kernel to the Hub\n\nNow that we built our kernel, we can test it and upload it to the Hub.\n\n#### Building the Kernel for All PyTorch and ROCm Versions\n\nOne small thing we'll want to do before we share is clean up all of the development artifacts that were generated during the build process to avoid uploading unnecessary files.\n\n```bash\nbuild2cmake clean build.toml \n```\n\nTo build the kernel for all supported versions of PyTorch and ROCm, the kernel-builder tool automates the process:\n\n```bash\n# Outside of the dev shell, run the following command\n# if you are inside of the sandbox you can leave with `exit`\nnix build . -L\n```\n\n> **Note:**\\\n> This process may take a while, as it will build the kernel for all supported versions of PyTorch and ROCm.\\\n> The output will be in the `result` directory.\n\nThe last step is to move the results into the expected build directory (this is where the kernels library will look for them).\n\n```bash\nmkdir -p build\nrsync -av --delete --chmod=Du+w,Fu+w result/ build/\n```\n\n#### Pushing to the Hugging Face Hub\n\nPushing the build artifacts to the Hub will make it straightforward for other developers to use your kernel. We can use the `kernels upload` command for this:\n\n```bash\nkernels upload <path_to_kernel> --repo_id hub-username/img2gray\n```\n\nYou can also follow a standard git-based process for the upload.\n\nFirst, create a new repo:\n\n```bash\nhf repo create gemm\n```\n\n> Make sure you are logged in to the Hugging Face Hub using huggingface-cli login.\n\nNow, in your project directory, connect your project to the new repository and push your code:\n\n```bash\n# Initialize git and connect to the Hugging Face Hub\ngit init\ngit remote add origin https://huggingface.co/<your-username>/gemm\n\n# Pull the changes (just the default .gitattributes file)\ngit pull origin main\ngit xet install\ngit checkout -b main\n\n# Update to use Xet for the binary files\ngit xet track \"*.so\"\n\n# Add and commit your changes (being careful to only include the necessary files\n# since our build2cmake command generated a lot of dev-specific files)\ngit add \\\n  build/ gemm/ include/ src/utils tests/checker \\\n  torch-ext/torch_binding.cpp torch-ext/torch_binding.h torch-ext/gemm \\\n  flake.nix flake.lock build.toml\n\ngit commit -m \"feat: Created a compliant gemm kernel\"\ngit push -u origin main\n```\n\nFantastic! Your kernel is now on the Hugging Face Hub, ready for others to use and fully compliant with the kernels library.\n\n### Step 5: Let's use it :)\n\nWith the **kernels** library, you don't \"install\" the kernel in the traditional sense. You load it directly from its Hub repository, which automatically registers the new operator.\n\n```python\nimport torch\nfrom kernels import get_kernel\n\n# Load the kernel from the Hub\ngemm = get_kernel(\"kernels-community/gemm\")\n\n# Matrix dimensions (must be supported - see gemm_launcher.cpp)\nM, N, K = 1024, 1536, 7168\nQUANT_SIZE = 128\n\n# Setup device\ndevice = torch.device(\"cuda\")\n\n# Create inputs - kernel expects A:(K,M), B:(K,N)\nA_fp32 = torch.randn(M, K, device=device)\nB_fp32 = torch.randn(K, N, device=device)\n\n# Convert to FP8\nA_fp8 = A_fp32.to(torch.float8_e4m3fnuz)\nB_fp8 = B_fp32.to(torch.float8_e4m3fnuz)\n\n# Create scale factors (uniform scaling)\nA_scale = torch.ones(K // QUANT_SIZE, M, device=device, dtype=torch.float32)\nB_scale = torch.ones(K // QUANT_SIZE, N // QUANT_SIZE, device=device, dtype=torch.float32)\n\nC = torch.zeros(M, N, device=device, dtype=torch.bfloat16)\n\n# Use the kernel\nresult = gemm.gemm(A_fp8, B_fp8, A_scale, B_scale, C)\n```\n\nThat's it! Your ROCm kernel is now ready to use from the Hugging Face Hub.\n\n## Conclusion\n\nBuilding and sharing ROCm kernels with the Hugging Face is now easier than ever. With a clean, reproducible workflow powered by Nix and seamless integration into PyTorch, developers can focus on optimizing performance rather than setup. Once built, your custom kernel can be shared on the Hugging Face Hub; making it instantly accessible to the community and usable across projects with just a few lines of code. 🚀\n\n## Related Libraries & Hub\n\n- [kernels](https://github.com/huggingface/kernels) – Library to build, manage and load kernels from the Hub. It contains the [kernel-builder](https://github.com/huggingface/kernels/tree/main/kernel-builder) tooling.\n- [Kernels Community Hub](https://huggingface.co/kernels-community) – Share and discover kernels from the community.\n",
  "dateCreated": "2026-10-04T12:50:30.804479567+00:00",
  "date_created": "2025-11-17T00:00:00+00:00",
  "date_modified": "2025-11-17T00:00:00+00:00",
  "date_published": "2025-11-17T00:00:00+00:00",
  "description": "Intoduction Custom kernels are the backbone of high-performance deep learning, enabling GPU operations tailored precisely to your workload; whether that’s image processing, tensor transformations, or other compute-heavy tasks. But…",
  "external_url": "https://huggingface.co/blog/build-rocm-kernels",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/huggingface-co/2025/11/2025-11-17-easily-build-and-share-rocm-kernels-with-hugging-face.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/huggingface-co/2025/11/2025-11-17-easily-build-and-share-rocm-kernels-with-hugging-face.md"
  },
  "id": "urn:aggr:item:1ce15d1454391202f5e5f6fae07fd1be1162d35b",
  "isBasedOn": {
    "@id": "https://huggingface.co/blog/build-rocm-kernels"
  },
  "mainEntity": {
    "@id": "https://huggingface.co/blog/build-rocm-kernels",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/huggingface-co/2025-11-17-easily-build-and-share-rocm-kernels-with-hugging-face/#webpage"
    },
    "dateModified": "2025-11-17T00:00:00+00:00",
    "datePublished": "2025-11-17T00:00:00+00:00",
    "headline": "Easily Build and Share ROCm Kernels with Hugging Face",
    "timeRequired": "PT13M",
    "url": "https://huggingface.co/blog/build-rocm-kernels",
    "wordCount": 2851
  },
  "name": "Archived snapshot: Easily Build and Share ROCm Kernels with Hugging Face",
  "preview": null,
  "reading_minutes": 13,
  "replicated_at": null,
  "source": "huggingface-co",
  "source_name": "Hugging Face - Blog",
  "summary": null,
  "tags": [],
  "temporalCoverage": "2026-10-04T12:50:30.804479567+00:00",
  "title": "Easily Build and Share ROCm Kernels with Hugging Face",
  "url": "https://aggr.aymericbeaumet.com/items/huggingface-co/2025-11-17-easily-build-and-share-rocm-kernels-with-hugging-face/",
  "word_count": 2851
}