diff --git a/.gitignore b/.gitignore index 9716a03a1e4..cea70f8ab5f 100644 --- a/.gitignore +++ b/.gitignore @@ -109,11 +109,6 @@ test_data/* # The experimental/builder directory should be tracked despite matching build* !experimental/builder !experimental/builder/** -experimental/grouped_convolution_tile_instances/instances/* -!experimental/grouped_convolution_tile_instances/instances/*.in -!experimental/grouped_convolution_tile_instances/instances/*.inc -!experimental/grouped_convolution_tile_instances/instances/*.hpp -experimental/grouped_convolution_tile_instances/*.inc # Heuristics: benchmark data (never in git) dispatcher/heuristics/data/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index daf3c258d9d..bb802731021 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -26,6 +26,16 @@ repos: verbose: false language: script types_or: [c++, python, shell, cmake] + - id: ascii-only-checker + name: Check for non-ASCII characters in C/C++ sources + entry: projects/composablekernel/script/check_ascii_only.sh + language: script + types_or: [c++, inc] + - id: crlf-checker + name: Check for CRLF line endings in C/C++ sources + entry: projects/composablekernel/script/check_no_crlf.sh + language: script + types_or: [c++, inc] - id: remove-exec-bit name: Remove executable bit from non-executable files entry: projects/composablekernel/script/remove_exec_bit.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index f6812a8520f..af318904f66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,10 @@ Documentation for Composable Kernel available at [https://rocm.docs.amd.com/projects/composable_kernel/en/latest/](https://rocm.docs.amd.com/projects/composable_kernel/en/latest/). -## (Unreleased) Composable Kernel 1.3.0 +## Composable Kernel 1.2.0 for ROCm 7.13 ### Added + * Added overload of load_tile_transpose that takes reference to output tensor as output parameter * Use data type from LDS tensor view when determining tile distribution for transpose in the GEMM pipeline * Added eightwarps support for abquant mode in blockscale GEMM. diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ce054255cc..c01d2ad553a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -136,6 +136,87 @@ else() set(CK_ENABLE_BF8 "ON") endif() +# --------------------------------------------------------------------------- +# Map GPU target strings to hex amdgcn_target_id values (arch.hpp). +# Builds a -DCK_CMAKE_GPU_TARGET_IDS=0xHHHH,... definition that host-side +# test code can consume without launching a device kernel. +# --------------------------------------------------------------------------- +function(_ck_gpu_target_string_to_id TARGET_STR OUT_VAR) + string(TOLOWER "${TARGET_STR}" _tgt) + string(REGEX REPLACE ":.*" "" _tgt "${_tgt}") + # GFX9 + if(_tgt STREQUAL "gfx908") + set(${OUT_VAR} "0x0908" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx90a") + set(${OUT_VAR} "0x090A" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx942") + set(${OUT_VAR} "0x0942" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx950") + set(${OUT_VAR} "0x0950" PARENT_SCOPE) + # GFX10.3 + elseif(_tgt STREQUAL "gfx1030") + set(${OUT_VAR} "0x1030" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1031") + set(${OUT_VAR} "0x1031" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1032") + set(${OUT_VAR} "0x1032" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1033") + set(${OUT_VAR} "0x1033" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1034") + set(${OUT_VAR} "0x1034" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1035") + set(${OUT_VAR} "0x1035" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1036") + set(${OUT_VAR} "0x1036" PARENT_SCOPE) + elseif(_tgt MATCHES "^gfx10-3-generic$") + set(${OUT_VAR} "0x103F" PARENT_SCOPE) + # GFX11 + elseif(_tgt STREQUAL "gfx1100") + set(${OUT_VAR} "0x1100" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1101") + set(${OUT_VAR} "0x1101" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1102") + set(${OUT_VAR} "0x1102" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1103") + set(${OUT_VAR} "0x1103" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1150") + set(${OUT_VAR} "0x1150" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1151") + set(${OUT_VAR} "0x1151" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1152") + set(${OUT_VAR} "0x1152" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1153") + set(${OUT_VAR} "0x1153" PARENT_SCOPE) + elseif(_tgt MATCHES "^gfx11-generic$") + set(${OUT_VAR} "0x11FF" PARENT_SCOPE) + # GFX12 + elseif(_tgt STREQUAL "gfx1200") + set(${OUT_VAR} "0x1200" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1201") + set(${OUT_VAR} "0x1201" PARENT_SCOPE) + elseif(_tgt MATCHES "^gfx12-generic$") + set(${OUT_VAR} "0x12FF" PARENT_SCOPE) + elseif(_tgt STREQUAL "gfx1250") + set(${OUT_VAR} "0x1250" PARENT_SCOPE) + else() + message(WARNING "_ck_gpu_target_string_to_id: unknown GPU target '${TARGET_STR}', skipping") + set(${OUT_VAR} "" PARENT_SCOPE) + endif() +endfunction() + +# Inject a macro CK_CMAKE_GPU_TARGET_IDS containing all configure-level GPU targets into all source files. +set(_ck_hex_ids) +foreach(_tgt IN LISTS GPU_TARGETS) + _ck_gpu_target_string_to_id("${_tgt}" _ck_hex) + if(_ck_hex AND NOT _ck_hex STREQUAL "0x0000") + list(APPEND _ck_hex_ids "${_ck_hex}") + endif() +endforeach() +list(JOIN _ck_hex_ids "," _ck_hex_str) +if(_ck_hex_str) + add_compile_definitions(CK_CMAKE_GPU_TARGET_IDS=${_ck_hex_str}) +endif() + #for f8/bf8_t type add_compile_options(-Wno-bit-int-extension) add_compile_options(-Wno-pass-failed) @@ -164,6 +245,8 @@ if(NOT DISABLE_DL_KERNELS AND GPU_TARGETS MATCHES "gfx101|gfx103|gfx10-1|gfx10-3 set(DL_KERNELS "ON") set(CK_ENABLE_DL_KERNELS "ON") endif() +message(STATUS "Disabling DPP kernels by default") +option(DISABLE_DPP_KERNELS "Disable DPP kernels by default" ON) if(NOT DISABLE_DPP_KERNELS) add_definitions(-DDPP_KERNELS) set(DPP_KERNELS "ON") @@ -741,6 +824,10 @@ SET(BUILD_DEV ON CACHE BOOL "BUILD_DEV") if(BUILD_DEV) add_compile_options(-Werror) add_compile_options(-Weverything) + add_compile_options(-Wno-lifetime-safety-intra-tu-suggestions) + add_compile_options(-Wno-lifetime-safety-cross-tu-suggestions) + add_compile_options(-Wno-lifetime-safety-lifetimebound-violation) + add_compile_options(-Wno-unknown-warning-option) endif() message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") @@ -761,8 +848,6 @@ if(NOT MIOPEN_REQ_LIBS_ONLY AND NOT HIPTENSOR_REQ_LIBS_ONLY) endif() -option(MIOPEN_REQ_LIBS_ONLY "Build only the MIOpen required libraries" OFF) -option(HIPTENSOR_REQ_LIBS_ONLY "Build only the HipTensor required libraries" OFF) option(DISABLE_OFFLOAD_COMPRESS "Disable offload compress compiler flag when building instances" OFF) option(BUILD_MHA_LIB "Build the static library for flash attention" OFF) option(BUILD_CK_DEVICE_INSTANCES "Build device operation instances in library/" ON) @@ -822,7 +907,6 @@ endif() if (CK_EXPERIMENTAL_BUILDER) add_subdirectory(experimental/builder) - add_subdirectory(experimental/grouped_convolution_tile_instances) endif() if(NOT GPU_ARCHS AND USER_GPU_TARGETS AND NOT MIOPEN_REQ_LIBS_ONLY AND NOT HIPTENSOR_REQ_LIBS_ONLY) diff --git a/Dockerfile b/Dockerfile index 7c0da210d34..cfbbe1bfe40 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,7 +25,7 @@ ENV HIP_PLATFORM=amd # Add rocm repository RUN set -xe && \ - apt-get update && apt-get install -y --allow-unauthenticated apt-utils wget gnupg2 curl cmake git vim nano zip + apt-get update && apt-get install -y apt-utils wget gnupg2 curl cmake git vim nano zip RUN if [ "$compiler_version" = "therock" ]; then \ rm -rf /opt/rocm && mkdir /opt/rocm && \ @@ -60,7 +60,7 @@ RUN set -x && \ tar -xzf sccache.tar.gz --strip-components=1 -C ${SCCACHE_INSTALL_LOCATION} && \ chmod +x ${SCCACHE_INSTALL_LOCATION}/sccache && \ # Install dependencies - DEBIAN_FRONTEND=noninteractive apt-get install -y --allow-unauthenticated \ + DEBIAN_FRONTEND=noninteractive apt-get install -y \ build-essential \ jq \ libelf-dev \ diff --git a/Jenkinsfile b/Jenkinsfile index 03475924055..4b493134460 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -21,1229 +21,18 @@ // - Forces full build if dependency cache stale (>7 days) // - Manual override: set DISABLE_SMART_BUILD=true // -// Benefits: PR builds 5h → 30min (typical), nightly builds unchanged +// Benefits: PR builds 5h -> 30min (typical), nightly builds unchanged // See: script/dependency-parser/README.md for details // - -@NonCPS -String getGitHubCommitHash(def build) -{ - def scmAction = build?.actions.find { action -> - action instanceof jenkins.scm.api.SCMRevisionAction - } - if (scmAction?.revision instanceof org.jenkinsci.plugins.github_branch_source.PullRequestSCMRevision) - { - return scmAction.revision.pullHash - } - else if (scmAction?.revision instanceof jenkins.plugins.git.AbstractGitSCMSource$SCMRevisionImpl) - { - return scmAction.revision.hash - } - return null -} - def rocmnode(name) { return '(rocmtest || miopen) && (' + name + ')' } -def show_node_info() { - sh """ - echo "NODE_NAME = \$NODE_NAME" - hostname - lsb_release -sd - uname -r - cat /sys/module/amdgpu/version - ls /opt/ -la - """ -} - -def setGithubStatus(String context, String state, String description) { - def sha = env.GIT_COMMIT - def targetUrl = env.RUN_DISPLAY_URL ?: env.BUILD_URL - def statusUrl = "https://api.github.com/repos/ROCm/rocm-libraries/statuses/${sha}" - withCredentials([usernamePassword(credentialsId: 'github-app-miopen', usernameVariable: 'GITHUB_APP', passwordVariable: 'GITHUB_TOKEN')]) { - def code = '0' - try { - retry(3) { - code = sh(returnStdout: true, script: """ - curl -s -w "%{http_code}" -o /dev/null -X POST '${statusUrl}' \\ - -H "Authorization: token \$GITHUB_TOKEN" \\ - -H 'Content-Type: application/json' \\ - -d '{"state":"${state}","context":"${context}","description":"${description}","target_url":"${targetUrl}"}' - """).trim() - if (!code.startsWith('2')) { - error("GitHub status POST returned ${code}") - } - } - } catch (Exception e) { - echo "WARNING: GitHub status POST failed after retries (context=${context}, state=${state}, code=${code})" - } - } -} - -def cloneUpdateRefRepo() { - def refRepoPath = "/var/jenkins/ref-repo/rocm-libraries" - def lockLabel = "git ref repo lock - ${env.NODE_NAME}" - def folderExists = sh( - script: "test -d ${refRepoPath}/refs", - returnStatus: true - ) == 0 - - if (!folderExists) { - echo "rocm-libraries repo does not exist at ${refRepoPath}, creating mirror clone..." - echo "locking on label: ${lockLabel}" - lock(lockLabel) { - def cloneCommand = """ - set -ex - rm -rf ${refRepoPath} && mkdir -p ${refRepoPath} - git clone --mirror https://github.com/ROCm/rocm-libraries.git ${refRepoPath} - """ - sh(script: cloneCommand, label: "clone ref repo") - } - echo "Completed git clone, lock released" - } - echo "rocm-libraries repo exists at ${refRepoPath}, performing git remote update..." - echo "locking on label: ${lockLabel}" - lock(lockLabel) { - def fetchCommand = """ - set -ex - cd ${refRepoPath} - git remote prune origin - git remote update - """ - sh(script: fetchCommand, label: "update ref repo") - } - echo "Completed git ref repo fetch, lock released" -} - -def checkoutComposableKernel() -{ - //update ref repo - cloneUpdateRefRepo() - // checkout project - def scmVars = checkout scm - // getGitHubCommitHash reads SCMRevisionAction recorded before any local merge, - // giving the true PR branch tip (pullHash) or branch HEAD (hash). - // Falls back to ORIG_HEAD (pre-merge HEAD set by git merge) when SCMRevisionAction - // is unavailable, then to HEAD for branch builds where no merge occurred. - env.GIT_COMMIT = getGitHubCommitHash(currentBuild.rawBuild) ?: sh(returnStdout: true, script: ''' - git rev-parse ORIG_HEAD 2>/dev/null || git rev-parse HEAD - ''').trim() -} - -def generateAndArchiveBuildTraceVisualization(String buildTraceFileName) { - try { - checkoutComposableKernel() - - // Retrieve the build trace artifact - def traceFileExists = false - try { - copyArtifacts( - projectName: env.JOB_NAME, - selector: specific(env.BUILD_NUMBER), - filter: buildTraceFileName - ) - traceFileExists = fileExists(buildTraceFileName) - } catch (Exception e) { - echo "Could not copy build trace artifact: ${e.getMessage()}" - traceFileExists = false - return - } - - sh """ - echo "post artifact download:" - ls -la - """ - - // Pull image - def image = "ghcr.io/puppeteer/puppeteer:24.30.0" - echo "Pulling image: ${image}" - def retimage = docker.image("${image}") - retimage.pull() - - // Create a temporary workspace - sh """#!/bin/bash - ls -la - mkdir -p workspace - cp ./projects/composablekernel/script/infra_helper/capture_build_trace.js ./workspace - cp ${buildTraceFileName} ./workspace/${buildTraceFileName} - chmod 777 ./workspace - ls -la ./workspace - """ - - // Run container to get snapshot - def dockerOpts = "--cap-add=SYS_ADMIN -v \"\$(pwd)/workspace:/workspace\" -e NODE_PATH=/home/pptruser/node_modules -e BUILD_TRACE_FILE=${buildTraceFileName}" - // Create unique image name by sanitizing job name - def sanitizedJobName = env.JOB_NAME.replaceAll(/[\/\\:*?"<>| ]/, '_').replaceAll('%2F', '_') - def architectureName = (buildTraceFileName =~ /(gfx[0-9a-zA-Z]+)/)[0][1] - def imageName = "perfetto_snapshot_${sanitizedJobName}_build_${env.BUILD_NUMBER}_${architectureName}.png" - sh """ - docker run --rm ${dockerOpts} ${image} node /workspace/capture_build_trace.js - mv ./workspace/perfetto_snapshot_build.png ./workspace/${imageName} - """ - - // Archive the snapshot - sh """ - mv ./workspace/${imageName} ${imageName} - """ - archiveArtifacts "${imageName}" - - // Notify the channel - withCredentials([string(credentialsId: 'ck_ci_build_perf_webhook_url', variable: 'WEBHOOK_URL')]) { - sh ''' - # Create build trace filename with build number based on the original filename - BUILD_TRACE_WITH_NUMBER=$(echo "''' + buildTraceFileName + '''" | sed 's/.json/_''' + sanitizedJobName + '''_''' + env.BUILD_NUMBER + '''_''' + architectureName + '''.json/') - - # Convert image to base64 - echo "Converting image to base64..." - IMAGE_BASE64=$(base64 -w 0 ''' + imageName + ''') - echo "Image base64 length: ${#IMAGE_BASE64}" - - # Convert build trace to base64 - echo "Converting build trace to base64..." - BUILD_TRACE_BASE64=$(base64 -w 0 ''' + buildTraceFileName + ''') - echo "Build trace base64 length: ${#BUILD_TRACE_BASE64}" - - # Create JSON payload with base64 data - echo "Creating JSON payload..." - { - printf '{\n' - printf ' "jobName": "%s",\n' "''' + env.JOB_NAME + '''" - printf ' "buildNumber": "%s",\n' "''' + env.BUILD_NUMBER + '''" - printf ' "jobUrl": "%s",\n' "''' + env.RUN_DISPLAY_URL + '''" - printf ' "imageName": "%s",\n' "''' + imageName + '''" - printf ' "architecture": "%s",\n' "''' + architectureName + '''" - printf ' "imageData": "%s",\n' "$IMAGE_BASE64" - printf ' "buildTraceName": "%s",\n' "$BUILD_TRACE_WITH_NUMBER" - printf ' "buildTraceData": "%s"\n' "$BUILD_TRACE_BASE64" - printf '}\n' - } > webhook_payload.json - - echo "JSON payload created, size: $(wc -c < webhook_payload.json) bytes" - - curl -X POST "${WEBHOOK_URL}" \ - -H "Content-Type: application/json" \ - -d @webhook_payload.json - - # Clean up temporary file - rm -f webhook_payload.json - ''' - } - } catch (Exception e) { - echo "Throwing error exception while generating build trace visualization" - echo 'Exception occurred: ' + e.toString() - } -} - -class Version { - int major, minor, patch - @Override - String toString() { - return [major, minor, patch].findAll().join('.') - } -} -def parseVersion(String versionString) { - if (!versionString) return null - int[] tokens = versionString.split(/\./).collect { it as int } // Splits the string by '.' and converts each part to an integer. - return new Version( - major: tokens[0], - minor: tokens.length > 1 ? tokens[1] : null, - patch: tokens.length > 2 ? tokens[2] : null, - ) -} - -def nthreads() { - def nproc = sh(returnStdout: true, script: 'nproc') - echo "Number of cores: ${nproc}" - def n = nproc.toInteger() - if (n > 64){ - n = 64 - } - echo "Number of threads used for building: ${n}" - return n -} - -def runShell(String command){ - def responseCode = sh returnStatus: true, script: "${command} > tmp.txt" - def output = readFile(file: "tmp.txt") - return (output != "") -} - -def shouldRunCICheck() { - // File patterns that should not trigger CI - def skipFilePatterns = [ - /^projects\/composablekernel\/\.github\/.*/, // GitHub workflow files - /^projects\/composablekernel\/docs\/.*/, // Documentation files - /^projects\/composablekernel\/LICENSE$/, // License file - /^projects\/composablekernel\/.*\.gitignore$/, // Git ignore files - /^projects\/composablekernel\/.*\.md$/ // Markdown files - ] - - try { - // Always run if this is a base branch build - def baseBranch = "develop" - def isBaseBranchBuild = (env.CHANGE_ID == null && env.BRANCH_NAME == baseBranch) - - if (isBaseBranchBuild) { - echo "Base branch (${baseBranch}) build detected - always running CI for safety" - return true - } - - // Get the list of changed files (all files touched in any commit, even if reverted) - def changedFiles = sh( - returnStdout: true, - script: ''' - BASE_BRANCH="develop" - - if [ "$CHANGE_ID" != "" ]; then - # For PR builds, get all files touched in any commit - echo "PR build detected, checking all touched files against origin/$CHANGE_TARGET" >&2 - git log --name-only --pretty=format: origin/$CHANGE_TARGET..HEAD -- projects/composablekernel/ | sort -u | grep -v '^$' || true - else - # For feature branch builds, compare against merge-base with base branch - MERGE_BASE=$(git merge-base HEAD origin/$BASE_BRANCH 2>/dev/null || echo "HEAD~1") - echo "Branch build detected, checking all touched files since merge-base: $MERGE_BASE" >&2 - git log --name-only --pretty=format: $MERGE_BASE..HEAD -- projects/composablekernel/ | sort -u | grep -v '^$' || true - fi - ''' - ).trim().split('\n') - - if (changedFiles.size() == 1 && changedFiles[0] == '') { - echo "No changed files detected - this might be a manual trigger or merge commit, running CI for safety" - return true - } - - echo "Changed files: ${changedFiles.join(', ')}" - - // Separate files into those requiring CI and those that can be skipped - def filesRequiringCI = [] - def skippedFiles = [] - - changedFiles.each { file -> - def shouldSkip = skipFilePatterns.any { pattern -> - file ==~ pattern - } - - if (shouldSkip) { - skippedFiles.add(file) - } else { - filesRequiringCI.add(file) - } - } - - // Debug output - if (skippedFiles.size() > 0) { - echo "Files that don't require CI (${skippedFiles.size()}):" - skippedFiles.each { echo " - ${it}" } - } - - if (filesRequiringCI.size() > 0) { - echo "Files that require CI (${filesRequiringCI.size()}):" - filesRequiringCI.each { echo " - ${it}" } - return true - } else { - echo "Only non-relevant files changed, skipping CI" - return false - } - } catch (Exception e) { - echo "Error checking changed files: ${e.getMessage()}, running CI by default" - return true - } -} - -def getBaseDockerImageName(){ - def img - if (params.USE_CUSTOM_DOCKER != ""){ - img = "${params.USE_CUSTOM_DOCKER}" - } - else{ - img = "${env.CK_DOCKERHUB}:ck_ub24.04_rocm${params.ROCMVERSION}" - } - return img -} - -def getDockerImageName(){ - def img - def base_name = getBaseDockerImageName() - if (params.USE_CUSTOM_DOCKER != ""){ - img = "${params.USE_CUSTOM_DOCKER}" - } - else{ - if (params.COMPILER_VERSION == "") { - img = "${base_name}" - } - else{ - if (params.COMPILER_COMMIT == ""){ - img = "${base_name}_${params.COMPILER_VERSION}" - } - else{ - def commit = "${params.COMPILER_COMMIT}"[0..6] - img = "${base_name}_${params.COMPILER_VERSION}_${commit}" - } - } - } - return img -} - -def check_host() { - if ("${env.CK_SCCACHE}" != "null"){ - def SCCACHE_SERVER="${env.CK_SCCACHE.split(':')[0]}" - echo "sccache server: ${SCCACHE_SERVER}" - sh "chmod +w -R ${env.WORKSPACE}" - sh '''ping -c 1 -p 6379 "${SCCACHE_SERVER}" | echo $? > tmp.txt''' - def output = readFile(file: "tmp.txt") - echo "tmp.txt contents: \$output" - return (output != "0") - } - else{ - return 1 - } -} - -def check_arch_name(){ - sh 'rocminfo | tee rocminfo.log' - if ( runShell('grep -n "gfx90a" rocminfo.log') ){ - return "gfx90a" - } - else if ( runShell('grep -n "gfx942" rocminfo.log') ) { - return "gfx942" - } - else if ( runShell('grep -n "gfx101" rocminfo.log') ) { - return "gfx101" - } - else if ( runShell('grep -n "gfx103" rocminfo.log') ) { - return "gfx103" - } - else if ( runShell('grep -n "gfx11" rocminfo.log') ) { - return "gfx11" - } - else if ( runShell('grep -n "gfx120" rocminfo.log') ) { - return "gfx12" - } - else if ( runShell('grep -n "gfx908" rocminfo.log') ) { - return "gfx908" - } - else if ( runShell('grep -n "gfx950" rocminfo.log') ) { - return "gfx950" - } - else { - return "" - } -} - -def getDockerImage(Map conf=[:]){ - def image - if ( conf.get("docker_name", "") != "" ){ - image = conf.get("docker_name", "") - echo "Using special docker: ${image}" - } - else{ - image = getDockerImageName() - echo "Using default docker: ${image}" - } - //Check if image exists - def retimage - try - { - echo "Pulling image: ${image}" - retimage = docker.image("${image}") - withDockerRegistry([ credentialsId: "ck_docker_cred", url: "" ]) { - retimage.pull() - } - } - catch(Exception ex) - { - error "Unable to locate image: ${image}" - } - return [retimage, image] -} - -// Build and push a docker image, capturing its digest into the specified env var. -// If forceBuild is false, will skip building if the image already exists in the registry. -def buildAndPushDockerImage(String install_prefix, String image_name, String dockerExtraArgs, boolean forceBuild){ - show_node_info() - env.DOCKER_BUILDKIT=1 - checkoutComposableKernel() - def dockerArgs = "--build-arg PREFIX=${install_prefix} --build-arg compiler_version='${params.COMPILER_VERSION}' --build-arg compiler_commit='${params.COMPILER_COMMIT}' --build-arg ROCMVERSION='${params.ROCMVERSION}' " - dockerArgs += " " + dockerExtraArgs - - if(!forceBuild){ - try{ - echo "Checking for image: ${image_name}" - sh "docker manifest inspect --insecure ${image_name}" - echo "Image: ${image_name} found! Skipping building image" - return image_name - } - catch(Exception ex){ - echo "Unable to locate image: ${image_name}. Will attempt to build image now." - } - } - - echo "Building image: ${image_name} with args: ${dockerArgs}" - def retimage = docker.build("${image_name}", dockerArgs) - withDockerRegistry([ credentialsId: "ck_docker_cred", url: "" ]) { - retimage.push() - } - def digest = sh(returnStdout: true, script: "docker inspect --format='{{index .RepoDigests 0}}' ${image_name}").trim() - echo "Built image digest: ${digest}" - echo "Pruning dangling Docker images to free disk space on CI agent" - sh "docker image prune -f --filter 'dangling=true' || true" - return digest -} - -def buildDockerBase(install_prefix){ - def image_name = getDockerImageName() - def base_image_name = getBaseDockerImageName() - echo "Building Docker for ${image_name}" - def dockerExtraArgs = " -f projects/composablekernel/Dockerfile . " - if(params.COMPILER_VERSION == "develop" || params.COMPILER_VERSION == "amd-staging" || params.COMPILER_COMMIT != ""){ - dockerExtraArgs = " --no-cache --build-arg BASE_DOCKER='${base_image_name}' -f projects/composablekernel/Dockerfile.compiler . " - } - else if(params.COMPILER_VERSION == "therock"){ - dockerExtraArgs = " --no-cache -f projects/composablekernel/Dockerfile . " - } - env.CK_BASE_IMAGE = buildAndPushDockerImage(install_prefix, image_name, dockerExtraArgs, params.BUILD_DOCKER.toBoolean()) -} - -def buildDockerPytorch(install_prefix){ - def image_name = "${env.CK_DOCKERHUB_PRIVATE}:ck_pytorch" - def dockerExtraArgs = " --no-cache -f projects/composablekernel/Dockerfile.pytorch --build-arg CK_PYTORCH_BRANCH='${params.ck_pytorch_branch}' . " - env.CK_PYTORCH_IMAGE = buildAndPushDockerImage(install_prefix, image_name, dockerExtraArgs, true) -} - -def buildDockerAiter(install_prefix){ - def image_name = "${env.CK_DOCKERHUB_PRIVATE}:ck_aiter" - def dockerExtraArgs = " --no-cache -f projects/composablekernel/Dockerfile.aiter --build-arg AITER_BRANCH='${params.aiter_branch}' --build-arg CK_AITER_BRANCH='${params.ck_aiter_branch}' . " - env.CK_AITER_IMAGE = buildAndPushDockerImage(install_prefix, image_name, dockerExtraArgs, true) -} - -def buildDockerFa(install_prefix){ - def image_name = "${env.CK_DOCKERHUB_PRIVATE}:ck_fa" - def dockerExtraArgs = " --no-cache -f projects/composablekernel/Dockerfile.fa" - dockerExtraArgs += " --build-arg BASE_DOCKER='${params.fa_base_docker}'" - dockerExtraArgs += " --build-arg FA_BRANCH='${params.fa_branch}'" - dockerExtraArgs += " --build-arg CK_FA_BRANCH='${params.ck_fa_branch}'" - dockerExtraArgs += " --build-arg GPU_ARCHS='gfx942;gfx950'" - dockerExtraArgs += " . " - env.CK_FA_IMAGE = buildAndPushDockerImage(install_prefix, image_name, dockerExtraArgs, true) -} - -def buildDocker(install_prefix){ - buildDockerBase(install_prefix) - if (params.RUN_PYTORCH_TESTS.toBoolean()) { - buildDockerPytorch(install_prefix) - } - if (params.RUN_AITER_TESTS.toBoolean()) { - buildDockerAiter(install_prefix) - } - if (params.RUN_FA_TESTS.toBoolean()) { - buildDockerFa(install_prefix) - } -} - -def get_docker_options(){ - def dockerOpts - if ( params.BUILD_INSTANCES_ONLY ){ - dockerOpts = "--network=host --group-add video --group-add render --cap-add=SYS_PTRACE --security-opt seccomp=unconfined" - } - else{ //only add kfd and dri paths if you actually going to run somthing on GPUs - dockerOpts = "--network=host --device=/dev/kfd --device=/dev/dri --group-add video --group-add render --cap-add=SYS_PTRACE --security-opt seccomp=unconfined" - } - if (params.COMPILER_VERSION == "develop" || params.COMPILER_VERSION == "amd-staging" || params.COMPILER_VERSION == "therock" || params.COMPILER_COMMIT != ""){ - // the --env COMPRESSED_BUNDLE_FORMAT_VERSION=2 env variable is required when building code with offload-compress flag with - // newer clang22 compilers and running with older hip runtima libraries - dockerOpts = dockerOpts + " --env HIP_CLANG_PATH='/llvm-project/build/bin' --env COMPRESSED_BUNDLE_FORMAT_VERSION=2 --env HIP_PLATFORM=amd " - } - // on some machines the group ids for video and render groups may not be the same as in the docker image! - def video_id = sh(returnStdout: true, script: 'getent group video | cut -d: -f3') - def render_id = sh(returnStdout: true, script: 'getent group render | cut -d: -f3') - dockerOpts = dockerOpts + " --group-add=${video_id} --group-add=${render_id} -v /var/jenkins/ref-repo/:/var/jenkins/ref-repo/ " - echo "Docker flags: ${dockerOpts}" - return dockerOpts -} - -def build_client_examples(String arch){ - def cmd = """ cd ../client_example && rm -rf build && mkdir build && cd build && \ - cmake -DCMAKE_PREFIX_PATH="${env.WORKSPACE}/projects/composablekernel/install;/opt/rocm" \ - -DGPU_TARGETS="${arch}" \ - -DCMAKE_CXX_COMPILER="${params.BUILD_COMPILER}" \ - -DCMAKE_HIP_COMPILER="${params.BUILD_COMPILER}" \ - -DCMAKE_CXX_FLAGS=" -O3 " .. && make -j """ - return cmd -} - -def build_client_examples_and_codegen_tests(String arch){ - def cmd = """ cd ../codegen && rm -rf build && mkdir build && cd build && \ - cmake -DCMAKE_PREFIX_PATH=/opt/rocm -DCMAKE_CXX_COMPILER="${params.BUILD_COMPILER}" .. && \ - make -j64 check && \ - cd ../../client_example && rm -rf build && mkdir build && cd build && \ - cmake -DCMAKE_PREFIX_PATH="${env.WORKSPACE}/projects/composablekernel/install;/opt/rocm" \ - -DGPU_TARGETS="${arch}" \ - -DCMAKE_CXX_COMPILER="${params.BUILD_COMPILER}" \ - -DCMAKE_HIP_COMPILER="${params.BUILD_COMPILER}" \ - -DCMAKE_CXX_FLAGS=" -O3 " .. && make -j """ - return cmd -} - -def build_and_run_fmha(String arch){ - def cmd = """ cmake -G Ninja -DCMAKE_PREFIX_PATH="${env.WORKSPACE}/projects/composablekernel/install;/opt/rocm" \ - -DGPU_TARGETS="${arch}" \ - -DCMAKE_CXX_COMPILER="${params.BUILD_COMPILER}" \ - -DCMAKE_HIP_COMPILER="${params.BUILD_COMPILER}" .. && \ - ninja -j128 tile_example_fmha_fwd tile_example_fmha_bwd && \ - cd ../ && - example/ck_tile/01_fmha/script/run_full_test.sh "CI_${params.COMPILER_VERSION}" "${env.BRANCH_NAME}" "${NODE_NAME}" "${arch}" """ - return cmd -} - -def cmake_build(Map conf=[:]){ - - def config_targets = conf.get("config_targets","check") - def build_envs = "CTEST_PARALLEL_LEVEL=4 " + conf.get("build_env","") - def prefixpath = conf.get("prefixpath","/opt/rocm") - def setup_args = conf.get("setup_args","") - // make sure all unit tests always run on develop branch - def runAllUnitTests = (env.BRANCH_NAME == "develop") ? true : params.RUN_ALL_UNIT_TESTS - - if (prefixpath != "/usr/local"){ - setup_args = setup_args + " -DCMAKE_PREFIX_PATH=${prefixpath} " - } - - //cmake_env can overwrite default CXX variables. - def cmake_envs - if(!setup_args.contains("gfx1250")){ - cmake_envs = "CXX=${params.BUILD_COMPILER} CXXFLAGS='-Werror' " + conf.get("cmake_ex_env","") - } - else{ //use default compiler for gfx1250 - cmake_envs = "CXX=/opt/rocm/llvm/bin/clang++ CXXFLAGS='-Werror' " + conf.get("cmake_ex_env","") - } - - if(conf.get("build_install","") == "true") - { - config_targets = 'install ' + config_targets - setup_args = ' -DBUILD_DEV=On -DCMAKE_INSTALL_PREFIX=../install' + setup_args - } else{ - setup_args = ' -DBUILD_DEV=On' + setup_args - } - if (params.DISABLE_DL_KERNELS){ - setup_args = setup_args + " -DDISABLE_DL_KERNELS=ON " - } - - setup_args = " -DCMAKE_BUILD_TYPE=release " + setup_args - - def pre_setup_cmd = """ - #!/bin/bash - cd projects/composablekernel - ulimit -c unlimited - rm -rf build - mkdir build - rm -rf install - mkdir install - cd build - """ - def invocation_tag="" - if (setup_args.contains("gfx12")){ - invocation_tag="gfx12" - } - if (setup_args.contains("gfx11")){ - invocation_tag="gfx11" - } - if (setup_args.contains("gfx101")){ - invocation_tag="gfx101" - } - if (setup_args.contains("gfx103")){ - invocation_tag="gfx103" - } - if (setup_args.contains("gfx908")){ - invocation_tag="gfx908" - } - if (setup_args.contains("gfx90a")){ - invocation_tag="gfx90a" - } - if (setup_args.contains("gfx94")){ - invocation_tag="gfx94" - } - if (setup_args.contains("gfx95")){ - invocation_tag="gfx95" - } - echo "invocation tag: ${invocation_tag}" - def redis_pre_setup_cmd = pre_setup_cmd - if(check_host() && params.USE_SCCACHE && "${env.CK_SCCACHE}" != "null" && "${invocation_tag}" != "") { - redis_pre_setup_cmd = pre_setup_cmd + """ - #!/bin/bash - export ROCM_PATH=/opt/rocm - export SCCACHE_ENABLED=true - export SCCACHE_LOG_LEVEL=debug - export SCCACHE_IDLE_TIMEOUT=14400 - export COMPILERS_HASH_DIR=/tmp/.sccache - export SCCACHE_BIN=/usr/local/.cargo/bin/sccache - export SCCACHE_EXTRAFILES=/tmp/.sccache/rocm_compilers_hash_file - export SCCACHE_REDIS="redis://${env.CK_SCCACHE}" - echo "connect = ${env.CK_SCCACHE}" >> ../script/redis-cli.conf - export SCCACHE_C_CUSTOM_CACHE_BUSTER="${invocation_tag}" - echo \$SCCACHE_C_CUSTOM_CACHE_BUSTER - stunnel ../script/redis-cli.conf - ../script/sccache_wrapper.sh --enforce_redis - """ - try { - def cmd1 = conf.get("cmd1", """ - ${redis_pre_setup_cmd} - """) - sh cmd1 - setup_args = " -DCMAKE_HIP_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache -DCMAKE_C_COMPILER_LAUNCHER=sccache " + setup_args - } - catch(Exception err){ - echo "could not connect to redis server: ${err.getMessage()}. will not use sccache." - def cmd2 = conf.get("cmd2", """ - ${pre_setup_cmd} - """) - sh cmd2 - } - } - else{ - def cmd3 = conf.get("cmd3", """ - ${pre_setup_cmd} - """) - sh cmd3 - } - - // reduce parallelism when compiling, clang uses too much memory - def nt = nthreads() - def cmd - def setup_cmd - def build_cmd - def execute_cmd = conf.get("execute_cmd", "") - //check the node gpu architecture - def arch_name = check_arch_name() - if(!setup_args.contains("NO_CK_BUILD")){ - if (params.NINJA_BUILD_TRACE) { - echo "running ninja build trace" - } - if (params.RUN_BUILDER_TESTS && !setup_args.contains("-DCK_CXX_STANDARD=") && !setup_args.contains("gfx10") && !setup_args.contains("gfx11")) { - setup_args = " -D CK_EXPERIMENTAL_BUILDER=ON " + setup_args - } - if (params.RUN_ROCM_CK_TESTS) { - setup_args = " -D CK_ENABLE_ROCM_CK=ON " + setup_args - } - setup_cmd = conf.get( - "setup_cmd", - """${cmake_envs} cmake -G Ninja ${setup_args} -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_CXX_FLAGS=" -O3 " .. """ - ) - - // Smart-build: Only build if running all tests or forced - // Otherwise, smart-build will determine what to build after cmake configure - if (runAllUnitTests) { - build_cmd = conf.get( - "build_cmd", - "${build_envs} ninja -j${nt} ${config_targets}" - ) - } else { - // Smart-build enabled: skip full build and execute_cmd (client examples) - build_cmd = "" - execute_cmd = "" - } - - cmd = conf.get("cmd", """ - ${setup_cmd} - ${build_cmd} - ${execute_cmd} - """) - } - else{ - cmd = conf.get("cmd", """ - ${execute_cmd} - """) - } - - echo cmd - - dir("projects/composablekernel/build"){ - // Start sccache monitoring - if(check_host() && params.USE_SCCACHE && "${env.CK_SCCACHE}" != "null" && "${invocation_tag}" != "") { - sh """ - chmod +x ../script/monitor_sccache_during_build.sh - mkdir -p logs - export SCCACHE_C_CUSTOM_CACHE_BUSTER="${invocation_tag}" - ../script/monitor_sccache_during_build.sh build_monitor & - MONITOR_PID=\$! - echo "Monitor PID: \$MONITOR_PID" - echo \$MONITOR_PID > monitor.pid - """ - } - try { - //build CK - sh cmd - if (runAllUnitTests){ - // Archive artifacts if they were generated - if (fileExists("ck_build_trace_${arch_name}.json")) { - archiveArtifacts "ck_build_trace_${arch_name}.json" - } - if (fileExists("clang_build_analysis_${arch_name}.log")) { - archiveArtifacts "clang_build_analysis_${arch_name}.log" - } - // Process ninja build trace after full build - if(fileExists(".ninja_log")) { - sh "python3 ../script/ninja_json_converter.py .ninja_log --legacy-format --output ck_build_trace_${arch_name}.json" - archiveArtifacts "ck_build_trace_${arch_name}.json" - sh "python3 ../script/parse_ninja_trace.py ck_build_trace_${arch_name}.json" - } - - if (params.NINJA_FTIME_TRACE) { - echo "running ClangBuildAnalyzer" - sh "/ClangBuildAnalyzer/build/ClangBuildAnalyzer --all . clang_build.log" - sh "/ClangBuildAnalyzer/build/ClangBuildAnalyzer --analyze clang_build.log > clang_build_analysis_${arch_name}.log" - archiveArtifacts "clang_build_analysis_${arch_name}.log" - } - } - } catch (Exception buildError) { - echo "Build failed: ${buildError.getMessage()}" - throw buildError - } finally { - // Stop sccache monitoring - if(check_host() && params.USE_SCCACHE && "${env.CK_SCCACHE}" != "null" && "${invocation_tag}" != "") { - sh """ - # Stop monitoring - if [ -f monitor.pid ]; then - MONITOR_PID=\$(cat monitor.pid) - kill \$MONITOR_PID 2>/dev/null || echo "Monitor already stopped" - rm -f monitor.pid - fi - """ - - // Archive the monitoring logs - try { - archiveArtifacts artifacts: "logs/*monitor*.log", allowEmptyArchive: true - } catch (Exception e) { - echo "Could not archive sccache monitoring logs: ${e.getMessage()}" - } - } - } - - //run tests except when NO_CK_BUILD is set and except on gfx1250 - if(!setup_args.contains("NO_CK_BUILD")){ - // run unit tests unless building library for all targets - // Note: This else block is when NINJA_BUILD_TRACE=false and BUILD_INSTANCES_ONLY=false - // So no ninja trace processing needed here - if (!params.BUILD_INSTANCES_ONLY){ - if (!runAllUnitTests && !setup_args.contains("gfx1250") ){ - // Smart Build: Run smart_build_and_test.sh - sh """ - export WORKSPACE_ROOT=${env.WORKSPACE} - export PARALLEL=32 - export NINJA_JOBS=${nt} - export ARCH_NAME=${arch_name} - export PROCESS_NINJA_TRACE=false - export NINJA_FTIME_TRACE=false - bash ../script/dependency-parser/smart_build_and_test.sh - """ - } - else{ //run all tests - if(!setup_args.contains("gfx1250")){ - echo "Full test suite requested (RUN_ALL_UNIT_TESTS=true or develop branch)" - sh "ninja -j${nt} check" - } - else{ //do not run tests on gfx1250, just build everything - echo "Building for gfx1250" - sh "ninja -j${nt}" - } - if (params.RUN_ROCM_CK_TESTS) { - sh 'ninja check-rocm-ck' - } - if(params.BUILD_PACKAGES || params.BUILD_INSTANCES_ONLY){ - echo "Build ckProfiler packages" - sh 'ninja -j64 package' - sh "mv composablekernel-ckprofiler_*.deb composablekernel-ckprofiler_1.2.0_amd64_${arch_name}.deb" - stash includes: "composablekernel-ckprofiler**.deb", name: "profiler_package_${arch_name}" - } - } - if (params.RUN_BUILDER_TESTS && !setup_args.contains("-DCK_CXX_STANDARD=") && !setup_args.contains("gfx10") && !setup_args.contains("gfx11")) { - sh 'ninja check-builder' - } - } - } - } - - if (params.RUN_CK_TILE_FMHA_TESTS){ - try{ - dir("projects/composablekernel"){ - archiveArtifacts "perf_fmha_*.log" - stash includes: "perf_fmha_**.log", name: "perf_fmha_log_${arch_name}" - } - } - catch(Exception err){ - echo "could not locate the requested artifacts: ${err.getMessage()}. will skip the stashing." - } - } -} - -def buildHipClangJob(Map conf=[:]){ - show_node_info() - checkoutComposableKernel() - def prefixpath = conf.get("prefixpath", "/opt/rocm") - def dockerOpts = get_docker_options() - def image - def retimage - (retimage, image) = getDockerImage(conf) - - setGithubStatus("${env.STAGE_NAME}", 'pending', "Starting ${env.STAGE_NAME}") - try { - withDockerContainer(image: image, args: dockerOpts) { - timeout(time: 20, unit: 'HOURS') - { - cmake_build(conf) - } - } - setGithubStatus("${env.STAGE_NAME}", 'success', "Stage ${env.STAGE_NAME} passed") - } - catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e){ - setGithubStatus("${env.STAGE_NAME}", 'failure', "Stage ${env.STAGE_NAME} failed") - throw e - } - return retimage -} - -def buildHipClangJobAndReboot(Map conf=[:]){ - try{ - buildHipClangJob(conf) - } - catch(e){ - echo "throwing error exception for the stage" - echo 'Exception occurred: ' + e.toString() - throw e - } -} - -def Build_CK(Map conf=[:]){ - show_node_info() - checkoutComposableKernel() - def prefixpath = conf.get("prefixpath", "/opt/rocm") - def dockerOpts=get_docker_options() - def image - def retimage - - setGithubStatus("${env.STAGE_NAME}", 'pending', "Starting ${env.STAGE_NAME}") - try { - try { - (retimage, image) = getDockerImage(conf) - withDockerContainer(image: image, args: dockerOpts) { - timeout(time: 2, unit: 'MINUTES'){ - sh 'rocminfo | tee rocminfo.log' - if ( !runShell('grep -n "gfx" rocminfo.log') ){ - throw new Exception ("GPU not found") - } - else{ - echo "GPU is OK" - } - } - } - } - catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e){ - echo "The job was cancelled or aborted" - setGithubStatus("${env.STAGE_NAME}", 'failure', "Stage ${env.STAGE_NAME} failed") - throw e - } - withDockerContainer(image: image, args: dockerOpts) { - timeout(time: 20, unit: 'HOURS') - { - //check whether to run performance tests on this node - def arch = check_arch_name() - cmake_build(conf) - if ( params.RUN_INDUCTOR_TESTS && arch == "gfx90a" ){ - echo "Run inductor codegen tests" - sh "projects/composablekernel/script/run_inductor_tests.sh" - } - // run performance tests, stash the logs, results will be processed on the master node - dir("projects/composablekernel/script"){ - if (params.RUN_PERFORMANCE_TESTS){ - if (params.RUN_FULL_QA && (arch == "gfx90a" || arch == "gfx942")){ - // run full tests on gfx90a or gfx942 - echo "Run full performance tests" - sh "./run_full_performance_tests.sh 0 QA_${params.COMPILER_VERSION} ${env.BRANCH_NAME} ${NODE_NAME} ${arch}" - archiveArtifacts "perf_*.log" - stash includes: "perf_**.log", name: "perf_log_${arch}" - } - else if (!params.RUN_FULL_QA && (arch == "gfx90a" || arch == "gfx942")){ - // run standard tests on gfx90a or gfx942 - echo "Run performance tests" - sh "./run_performance_tests.sh 0 CI_${params.COMPILER_VERSION} ${env.BRANCH_NAME} ${NODE_NAME} ${arch}" - archiveArtifacts "perf_*.log" - stash includes: "perf_**.log", name: "perf_log_${arch}" - } - else if ( arch != "gfx10"){ - // run basic tests on gfx11/gfx12/gfx908/gfx950, but not on gfx10, it takes too long - echo "Run gemm performance tests" - sh "./run_gemm_performance_tests.sh 0 CI_${params.COMPILER_VERSION} ${env.BRANCH_NAME} ${NODE_NAME} ${arch}" - archiveArtifacts "perf_onnx_gemm_*.log" - stash includes: "perf_onnx_gemm_**.log", name: "perf_log_${arch}" - } - } - } - if (params.hipTensor_test && arch == "gfx90a" ){ - // build and test hipTensor on gfx90a node - sh """#!/bin/bash - rm -rf rocm-libraries - git clone --no-checkout --filter=blob:none https://github.com/ROCm/rocm-libraries.git - cd rocm-libraries - git sparse-checkout init --cone - git sparse-checkout set projects/hiptensor - git checkout "${params.hipTensor_branch}" - """ - dir("rocm-libraries/projects/hiptensor"){ - sh """#!/bin/bash - mkdir -p build - ls -ltr - CC=hipcc CXX=hipcc cmake -Bbuild . -D CMAKE_PREFIX_PATH="${env.WORKSPACE}/install" - cmake --build build -- -j - ctest --test-dir build - """ - } - } - } - } - setGithubStatus("${env.STAGE_NAME}", 'success', "Stage ${env.STAGE_NAME} passed") - } - catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e){ - setGithubStatus("${env.STAGE_NAME}", 'failure', "Stage ${env.STAGE_NAME} failed") - throw e - } - return retimage -} - -def Build_CK_and_Reboot(Map conf=[:]){ - try{ - Build_CK(conf) - } - catch(e){ - echo "throwing error exception while building CK" - echo 'Exception occurred: ' + e.toString() - throw e - } -} - -def process_results(Map conf=[:]){ - checkoutComposableKernel() - //use older image that has user jenkins - def image = "${env.CK_DOCKERHUB}:ck_ub22.04_rocm6.3" - - setGithubStatus("${env.STAGE_NAME}", 'pending', 'Processing results...') - try { - try - { - echo "Pulling image: ${image}" - def retimage = docker.image("${image}") - withDockerRegistry([ credentialsId: "ck_docker_cred", url: "" ]) { - retimage.pull() - } - } - catch(Exception ex) - { - error "Unable to locate image: ${image}" - } - } - catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e){ - setGithubStatus("${env.STAGE_NAME}", 'failure', "Stage ${env.STAGE_NAME} failed") - throw e - } - - withDockerContainer(image: image, args: '--cap-add=SYS_PTRACE --security-opt seccomp=unconfined -v=/var/jenkins/:/var/jenkins') { - timeout(time: 15, unit: 'MINUTES'){ - try{ - dir("projects/composablekernel/script"){ - if (params.RUN_CK_TILE_FMHA_TESTS){ - try{ - unstash "perf_fmha_log_gfx942" - } - catch(Exception err){ - echo "could not locate the FMHA performance logs for gfx942: ${err.getMessage()}." - } - try{ - unstash "perf_fmha_log_gfx90a" - } - catch(Exception err){ - echo "could not locate the FMHA performance logs for gfx90a: ${err.getMessage()}." - } - try{ - unstash "perf_fmha_log_gfx950" - } - catch(Exception err){ - echo "could not locate the FMHA performance logs for gfx950: ${err.getMessage()}." - } - - } - if (params.BUILD_INSTANCES_ONLY){ - // unstash deb packages - try{ - unstash "lib_package" - sh "sshpass -p ${env.ck_deb_pw} scp -o StrictHostKeyChecking=no composablekernel-*.deb ${env.ck_deb_user}@${env.ck_deb_ip}:/var/www/html/composable_kernel/" - } - catch(Exception err){ - echo "could not locate lib_package." - } - } - if (params.BUILD_PACKAGES){ - // unstash deb packages - try{ - unstash "profiler_package_gfx90a" - sh "sshpass -p ${env.ck_deb_pw} scp -o StrictHostKeyChecking=no composablekernel-ckprofiler*.deb ${env.ck_deb_user}@${env.ck_deb_ip}:/var/www/html/composable_kernel/" - } - catch(Exception err){ - echo "could not locate profiler_package_gfx90a." - } - try{ - unstash "profiler_package_gfx942" - sh "sshpass -p ${env.ck_deb_pw} scp -o StrictHostKeyChecking=no composablekernel-ckprofiler*.deb ${env.ck_deb_user}@${env.ck_deb_ip}:/var/www/html/composable_kernel/" - } - catch(Exception err){ - echo "could not locate profiler_package_gfx942." - } - try{ - unstash "profiler_package_gfx950" - sh "sshpass -p ${env.ck_deb_pw} scp -o StrictHostKeyChecking=no composablekernel-ckprofiler*.deb ${env.ck_deb_user}@${env.ck_deb_ip}:/var/www/html/composable_kernel/" - } - catch(Exception err){ - echo "could not locate profiler_package_gfx950." - } - try{ - unstash "profiler_package_gfx12" - sh "sshpass -p ${env.ck_deb_pw} scp -o StrictHostKeyChecking=no composablekernel-ckprofiler*.deb ${env.ck_deb_user}@${env.ck_deb_ip}:/var/www/html/composable_kernel/" - } - catch(Exception err){ - echo "could not locate profiler_package_gfx12." - } - } - else{ - // unstash perf files to master - try{ - unstash "perf_log_gfx90a" - } - catch(Exception err){ - echo "could not locate the gfx90a performance logs: ${err.getMessage()}." - } - try{ - unstash "perf_log_gfx942" - } - catch(Exception err){ - echo "could not locate the gfx942 performance logs: ${err.getMessage()}." - } - try{ - unstash "perf_log_gfx950" - } - catch(Exception err){ - echo "could not locate the gfx950 performance logs: ${err.getMessage()}." - } - try{ - unstash "perf_log_gfx908" - } - catch(Exception err){ - echo "could not locate the gfx908 performance logs: ${err.getMessage()}." - } - try{ - unstash "perf_log_gfx11" - } - catch(Exception err){ - echo "could not locate the gfx11 performance logs: ${err.getMessage()}." - } - try{ - - unstash "perf_log_gfx12" - } - catch(Exception err){ - echo "could not locate the gfx12 performance logs: ${err.getMessage()}." - } - } - // process the logs - sh "./process_perf_data.sh" - } - setGithubStatus("${env.STAGE_NAME}", 'success', "Stage ${env.STAGE_NAME} passed") - } - catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e){ - setGithubStatus("${env.STAGE_NAME}", 'failure', "Stage ${env.STAGE_NAME} failed") - throw e - } - finally{ - echo "Finished processing performance test results" - } - } - } -} - -def run_downstream_tests(Map conf=[:]){ - show_node_info() - checkoutComposableKernel() - def dockerOpts = get_docker_options() + ' --group-add irc ' - - setGithubStatus("${env.STAGE_NAME}", 'pending', "Starting ${env.STAGE_NAME}") - try { - try - { - echo "Pulling image: ${conf.image}" - retimage = docker.image("${conf.image}") - withDockerRegistry([ credentialsId: "ck_docker_cred", url: "" ]) { - retimage.pull() - } - } - catch(Exception ex) - { - error "Unable to locate image: ${conf.image}" - } - } - catch (org.jenkinsci.plugins.workflow.steps.FlowInterruptedException e){ - setGithubStatus("${env.STAGE_NAME}", 'failure', "Stage ${env.STAGE_NAME} failed") - throw e - } - - withDockerContainer(image: conf.image, args: dockerOpts) { - timeout(time: conf.get("timeoutHours", 2), unit: 'HOURS'){ - try{ - sh "rocminfo" - sh "python3 --version" - for (cmd in conf.execute_cmds) { - sh "${cmd}" - } - setGithubStatus("${env.STAGE_NAME}", 'success', "Stage ${env.STAGE_NAME} passed") - } - catch(e){ - echo "Throwing error exception while running ${env.STAGE_NAME}" - echo 'Exception occurred: ' + e.toString() - setGithubStatus("${env.STAGE_NAME}", 'error', "Stage ${env.STAGE_NAME} failed") - throw e - } - finally{ - echo "Finished running ${env.STAGE_NAME}" - } - } - } -} - -def getPytorchTestsCmds() { - return [ - "mkdir pytorch", - "cp -r /var/jenkins/workspace/pytorch/* pytorch/", - "ls -ltr pytorch", - "python3 pytorch/tools/amd_build/build_amd.py", - "cd pytorch && USE_ROCM_CK_SDPA=1 PYTORCH_ROCM_ARCH=gfx942 python3 setup.py develop" - ] -} -def getAiterTestsCmds() { - return [ - "python3 /home/jenkins/workspace/aiter/op_tests/test_gemm_a8w8.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_gemm_a8w8_blockscale.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_mha.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_mha_varlen.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_batch_prefill.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_moe.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_moe_2stage.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_moe_blockscale.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_moe_ep.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_moe_sorting.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_moe_sorting_mxfp4.py", - "python3 /home/jenkins/workspace/aiter/op_tests/test_moe_tkw1.py" - ] -} -def getFaTestsCmds() { - return [ - "python3 -u -m pytest /home/jenkins/workspace/flash-attention/tests/test_flash_attn_ck.py" - ] +def loadCk() { + def branch = (params.USE_CURRENT_BRANCH_FOR_CK_GROOVY + ? (env.CHANGE_BRANCH ?: env.BRANCH_NAME) + : 'develop') + library("ck@${branch}") } //launch develop branch daily jobs @@ -1463,6 +252,10 @@ pipeline { name: "FORCE_CI", defaultValue: false, description: "Force CI to run even when only non-relevant files are changed (default: OFF)") + booleanParam( + name: 'USE_CURRENT_BRANCH_FOR_CK_GROOVY', + defaultValue: false, + description: 'Load ck.groovy from the current branch instead of develop. Enable when testing pipeline changes (default: OFF).') } environment{ dbuser = "${dbuser}" @@ -1477,12 +270,15 @@ pipeline { } stages{ stage("Determine CI Execution") { - agent{ label rocmnode("nogpu") } + agent none steps { script { - checkoutComposableKernel() - env.SHOULD_RUN_CI = String.valueOf(params.FORCE_CI.toBoolean() || shouldRunCICheck()) - echo "SHOULD_RUN_CI: ${env.SHOULD_RUN_CI}" + loadCk() + ck.runOnHealthyNode(rocmnode("nogpu")) { + ck.checkoutComposableKernel() + env.SHOULD_RUN_CI = String.valueOf(params.FORCE_CI.toBoolean() || ck.shouldRunCICheck()) + echo "SHOULD_RUN_CI: ${env.SHOULD_RUN_CI}" + } } } } @@ -1493,11 +289,16 @@ pipeline { } parallel{ stage('Docker /opt/rocm'){ - agent{ label rocmnode("nogpu") } + agent none steps{ - deleteDir() - buildDocker('/opt/rocm') - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("nogpu")) { + deleteDir() + ck.buildDocker('/opt/rocm') + cleanWs() + } + } } } } @@ -1507,48 +308,13 @@ pipeline { beforeAgent true expression { env.SHOULD_RUN_CI.toBoolean() } } - parallel{ - stage('Clang Format and Cppcheck') { - when { - beforeAgent true - expression { params.RUN_CPPCHECK.toBoolean() } - } - agent{ label rocmnode("nogpu") } - environment{ - setup_args = "NO_CK_BUILD" - execute_cmd = """cd .. && \ - find . -type f \\( -name '*.h' -o -name '*.hpp' -o -name '*.cpp' -o -name '*.h.in' -o -name '*.hpp.in' -o -name '*.cpp.in' -o -name '*.cl' \\) \ - -not -path '*/build/*' -not -path '*/include/rapidjson/*' | \ - xargs -P 8 -I{} sh -c 'clang-format-18 -style=file {} | diff -u - {} || (echo "ERROR: {} needs formatting" && exit 1)' && \ - /cppcheck/build/bin/cppcheck ../* -v -j \$(nproc) -I ../include -I ../profiler/include -I ../library/include \ - -D CK_ENABLE_FP64 -D CK_ENABLE_FP32 -D CK_ENABLE_FP16 -D CK_ENABLE_FP8 -D CK_ENABLE_BF16 -D CK_ENABLE_BF8 -D CK_ENABLE_INT8 \ - -D __gfx908__ -D __gfx90a__ -D __gfx942__ -D __gfx1030__ -D __gfx1100__ -D __gfx1101__ -D __gfx1102__ \ - -U __gfx803__ -U __gfx900__ -U __gfx906__ -U CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4 \ - --file-filter=*.cpp --force --enable=all --output-file=ck_cppcheck.log""" - } - steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, setup_cmd: "", build_cmd: "", execute_cmd: execute_cmd) - archiveArtifacts "build/ck_cppcheck.log" - cleanWs() - } - } - stage('Clang Format') { - when { - beforeAgent true - expression { !params.RUN_CPPCHECK.toBoolean() } - } - agent{ label rocmnode("nogpu") } - environment{ - setup_args = "NO_CK_BUILD" - execute_cmd = """cd .. && \ - find . -type f \\( -name '*.h' -o -name '*.hpp' -o -name '*.cpp' -o -name '*.h.in' -o -name '*.hpp.in' -o -name '*.cpp.in' -o -name '*.cl' \\) \ - -not -path '*/build/*' -not -path '*/include/rapidjson/*' | \ - xargs -P 8 -I{} sh -c 'clang-format-18 -style=file {} | diff -u - {} || (echo "ERROR: {} needs formatting" && exit 1)'""" - } - steps{ + agent none + steps{ + script { + loadCk() + ck.runOnHealthyNode(rocmnode("nogpu")) { deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, setup_cmd: "", build_cmd: "", execute_cmd: execute_cmd) + ck.runStaticChecks() cleanWs() } } @@ -1568,10 +334,15 @@ pipeline { beforeAgent true expression { params.RUN_PYTORCH_TESTS.toBoolean() } } - agent{ label rocmnode("gfx942")} + agent none steps{ - run_downstream_tests(image: "${env.CK_PYTORCH_IMAGE}", timeoutHours: 2, execute_cmds: getPytorchTestsCmds()) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx942")) { + ck.run_downstream_tests(image: "${env.CK_PYTORCH_IMAGE}", timeoutHours: 2, execute_cmds: ck.getPytorchTestsCmds()) + cleanWs() + } + } } } stage("Run AITER Tests on gfx942") @@ -1580,10 +351,15 @@ pipeline { beforeAgent true expression { params.RUN_AITER_TESTS.toBoolean() } } - agent{ label rocmnode("gfx942")} + agent none steps{ - run_downstream_tests(image: "${env.CK_AITER_IMAGE}", timeoutHours: 5, execute_cmds: getAiterTestsCmds()) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx942")) { + ck.run_downstream_tests(image: "${env.CK_AITER_IMAGE}", timeoutHours: 5, execute_cmds: ck.getAiterTestsCmds()) + cleanWs() + } + } } } stage("Run AITER Tests on gfx950") @@ -1592,10 +368,15 @@ pipeline { beforeAgent true expression { params.RUN_AITER_TESTS.toBoolean() } } - agent{ label rocmnode("gfx950")} + agent none steps{ - run_downstream_tests(image: "${env.CK_AITER_IMAGE}", timeoutHours: 5, execute_cmds: getAiterTestsCmds()) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx950")) { + ck.run_downstream_tests(image: "${env.CK_AITER_IMAGE}", timeoutHours: 5, execute_cmds: ck.getAiterTestsCmds()) + cleanWs() + } + } } } stage("Run FA Tests on gfx942") @@ -1604,10 +385,15 @@ pipeline { beforeAgent true expression { params.RUN_FA_TESTS.toBoolean() } } - agent{ label rocmnode("gfx942")} + agent none steps{ - run_downstream_tests(image: "${env.CK_FA_IMAGE}", timeoutHours: 5, execute_cmds: getFaTestsCmds()) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx942")) { + ck.run_downstream_tests(image: "${env.CK_FA_IMAGE}", timeoutHours: 5, execute_cmds: ck.getFaTestsCmds()) + cleanWs() + } + } } } stage("Run FA Tests on gfx950") @@ -1616,10 +402,15 @@ pipeline { beforeAgent true expression { params.RUN_FA_TESTS.toBoolean() } } - agent{ label rocmnode("gfx950")} + agent none steps{ - run_downstream_tests(image: "${env.CK_FA_IMAGE}", timeoutHours: 5, execute_cmds: getFaTestsCmds()) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx950")) { + ck.run_downstream_tests(image: "${env.CK_FA_IMAGE}", timeoutHours: 5, execute_cmds: ck.getFaTestsCmds()) + cleanWs() + } + } } } } @@ -1638,19 +429,16 @@ pipeline { beforeAgent true expression { params.RUN_FULL_CONV_TILE_TESTS.toBoolean() } } - agent{ label rocmnode("gfx90a")} - environment{ - setup_args = "NO_CK_BUILD" - execute_args = """ python3 ../experimental/grouped_convolution_tile_instances/generate_instances.py --mode=profiler && \ - cmake .. --preset dev-gfx90a -D CK_EXPERIMENTAL_BUILDER=ON && \ - make -j64 test_grouped_convnd_fwd_tile test_grouped_convnd_bwd_weight_tile && \ - ./bin/test_grouped_convnd_bwd_weight_tile && \ - ./bin/test_grouped_convnd_fwd_tile""" - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx90a")) { + deleteDir() + ck.runFullGroupedConvTileTests() + cleanWs() + } + } } } } @@ -1669,17 +457,16 @@ pipeline { beforeAgent true expression { params.RUN_GROUPED_CONV_LARGE_CASES_TESTS.toBoolean() } } - agent{ label rocmnode("gfx90a")} - environment{ - setup_args = "NO_CK_BUILD" - execute_args = """ cmake .. --preset dev-gfx90a && \ - make -j64 test_grouped_convnd_fwd_large_cases test_grouped_convnd_bwd_data_large_cases test_grouped_convnd_fwd_bias_clamp_large_cases && \ - ./bin/test_grouped_convnd_fwd_large_cases && ./bin/test_grouped_convnd_bwd_data_large_cases && ./bin/test_grouped_convnd_fwd_bias_clamp_large_cases""" - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx90a")) { + deleteDir() + ck.runGroupedConvLargeCaseTests() + cleanWs() + } + } } } } @@ -1698,29 +485,16 @@ pipeline { beforeAgent true expression { params.RUN_CONV_COMPREHENSIVE_DATASET.toBoolean() } } - agent{ label rocmnode("gfx90a")} - environment{ - setup_args = "NO_CK_BUILD" - execute_args = """ cd ../build && \ - cmake .. --preset dev-gfx90a && \ - make -j64 test_grouped_convnd_fwd_dataset_xdl && \ - test_grouped_convnd_bwd_data_dataset_xdl \ - test_grouped_convnd_bwd_weight_dataset_xdl && \ - cd ../test_data && \ - # Dataset generation modes: - # - small: ~60 test cases (minimal, quick testing - 3 models, 2 batch sizes, 2 image sizes) - # - half: ~300 test cases (moderate coverage - 16 models, 3 batch sizes, 5 image sizes), ~ 17 hours testing time - # - full: ~600 test cases (comprehensive - 16 models, 5 batch sizes, 9 image sizes), ~ 40 hours testing time - ./generate_test_dataset.sh small && \ - cd ../build && \ - ./bin/test_grouped_convnd_fwd_dataset_xdl && \ - ./bin/test_grouped_convnd_bwd_data_dataset_xdl && \ - ./bin/test_grouped_convnd_bwd_weight_dataset_xdl""" - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx90a")) { + deleteDir() + ck.runComprehensiveConvDatasetTests() + cleanWs() + } + } } } } @@ -1739,15 +513,16 @@ pipeline { beforeAgent true expression { params.RUN_CK_TILE_FMHA_TESTS.toBoolean() } } - agent{ label rocmnode("gfx90a") } - environment{ - setup_args = "NO_CK_BUILD" - execute_args = build_and_run_fmha("gfx90a") - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx90a")) { + deleteDir() + ck.buildAndTest(setup_args: "NO_CK_BUILD", build_type: 'Release', execute_cmd: ck.build_and_run_fmha("gfx90a")) + cleanWs() + } + } } } stage("Run CK_TILE_FMHA Tests on gfx942") @@ -1756,15 +531,16 @@ pipeline { beforeAgent true expression { params.RUN_CK_TILE_FMHA_TESTS.toBoolean() } } - agent{ label rocmnode("gfx942") } - environment{ - setup_args = "NO_CK_BUILD" - execute_args = build_and_run_fmha("gfx942") - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx942")) { + deleteDir() + ck.buildAndTest(setup_args: "NO_CK_BUILD", build_type: 'Release', execute_cmd: ck.build_and_run_fmha("gfx942")) + cleanWs() + } + } } } stage("Run CK_TILE_FMHA Tests on gfx950") @@ -1773,15 +549,16 @@ pipeline { beforeAgent true expression { params.RUN_CK_TILE_FMHA_TESTS.toBoolean() } } - agent{ label rocmnode("gfx950") } - environment{ - setup_args = "NO_CK_BUILD" - execute_args = build_and_run_fmha("gfx950") - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx950")) { + deleteDir() + ck.buildAndTest(setup_args: "NO_CK_BUILD", build_type: 'Release', execute_cmd: ck.build_and_run_fmha("gfx950")) + cleanWs() + } + } } } stage("Run CK_TILE_FMHA Tests on gfx1201") @@ -1790,15 +567,16 @@ pipeline { beforeAgent true expression { params.RUN_CK_TILE_FMHA_TESTS.toBoolean() } } - agent{ label rocmnode("gfx1201") } - environment{ - setup_args = "NO_CK_BUILD" - execute_args = build_and_run_fmha("gfx1201") - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx1201")) { + deleteDir() + ck.buildAndTest(setup_args: "NO_CK_BUILD", build_type: 'Release', execute_cmd: ck.build_and_run_fmha("gfx1201")) + cleanWs() + } + } } } } @@ -1817,32 +595,16 @@ pipeline { beforeAgent true expression { params.RUN_TILE_ENGINE_BASIC_TESTS.toBoolean() } } - agent{ label rocmnode("gfx942") } - environment{ - setup_args = "NO_CK_BUILD" - execute_args = """ cmake -G Ninja -D CMAKE_PREFIX_PATH=/opt/rocm \ - -D BUILD_CK_TILE_ENGINE="ON" \ - -D CMAKE_CXX_COMPILER="${params.BUILD_COMPILER}" \ - -D CMAKE_BUILD_TYPE=Release \ - -D GPU_TARGETS="gfx942" \ - -D GEMM_UNIVERSAL_DATATYPE="fp8;fp16" \ - -D GEMM_UNIVERSAL_LAYOUT="rcr;rrr;crr;ccr" \ - -D GEMM_UNIVERSAL_CONFIG_FILE="default_ci_config.json" \ - -D GEMM_MULTI_D_DATATYPE="fp16" \ - -D GEMM_MULTI_D_LAYOUT="rcrr;rrrr;crrr;ccrr" \ - -D GEMM_MULTI_D_CONFIG_FILE="default_ci_config.json" \ - -D GEMM_PRESHUFFLE_DATATYPE="fp16;fp8;bf16;bf8" \ - -D GEMM_PRESHUFFLE_LAYOUT="rcr" \ - -D GEMM_PRESHUFFLE_CONFIG_FILE="default_ci_config.json" .. && \ - ninja -j${nthreads()} benchmark_gemm_universal_all benchmark_gemm_preshuffle_all benchmark_gemm_multi_d_all && \ - python3 ../tile_engine/ops/gemm/gemm_universal/gemm_universal_benchmark.py . --problem-sizes "1024,1024,1024" --warmup 5 --repeat 5 --verbose --json results.json && \ - python3 ../tile_engine/ops/gemm/gemm_preshuffle/gemm_preshuffle_benchmark.py . --problem-sizes "1024,1024,1024" --warmup 5 --repeat 5 --verbose --json results.json && \ - python3 ../tile_engine/ops/gemm/gemm_multi_d/gemm_multi_d_benchmark.py . --problem-sizes "1024,1024,1024" --warmup 5 --repeat 5 --verbose --json results.json """ - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx942")) { + deleteDir() + ck.runTileEngineBasicTests(params.BUILD_COMPILER) + cleanWs() + } + } } } } @@ -1861,35 +623,16 @@ pipeline { beforeAgent true expression { params.RUN_TILE_ENGINE_GEMM_TESTS.toBoolean() } } - agent{ label rocmnode("gfx942") } - environment{ - setup_args = "NO_CK_BUILD" - execute_args = """ cmake -G Ninja -D CMAKE_PREFIX_PATH=/opt/rocm \ - -D BUILD_CK_TILE_ENGINE="ON" \ - -D CMAKE_CXX_COMPILER="${params.BUILD_COMPILER}" \ - -D CMAKE_BUILD_TYPE=Release \ - -D GPU_TARGETS="gfx942" \ - -D GEMM_UNIVERSAL_DATATYPE="fp8;fp16;bf8;bf16" \ - -D GEMM_UNIVERSAL_LAYOUT="rcr;rrr;crr;ccr" \ - -D GEMM_STREAMK_DATATYPE="fp8;fp16" \ - -D GEMM_STREAMK_LAYOUT="rcr" \ - -D GEMM_MULTI_D_DATATYPE="fp16" \ - -D GEMM_MULTI_D_LAYOUT="rcrr;rrrr;crrr;ccrr" \ - -D GEMM_PRESHUFFLE_DATATYPE="fp16;fp8;bf16;bf8" \ - -D GEMM_PRESHUFFLE_LAYOUT="rcr" \ - -D GROUPED_GEMM_DATATYPE="fp8;fp16" \ - -D GROUPED_GEMM_LAYOUT="rcr;rrr;crr;ccr" \ - -D TILE_ENGINE_SAMPLING_TIER=daily .. && \ - ninja -j${nthreads()} benchmark_gemm_universal_all benchmark_gemm_preshuffle_all benchmark_gemm_multi_d_all benchmark_gemm_streamk_all benchmark_grouped_gemm_all && \ - python3 ../tile_engine/ops/gemm/gemm_universal/gemm_universal_benchmark.py . --problem-sizes "1024,1024,1024" --warmup 5 --repeat 5 --verbose --json gemm_universal_results.json && \ - python3 ../tile_engine/ops/gemm/gemm_preshuffle/gemm_preshuffle_benchmark.py . --problem-sizes "1024,1024,1024" --warmup 5 --repeat 5 --verbose --json results.json && \ - python3 ../tile_engine/ops/gemm/gemm_multi_d/gemm_multi_d_benchmark.py . --problem-sizes "1024,1024,1024" --warmup 5 --repeat 5 --verbose --json results.json && \ - python3 ../tile_engine/ops/gemm/grouped_gemm/grouped_gemm_benchmark.py . --problem-sizes "1024,1024,1024" --group-counts 8 --warmup 5 --repeat 5 --verbose --json grouped_gemm_results.json """ - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx942")) { + deleteDir() + ck.runTileEngineGemmTests("gfx942", params.BUILD_COMPILER) + cleanWs() + } + } } } stage("Run TILE_ENGINE_GEMM Tests on gfx950") @@ -1898,30 +641,16 @@ pipeline { beforeAgent true expression { params.RUN_TILE_ENGINE_GEMM_TESTS.toBoolean() } } - agent{ label rocmnode("gfx950") } - environment{ - setup_args = "NO_CK_BUILD" - execute_args = """ cmake -G Ninja -D CMAKE_PREFIX_PATH=/opt/rocm \ - -D BUILD_CK_TILE_ENGINE="ON" \ - -D CMAKE_CXX_COMPILER="${params.BUILD_COMPILER}" \ - -D CMAKE_BUILD_TYPE=Release \ - -D GPU_TARGETS="gfx950" \ - -D GEMM_UNIVERSAL_DATATYPE="fp8;fp16" \ - -D GEMM_UNIVERSAL_LAYOUT="rcr;rrr;crr;ccr" \ - -D GEMM_MULTI_D_DATATYPE="fp16" \ - -D GEMM_MULTI_D_LAYOUT="rcrr;rrrr;crrr;ccrr" \ - -D GEMM_PRESHUFFLE_DATATYPE="fp16;fp8;bf16;bf8" \ - -D GEMM_PRESHUFFLE_LAYOUT="rcr" \ - -D TILE_ENGINE_SAMPLING_TIER=daily .. && \ - ninja -j${nthreads()} benchmark_gemm_universal_all benchmark_gemm_preshuffle_all benchmark_gemm_multi_d_all && \ - python3 ../tile_engine/ops/gemm/gemm_universal/gemm_universal_benchmark.py . --problem-sizes "1024,1024,1024" --warmup 5 --repeat 5 --verbose --json results.json && \ - python3 ../tile_engine/ops/gemm/gemm_preshuffle/gemm_preshuffle_benchmark.py . --problem-sizes "1024,1024,1024" --warmup 5 --repeat 5 --verbose --json results.json && \ - python3 ../tile_engine/ops/gemm/gemm_multi_d/gemm_multi_d_benchmark.py . --problem-sizes "1024,1024,1024" --warmup 5 --repeat 5 --verbose --json results.json """ - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx950")) { + deleteDir() + ck.runTileEngineGemmTests("gfx950", params.BUILD_COMPILER) + cleanWs() + } + } } } stage("Run TILE_ENGINE_GEMM Tests on gfx1201") @@ -1930,24 +659,16 @@ pipeline { beforeAgent true expression { params.RUN_TILE_ENGINE_GEMM_TESTS.toBoolean() } } - agent{ label rocmnode("gfx1201") } - environment{ - setup_args = "NO_CK_BUILD" - execute_args = """ cmake -G Ninja -D CMAKE_PREFIX_PATH=/opt/rocm \ - -D BUILD_CK_TILE_ENGINE="ON" \ - -D CMAKE_CXX_COMPILER="${params.BUILD_COMPILER}" \ - -D CMAKE_BUILD_TYPE=Release \ - -D GPU_TARGETS="gfx1201" \ - -D GEMM_UNIVERSAL_DATATYPE="fp16" \ - -D GEMM_UNIVERSAL_LAYOUT="rcr;rrr;crr;ccr" \ - -D TILE_ENGINE_SAMPLING_TIER=daily .. && \ - ninja -j${nthreads()} benchmark_gemm_universal_all && \ - python3 ../tile_engine/ops/gemm/gemm_universal/gemm_universal_benchmark.py . --problem-sizes "1024,1024,1024" --warmup 5 --repeat 5 --verbose --json results.json """ - } + agent none steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args:setup_args, build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx1201")) { + deleteDir() + ck.runTileEngineGemmTests("gfx1201", params.BUILD_COMPILER) + cleanWs() + } + } } } } @@ -1967,15 +688,16 @@ pipeline { beforeAgent true expression { (params.BUILD_GFX942.toBoolean() || params.RUN_FULL_QA.toBoolean()) && !params.BUILD_INSTANCES_ONLY.toBoolean() } } - agent{ label rocmnode("gfx942") } - environment{ - setup_args = """ -DCMAKE_INSTALL_PREFIX=../install -DGPU_TARGETS="gfx942" """ - execute_args = build_client_examples("gfx942") - } + agent none steps{ - deleteDir() - Build_CK_and_Reboot(setup_args: setup_args, config_targets: "install", build_type: 'Release', execute_cmd: execute_args, prefixpath: '/usr/local') - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx942")) { + deleteDir() + ck.runBuildCKAndTests("gfx942") + cleanWs() + } + } } } stage("Build CK and run Tests on gfx950") @@ -1984,15 +706,16 @@ pipeline { beforeAgent true expression { params.BUILD_GFX950.toBoolean() && !params.BUILD_INSTANCES_ONLY.toBoolean() } } - agent{ label rocmnode("gfx950") } - environment{ - setup_args = """ -DCMAKE_INSTALL_PREFIX=../install -DGPU_TARGETS="gfx950" """ - execute_args = build_client_examples("gfx950") - } + agent none steps{ - deleteDir() - Build_CK_and_Reboot(setup_args: setup_args, config_targets: "install", build_type: 'Release', execute_cmd: execute_args, prefixpath: '/usr/local') - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx950")) { + deleteDir() + ck.runBuildCKAndTests("gfx950") + cleanWs() + } + } } } /* @@ -2003,13 +726,9 @@ pipeline { expression { params.BUILD_GFX908.toBoolean() && !params.RUN_FULL_QA.toBoolean() && !params.BUILD_INSTANCES_ONLY.toBoolean() } } agent{ label rocmnode("gfx908") } - environment{ - setup_args = """ -DCMAKE_INSTALL_PREFIX=../install -DGPU_TARGETS="gfx908" """ - execute_args = build_client_examples("gfx908") - } steps{ deleteDir() - Build_CK_and_Reboot(setup_args: setup_args, config_targets: "install", build_type: 'Release', execute_cmd: execute_args, prefixpath: '/usr/local') + script { loadCk(); ck.runBuildCKAndTests("gfx908") } cleanWs() } } @@ -2020,15 +739,16 @@ pipeline { beforeAgent true expression { params.BUILD_GFX90A.toBoolean() && !params.RUN_FULL_QA.toBoolean() && !params.BUILD_INSTANCES_ONLY.toBoolean() } } - agent{ label rocmnode("gfx90a") } - environment{ - setup_args = """ -DCMAKE_INSTALL_PREFIX=../install -DGPU_TARGETS="gfx90a" -DCK_CXX_STANDARD="17" """ - execute_args = build_client_examples_and_codegen_tests("gfx90a") - } + agent none steps{ - deleteDir() - Build_CK_and_Reboot(setup_args: setup_args, config_targets: "install", build_type: 'Release', execute_cmd: execute_args, prefixpath: '/usr/local') - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx90a")) { + deleteDir() + ck.runBuildCKAndTests("gfx90a") + cleanWs() + } + } } } stage("Build CK instances for all supported targets") @@ -2037,7 +757,7 @@ pipeline { beforeAgent true expression { params.BUILD_INSTANCES_ONLY.toBoolean() && !params.RUN_FULL_QA.toBoolean() } } - agent{ label rocmnode("gfx942") } + agent none environment{ setup_args = "NO_CK_BUILD" execute_args = """ cmake -G Ninja -D CMAKE_PREFIX_PATH=/opt/rocm \ @@ -2047,9 +767,14 @@ pipeline { -D CMAKE_BUILD_TYPE=Release .. && ninja -j64 """ } steps{ - deleteDir() - buildHipClangJobAndReboot(setup_args: setup_args, build_cmd: "", build_type: 'Release', execute_cmd: execute_args) - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx942")) { + deleteDir() + ck.runBuildInstancesOnly(params.BUILD_COMPILER) + cleanWs() + } + } } } /* @@ -2060,13 +785,9 @@ pipeline { expression { params.BUILD_GFX101.toBoolean() && !params.RUN_FULL_QA.toBoolean() && !params.BUILD_INSTANCES_ONLY.toBoolean() } } agent{ label rocmnode("gfx1010") } - environment{ - setup_args = """ -DCMAKE_INSTALL_PREFIX=../install -DGPU_TARGETS="gfx10-1-generic" """ - execute_args = build_client_examples("gfx10-1-generic") - } steps{ deleteDir() - Build_CK_and_Reboot(setup_args: setup_args, config_targets: "install", build_type: 'Release', execute_cmd: execute_args, prefixpath: '/usr/local') + script { loadCk(); ck.runBuildCKAndTests("gfx10-1-generic") } cleanWs() } } @@ -2077,15 +798,16 @@ pipeline { beforeAgent true expression { params.BUILD_GFX103.toBoolean() && !params.RUN_FULL_QA.toBoolean() && !params.BUILD_INSTANCES_ONLY.toBoolean() } } - agent{ label rocmnode("gfx1030") } - environment{ - setup_args = """ -DCMAKE_INSTALL_PREFIX=../install -DGPU_TARGETS="gfx10-3-generic" """ - execute_args = build_client_examples("gfx10-3-generic") - } + agent none steps{ - deleteDir() - Build_CK_and_Reboot(setup_args: setup_args, config_targets: "install", build_type: 'Release', execute_cmd: execute_args, prefixpath: '/usr/local') - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx1030")) { + deleteDir() + ck.runBuildCKAndTests("gfx10-3-generic") + cleanWs() + } + } } } stage("Build CK and run Tests on gfx11") @@ -2094,15 +816,16 @@ pipeline { beforeAgent true expression { params.BUILD_GFX11.toBoolean() && !params.RUN_FULL_QA.toBoolean() && !params.BUILD_INSTANCES_ONLY.toBoolean() } } - agent{ label 'miopen && (gfx1101 || gfx1100)' } - environment{ - setup_args = """ -DCMAKE_INSTALL_PREFIX=../install -DGPU_TARGETS="gfx11-generic" """ - execute_args = build_client_examples("gfx11-generic") - } + agent none steps{ - deleteDir() - Build_CK_and_Reboot(setup_args: setup_args, config_targets: "install", build_type: 'Release', execute_cmd: execute_args, prefixpath: '/usr/local') - cleanWs() + script { + loadCk() + ck.runOnHealthyNode('miopen && (gfx1101 || gfx1100)') { + deleteDir() + ck.runBuildCKAndTests("gfx11-generic") + cleanWs() + } + } } } stage("Build CK and run Tests on gfx1201") @@ -2111,15 +834,16 @@ pipeline { beforeAgent true expression { params.BUILD_GFX12.toBoolean() && !params.RUN_FULL_QA.toBoolean() && !params.BUILD_INSTANCES_ONLY.toBoolean() } } - agent{ label rocmnode("gfx1201") } - environment{ - setup_args = """ -DCMAKE_INSTALL_PREFIX=../install -DGPU_TARGETS="gfx12-generic" """ - execute_args = build_client_examples("gfx12-generic") - } + agent none steps{ - deleteDir() - Build_CK_and_Reboot(setup_args: setup_args, config_targets: "install", build_type: 'Release', execute_cmd: execute_args, prefixpath: '/usr/local') - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx1201")) { + deleteDir() + ck.runBuildCKAndTests("gfx12-generic") + cleanWs() + } + } } } stage("Build CK for gfx1250") @@ -2128,14 +852,16 @@ pipeline { beforeAgent true expression { params.BUILD_GFX1250.toBoolean() && !params.RUN_FULL_QA.toBoolean() && !params.BUILD_INSTANCES_ONLY.toBoolean() } } - agent{ label rocmnode("gfx90a") } - environment{ - setup_args = """ -DCMAKE_INSTALL_PREFIX=../install -DGPU_TARGETS="gfx1250" -DDISABLE_DL_KERNELS="ON" """ - } + agent none steps{ - deleteDir() - Build_CK_and_Reboot(setup_args: setup_args, docker_name: "${env.CK_DOCKERHUB_PRIVATE}:npi-mi450-latest", config_targets: "install", no_reboot:true, build_type: 'Release', prefixpath: '/usr/local') - cleanWs() + script { + loadCk() + ck.runOnHealthyNode(rocmnode("gfx90a")) { + deleteDir() + ck.runBuildCKAndTests("gfx1250") + cleanWs() + } + } } } } @@ -2143,12 +869,13 @@ pipeline { always { node(rocmnode("nogpu")) { script { + loadCk() // Simulate capture - generateAndArchiveBuildTraceVisualization("ck_build_trace_gfx11.json") - generateAndArchiveBuildTraceVisualization("ck_build_trace_gfx12.json") - generateAndArchiveBuildTraceVisualization("ck_build_trace_gfx90a.json") - generateAndArchiveBuildTraceVisualization("ck_build_trace_gfx942.json") - generateAndArchiveBuildTraceVisualization("ck_build_trace_gfx950.json") + ck.generateAndArchiveBuildTraceVisualization("ck_build_trace_gfx11.json") + ck.generateAndArchiveBuildTraceVisualization("ck_build_trace_gfx12.json") + ck.generateAndArchiveBuildTraceVisualization("ck_build_trace_gfx90a.json") + ck.generateAndArchiveBuildTraceVisualization("ck_build_trace_gfx942.json") + ck.generateAndArchiveBuildTraceVisualization("ck_build_trace_gfx950.json") } cleanWs() } @@ -2156,8 +883,9 @@ pipeline { success { script { node(rocmnode("nogpu")) { + loadCk() // Report the parent stage build ck and run tests status - setGithubStatus("${env.STAGE_NAME}", 'success', "Stage ${env.STAGE_NAME} passed") + ck.setGithubStatus("${env.STAGE_NAME}", 'success', "Stage ${env.STAGE_NAME} passed") echo "Reporting success status for build ck and run tests" } } @@ -2176,7 +904,10 @@ pipeline { agent { label 'mici' } steps{ deleteDir() - process_results() + script { + loadCk() + ck.process_results() + } cleanWs() } } @@ -2185,8 +916,9 @@ pipeline { success { script { node(rocmnode("nogpu")) { + loadCk() // Report the skipped parent's stage status - setGithubStatus("${env.STAGE_NAME}", 'success', "Stage ${env.STAGE_NAME} passed") + ck.setGithubStatus("${env.STAGE_NAME}", 'success', "Stage ${env.STAGE_NAME} passed") echo "Process Performance Test Results stage skipped." } } @@ -2198,17 +930,17 @@ pipeline { success { script { node(rocmnode("nogpu")) { - setGithubStatus('Math CI Summary', 'success', "Math CI passed") + loadCk() + ck.setGithubStatus('Math CI Summary', 'success', "Math CI passed") } } } failure { script { node(rocmnode("nogpu")) { - setGithubStatus('Math CI Summary', 'failure', "Math CI failed") - script { - checkoutComposableKernel() - } + loadCk() + ck.setGithubStatus('Math CI Summary', 'failure', "Math CI failed") + ck.checkoutComposableKernel() withCredentials([string(credentialsId: 'ck_ci_errors_webhook_url', variable: 'WEBHOOK_URL')]) { sh 'bash projects/composablekernel/script/infra_helper/send_failure_notifications.sh' } diff --git a/README.md b/README.md index d48f7ed6765..9d5affa13a9 100644 --- a/README.md +++ b/README.md @@ -230,7 +230,7 @@ Additional cmake flags can be used to significantly speed-up the build: These instances offer a slightly better performance of fp16 gemms on NAVI2x. But on other architectures faster alternatives are available. * `CK_USE_FP8_ON_UNSUPPORTED_ARCH` (default is OFF) must be set to ON in order to build instances, - such as `gemm_universal`, `gemm_universal_streamk` and `gemm_multiply_multiply` for fp8 data type for GPU targets which do not have native support for fp8 data type, such as gfx908 or gfx90a. These instances are useful on + such as `gemm_universal`, and `gemm_multiply_multiply` for fp8 data type for GPU targets which do not have native support for fp8 data type, such as gfx908 or gfx90a. These instances are useful on architectures like the MI100/MI200 for the functional support only. ## Using sccache for building diff --git a/client_example/01_gemm/README.md b/client_example/01_gemm/README.md index 6ff4958cee2..fd457265f8d 100644 --- a/client_example/01_gemm/README.md +++ b/client_example/01_gemm/README.md @@ -139,8 +139,6 @@ Table of supported cases by instance factory with XDL instruction for Row/Row/Ro * **DeviceGemmMultipleDLayernorm** - GEMM fused with layernorm. * **DeviceGemmMultipleDMultipleR** - GEMM fused with reductions and custom global reductions operators. * **DeviceGemmReduce** - GEMM fused with reduction. -* **DeviceGemm_Streamk_V2** - GEMM stream K implementation. Implementation allows to use reduction instead of AtomicAdd. -* **DeviceGemmStreamK** - GEMM stream K implementation using AtomicAdd. ## How to Run diff --git a/cmake/EnableCompilerWarnings.cmake b/cmake/EnableCompilerWarnings.cmake index 9cc960cc234..2f9a04f4855 100644 --- a/cmake/EnableCompilerWarnings.cmake +++ b/cmake/EnableCompilerWarnings.cmake @@ -50,6 +50,10 @@ else() -Wsign-compare -Wno-extra-semi-stmt -Wno-unused-template + -Wno-lifetime-safety-intra-tu-suggestions + -Wno-lifetime-safety-cross-tu-suggestions + -Wno-lifetime-safety-lifetimebound-violation + -Wno-unknown-warning-option ) if (CMAKE_${COMPILER}_COMPILER_ID MATCHES "Clang") list(APPEND CMAKE_COMPILER_WARNINGS @@ -76,6 +80,10 @@ else() -Wno-unsafe-buffer-usage -Wno-unused-lambda-capture -Wno-nvcc-compat + -Wno-lifetime-safety-intra-tu-suggestions + -Wno-lifetime-safety-cross-tu-suggestions + -Wno-lifetime-safety-lifetimebound-violation + -Wno-unknown-warning-option ) if(CK_CXX_STANDARD GREATER_EQUAL 20) list(APPEND CMAKE_COMPILER_WARNINGS -Wno-c++20-compat) diff --git a/cmake/TestUtilities.cmake b/cmake/TestUtilities.cmake new file mode 100644 index 00000000000..f95570b3984 --- /dev/null +++ b/cmake/TestUtilities.cmake @@ -0,0 +1,30 @@ +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +# Helper function to conditionally link device_conv libraries only if they exist as targets. +# This is useful when device_conv libraries may be filtered out based on GPU targets, +# DTYPES, or build configuration flags. +# +# Usage: +# target_link_device_conv_libraries_if_exist(my_test PRIVATE utility device_conv2d_nhwgc_operations ...) +# +# Only device_conv* libraries are checked with if(TARGET). +# All other libraries (utility, gtest_main, etc.) are always linked. +function(target_link_device_conv_libraries_if_exist TARGET_NAME VISIBILITY) + set(_libs_to_link) + foreach(lib ${ARGN}) + if(lib MATCHES "^device_conv") + # Only add device_conv libraries if they exist + if(TARGET ${lib}) + list(APPEND _libs_to_link ${lib}) + endif() + else() + # Always add non-device_conv libraries + list(APPEND _libs_to_link ${lib}) + endif() + endforeach() + # Single target_link_libraries call with all libraries + if(_libs_to_link) + target_link_libraries(${TARGET_NAME} ${VISIBILITY} ${_libs_to_link}) + endif() +endfunction() diff --git a/cmake/getopt.cmake b/cmake/getopt.cmake index 51aa5994be1..45f74c56a1d 100644 --- a/cmake/getopt.cmake +++ b/cmake/getopt.cmake @@ -9,7 +9,7 @@ if(WIN32) FetchContent_Declare( getopt GIT_REPOSITORY https://github.com/apwojcik/getopt.git - GIT_TAG main + GIT_TAG e8531ed21b44f5a723c1dd700701b2a58ce3ea01 SYSTEM ) @@ -25,4 +25,5 @@ if(WIN32) target_link_libraries(getopt::getopt INTERFACE wingetopt) target_include_directories(getopt::getopt INTERFACE ${getopt_SOURCE_DIR}/src) -endif() \ No newline at end of file +endif() + diff --git a/dispatcher/CMakeLists.txt b/dispatcher/CMakeLists.txt index ed9b20d33c9..79bdde45e87 100644 --- a/dispatcher/CMakeLists.txt +++ b/dispatcher/CMakeLists.txt @@ -59,7 +59,7 @@ endif() # Compiler warnings if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(ck_tile_dispatcher PRIVATE - -Wall -Wextra -Wpedantic + -Wall -Wextra -Wpedantic -Wno-lifetime-safety-intra-tu-suggestions -Wno-lifetime-safety-cross-tu-suggestions -Wno-lifetime-safety-lifetimebound-violation -Wno-unknown-warning-option ) elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") target_compile_options(ck_tile_dispatcher PRIVATE diff --git a/dispatcher/README.md b/dispatcher/README.md index 307e6123053..19b97a91bbd 100644 --- a/dispatcher/README.md +++ b/dispatcher/README.md @@ -4,6 +4,8 @@ A unified kernel dispatch system for AMD GPUs with C++ and Python frontends, sup **Validated Platform:** AMD Instinct MI300 series (gfx942) +> **Stream-K GEMM:** see [STREAMK.md](STREAMK.md) for how to generate, build, run, and +> test the Stream-K deep-core path (atomic/linear/tree reductions). --- diff --git a/dispatcher/STREAMK.md b/dispatcher/STREAMK.md new file mode 100644 index 00000000000..4832bca2969 --- /dev/null +++ b/dispatcher/STREAMK.md @@ -0,0 +1,230 @@ +# Stream-K GEMM (Dispatcher Deep-Core Path) + +Stream-K is a single GEMM that splits the **K** dimension across compute units (CUs) +and reduces the partial results, instead of giving each CU a whole output tile. It +keeps every CU busy on shapes where a classic data-parallel tiling would leave some +idle (tall-skinny / large-K problems), at the cost of a reduction step. + +This document explains how to **generate**, **build**, **run**, and **test** the +Stream-K kernels through the CK Tile dispatcher. + +> **Validated platform:** AMD Instinct MI300X (gfx942). See [Known limitations](#known-limitations) +> for gfx950 (MI350) status. + +--- + +## Why Stream-K needs its own path + +A plain GEMM rides `Dispatcher::run(A, B, C, problem)`. Stream-K cannot use that +signature unchanged: it needs a **reduction workspace** and a **reduction strategy**, +so its host args type (`ck_tile::StreamKHostArgs`) is ABI-incompatible with the +regular `GemmHostArgs`. The deep-core path makes Stream-K ride the registry anyway: + +``` +codegen (unified_gemm_codegen.py) + -> generated Stream-K kernel + dispatcher wrapper + -> Registry::register_kernel(GeneratedStreamKKernelInstance) + -> Dispatcher::select_kernel(Problem.streamk + reduction_strategy) + -> GeneratedStreamKKernelInstance::run() (Dispatcher owns the workspace) + -> SelectedKernel::launch(StreamKHostArgs, cfg, workspace) +``` + +### Reduction strategies + +The reduction strategy is a **compile-time** property, so each strategy is a +*distinct kernel*. The registry holds all three side by side and the dispatcher +selects by `Problem::reduction_strategy`: + +| Strategy | Workspace | Identifier suffix | Notes | +|---|---|---|---| +| `atomic` | none | `_streamk` | partials accumulate directly into C via atomics | +| `linear` | yes | `_streamk_linear` | partials reduced through a device workspace, in order | +| `tree` | yes | `_streamk_tree` | tree reduction through a device workspace | + +### Supported datatypes / layouts + +- **Datatypes:** `fp16`, `bf16`, `fp8`, `bf8`. (`fp32`/`fp64` have no MFMA warp tiles; + `int8` Stream-K is out of scope for this path.) +- **Layouts:** `rcr`, `rrr`, `ccr`, `crr` — A/B in either order, **C is row-major** + (the atomic C-reset relies on it). + +--- + +## Prerequisites + +A full ROCm toolchain with HIP headers (`hip/hip_runtime.h`) and `hipcc`. Bare SLURM +compute nodes on the cluster often ship an incomplete ROCm, so build inside the CK +ROCm container, e.g.: + +```bash +# on a GPU node (pyxis/enroot), mounting your home: +srun --jobid= --overlap \ + --container-image=/cluster/images/ck/ck_rocm7.1.1_therock_.sqsh \ + --container-mounts=$HOME:$HOME \ + bash -lc '' +``` + +--- + +> All commands below are run from the dispatcher root +> (`projects/composablekernel/dispatcher`). + +## 1. Generate a Stream-K kernel + +The codegen emits all three reduction-strategy headers from one tile config: + +```bash +python3 codegen/unified_gemm_codegen.py \ + --datatype fp16 --layout rcr \ + --gpu-target gfx942 \ + --variants stream_k \ + --tile-config-json '{ + "tile_config": {"tile_m":[128],"tile_n":[128],"tile_k":[64], + "warp_m":[2],"warp_n":[2],"warp_k":[1], + "warp_tile_m":[32],"warp_tile_n":[32],"warp_tile_k":[16], + "block_size":[256]}, + "trait_config": {"pipeline":["compv3"],"epilogue":["cshuffle"],"scheduler":["intrawave"], + "pad_m":[false],"pad_n":[false],"pad_k":[false],"persistent":[false]}, + "streamk_config": {"reduction_strategy":["atomic","linear","tree"]} + }' \ + --output-dir ./gen_fp16_rcr +``` + +This produces, per strategy, a header named: + +``` +gemm___compv3_cshuffle_intrawave______.hpp +# variant ∈ { streamk, streamk_linear, streamk_tree } +``` + +Each header force-includes into the global namespace: `SelectedKernel`, +`ADataType/BDataType/CDataType/AccDataType`, `ALayout/BLayout/CLayout`, `KERNEL_NAME`. + +Omit `--tile-config-json` to generate the full arch-filtered tile set instead of a +single config. Use `--show-arch-info` to print what a target GPU supports. + +--- + +## 2a. Run via the standalone driver (`03_streamk_gemm_driver.cpp`) + +Calls `SelectedKernel::launch()` **directly** (bypasses the dispatcher). Use this for +apple-to-apple performance measurement against Tile Engine. + +```bash +HDR=gen_fp16_rcr/gemm_fp16_rcr_compv3_cshuffle_intrawave_False_False_False_False_128x128x64_2x2x1_32x32x16_streamk.hpp + +hipcc -std=c++17 --offload-arch=gfx942 -O3 \ + -DCK_TILE_SINGLE_KERNEL_INCLUDE \ + -I ../include -I gen_fp16_rcr \ + -include "$HDR" \ + examples/gemm/cpp/03_streamk_gemm_driver.cpp -o streamk_gemm_driver + +# performance (cold cache, TE-matched defaults): +./streamk_gemm_driver --m 4096 --n 4096 --k 4096 --validate 0 +# correctness (single cold shot so C matches the reference): +./streamk_gemm_driver --m 4096 --n 4096 --k 4096 --validate 1 +``` + +| Option | Default | Meaning | +|---|---|---| +| `--m/--n/--k` | 3840/4096/2048 | GEMM dims | +| `--warmup` | 50 | warmup iterations (timing) | +| `--repeat` | 100 | timed iterations | +| `--validate` | 1 | verify vs `reference_gemm`; forces 1 cold shot, no rotation | +| `--timer` | 1 | use the GPU timer | +| `--flush_cache` | 1 | flush L2 each iter (cold measurement, like Tile Engine) | +| `--rotating_count` | 1000 | rotating input copies to defeat cache (Tile Engine default) | + +> **Methodology:** leaving the cache warm over-reports TFlops and is the entire +> source of spurious "dispatcher vs Tile Engine" perf gaps. Always measure perf with +> the cold-cache defaults (`--validate 0`); run correctness separately (`--validate 1`). + +--- + +## 2b. Run via the registry/dispatcher (`04_streamk_registry_driver.cpp`) + +Exercises the **full deep-core path**: registers the kernel, lets the dispatcher +select it by `Problem::reduction_strategy`, runs it (dispatcher owns the workspace), +and verifies vs the reference with a **split-K-aware tolerance**. + +```bash +HDR=gen_fp16_rcr/gemm_fp16_rcr_compv3_cshuffle_intrawave_False_False_False_False_128x128x64_2x2x1_32x32x16_streamk.hpp + +# core objects (once, no force-include): +hipcc -std=c++17 --offload-arch=gfx942 -O3 -I ../include -I include -c src/dispatcher.cpp -o dispatcher.o +hipcc -std=c++17 --offload-arch=gfx942 -O3 -I ../include -I include -c src/registry.cpp -o registry.o + +# driver (force-include one strategy's header): +hipcc -std=c++17 --offload-arch=gfx942 -O3 \ + -DCK_TILE_SINGLE_KERNEL_INCLUDE -DGFX_ARCH='"gfx942"' \ + -I ../include -I include -I gen_fp16_rcr -include "$HDR" \ + -c examples/gemm/cpp/04_streamk_registry_driver.cpp -o drv04.o +hipcc --offload-arch=gfx942 drv04.o dispatcher.o registry.o -o streamk_registry_driver + +./streamk_registry_driver --m 3840 --n 4096 --k 2048 --strategy atomic --validate 1 +``` + +| Option | Default | Meaning | +|---|---|---| +| `--m/--n/--k` | 3840/4096/2048 | GEMM dims | +| `--strategy` | atomic | `atomic` / `linear` / `tree` (must match the force-included header) | +| `--validate` | 1 | verify vs `reference_gemm` (split-K-aware rtol/atol) | + +> The registry `run()` path is a functional dispatch path; its `Perf:` line is a +> cold-but-**non-rotated** measurement, **not** the calibrated apple-to-apple surface. +> Use the `03` driver (`--validate 0`) for Tile-Engine-comparable numbers. + +--- + +## 3. Test (CTest) + +The deep-core path is guarded by `test_streamk_registry.py`, which generates, builds, +dispatches, and verifies every `datatype × layout × strategy` against two shapes +(the default plus a small-M/large-K shape that stresses the split-K tolerance). It +**SKIPs** (exit 77) when no GPU or `hipcc` is present. + +```bash +# directly: +python3 tests/test_streamk_registry.py --arch gfx942 +python3 tests/test_streamk_registry.py --arch gfx942 --datatypes fp16,bf16 --layouts rcr,ccr + +# via ctest (from your dispatcher build dir): +ctest -R dispatcher_test_streamk_registry --output-on-failure +``` + +--- + +## Verification tolerance (why Stream-K is special) + +Stream-K reduces `kbatch` partial products into each output element, so the +accumulation error is larger than a single-pass GEMM. The drivers use the same +split-K-aware tolerance as Tile Engine (`calculate_rtol_atol`): `kbatch` is taken +from the kernel's own tile partitioner, and the tolerance is +`max(per-split threshold, split-K-reduction threshold)`. Using the plain +`get_relative/absolute_threshold(K)` here spuriously FAILs correct atomic results on +small-M/N, large-K shapes. + +--- + +## Known limitations + +- **gfx950 (MI350) fp8/bf8 not validated.** On CDNA4 the fp8/bf8 host reference/codec + hits an FNUZ-vs-OCP format mismatch; those combos currently fail verification. fp16 + and bf16 are fine on gfx950. Validate/gate before enabling fp8/bf8 there. +- **Tile coverage is narrower than Tile Engine.** The dispatcher emits fewer Stream-K + tiles than TE (e.g. fp16 `rcr` TE=180 vs DISP=73). Numeric+perf parity is validated + per matched tile config, not over the whole TE tile surface. See the coverage note + at the `STREAM_K` variant in `codegen/unified_gemm_codegen.py`. + +--- + +## File map + +| Path | Role | +|---|---| +| `codegen/unified_gemm_codegen.py` | generates Stream-K kernels + dispatcher wrappers (`--variants stream_k`) | +| `include/ck_tile/dispatcher/backends/generated_tile_backend_streamk.hpp` | `GeneratedStreamKKernelInstance` (registry/workspace/launch glue) | +| `include/ck_tile/dispatcher/kernel_key.hpp` | registry key carrying `streamk` + `reduction_strategy` | +| `examples/gemm/cpp/03_streamk_gemm_driver.cpp` | standalone driver (direct `launch`, perf surface) | +| `examples/gemm/cpp/04_streamk_registry_driver.cpp` | deep-core driver (Registry → Dispatcher → verify) | +| `tests/test_streamk_registry.py` | CTest `dispatcher_test_streamk_registry` | diff --git a/dispatcher/bindings/README.md b/dispatcher/bindings/README.md index e460b38b5b1..407ac7b6978 100644 --- a/dispatcher/bindings/README.md +++ b/dispatcher/bindings/README.md @@ -8,6 +8,7 @@ This directory contains language bindings for the CK Tile Dispatcher. bindings/ |---- ctypes/ # Python ctypes bindings (C API) | |---- gemm_ctypes_lib.cpp # GEMM dispatcher C API +| |---- grouped_gemm_ctypes_lib.cpp # Grouped (multi-problem) GEMM bridge C API -- see GROUPED_GEMM_BRIDGE.md | |---- conv_ctypes_lib.cpp # Grouped conv dispatcher C API (fwd + bwd_data) | |---- conv_bwdw_ctypes_lib.cpp # Grouped conv backward weight C API (separate library) | |---- fmha_ctypes_lib.cpp # FMHA dispatcher C API (fwd + bwd) diff --git a/dispatcher/bindings/ctypes/CMakeLists.txt b/dispatcher/bindings/ctypes/CMakeLists.txt index 18314017f22..e6d637833fe 100644 --- a/dispatcher/bindings/ctypes/CMakeLists.txt +++ b/dispatcher/bindings/ctypes/CMakeLists.txt @@ -9,6 +9,7 @@ # # Targets: # - dispatcher_gemm_lib : GEMM dispatcher library +# - dispatcher_mx_gemm_lib : MX-GEMM (microscaling) dispatcher library (gfx950) # - dispatcher_conv_lib : Convolution dispatcher library (forward + bwd_data) # - dispatcher_conv_bwdw_lib : Convolution backward weight library # - gpu_helper : GPU helper executable for Python @@ -71,6 +72,81 @@ else() target_link_libraries(dispatcher_gemm_lib PRIVATE hip::device) endif() +# ============================================================================= +# MX-GEMM ctypes Library (microscaling GEMM, gfx950/MI350 only) +# ============================================================================= +# +# Force-includes a generated mx_gemm kernel header (SelectedKernel/KERNEL_NAME/ +# MxGemmHostArgs/ScaleType/...). The lib also includes the Old-TE common helper +# (common/utils.hpp) for the free-function is_row_major(Layout), so add the +# tile_engine/ops include roots. + +set(MX_GEMM_TE_INCLUDE_DIRS + ${PROJECT_SOURCE_DIR}/tile_engine/ops + ${PROJECT_SOURCE_DIR}/tile_engine/ops/gemm + ${PROJECT_SOURCE_DIR}/tile_engine/ops/gemm/mx_gemm +) + +# Resolve the configured GPU target GENERICALLY -- do NOT hardcode/default the +# arch to gfx950. mx_gemm is gfx950-only (it calls the gfx950-only +# preShuffleScaleBuffer_gfx950 helper), and that requirement is enforced IN THE +# SOURCE: mx_gemm_ctypes_lib.cpp #errors if GFX_ARCH is unset and static_asserts +# GFX_ARCH == "gfx950" (plus a runtime device guard). Here we simply pass the +# real build target through as -DGFX_ARCH and only wire up the target when the +# build actually targets gfx950, so a gfx942/other dispatcher build is neither +# broken by the static_assert nor silently built for an unsupported arch. +if(DEFINED GPU_TARGETS AND NOT GPU_TARGETS STREQUAL "") + string(REPLACE ";" " " _mx_gpu_targets_space "${GPU_TARGETS}") + string(REPLACE " " ";" _mx_gpu_targets_list "${_mx_gpu_targets_space}") + list(GET _mx_gpu_targets_list 0 MX_GEMM_GPU_TARGET) +elseif(DEFINED CK_TILE_GEMM_GPU_TARGET AND NOT CK_TILE_GEMM_GPU_TARGET STREQUAL "") + set(MX_GEMM_GPU_TARGET "${CK_TILE_GEMM_GPU_TARGET}") +else() + set(MX_GEMM_GPU_TARGET "") +endif() + +if(NOT MX_GEMM_GPU_TARGET STREQUAL "gfx950") + message(STATUS + "MX-GEMM ctypes lib is gfx950-only; skipping for GPU target " + "'${MX_GEMM_GPU_TARGET}' (configure with GPU_TARGETS=gfx950 to enable).") +else() + file(GLOB MX_GEMM_KERNEL_HEADERS "${CMAKE_BINARY_DIR}/generated_kernels/mx_gemm_*.hpp") + if(MX_GEMM_KERNEL_HEADERS) + list(GET MX_GEMM_KERNEL_HEADERS 0 MX_GEMM_KERNEL_HEADER) + message(STATUS "Found MX-GEMM kernel for ctypes lib: ${MX_GEMM_KERNEL_HEADER}") + + add_ctypes_library(dispatcher_mx_gemm_lib + mx_gemm_ctypes_lib.cpp + KERNEL_HEADER ${MX_GEMM_KERNEL_HEADER} + ) + target_include_directories(dispatcher_mx_gemm_lib PRIVATE ${MX_GEMM_TE_INCLUDE_DIRS}) + # The generated header only exports SelectedKernel/KERNEL_NAME/ScaleType/... + # under this define. Pass the resolved build target through as -DGFX_ARCH + # (the source #errors if unset and static_asserts it is gfx950). + target_compile_definitions(dispatcher_mx_gemm_lib PRIVATE + CK_TILE_SINGLE_KERNEL_INCLUDE + GFX_ARCH="${MX_GEMM_GPU_TARGET}" + ) + else() + message(STATUS "No MX-GEMM kernel found for ctypes lib - building without kernel") + add_library(dispatcher_mx_gemm_lib SHARED mx_gemm_ctypes_lib.cpp) + target_include_directories(dispatcher_mx_gemm_lib PRIVATE + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_SOURCE_DIR}/dispatcher/include + ${MX_GEMM_TE_INCLUDE_DIRS} + ) + target_link_libraries(dispatcher_mx_gemm_lib PRIVATE hip::device) + # Pass the resolved build target through as -DGFX_ARCH (the source #errors + # if unset and static_asserts it is gfx950). + target_compile_definitions(dispatcher_mx_gemm_lib PRIVATE + GFX_ARCH="${MX_GEMM_GPU_TARGET}") + set_target_properties(dispatcher_mx_gemm_lib PROPERTIES + POSITION_INDEPENDENT_CODE ON + CXX_STANDARD 17 + ) + endif() +endif() + # ============================================================================= # Convolution ctypes Library (supports forward + bwd_data) # ============================================================================= @@ -154,6 +230,137 @@ else() ) endif() +# ============================================================================= +# GroupedGemm BQuant ctypes Library +# ============================================================================= + +file(GLOB BQUANT_GEMM_KERNEL_HEADERS "${CMAKE_BINARY_DIR}/generated_kernels/grouped_gemm_bquant_*.hpp") +if(BQUANT_GEMM_KERNEL_HEADERS) + list(GET BQUANT_GEMM_KERNEL_HEADERS 0 BQUANT_GEMM_KERNEL_HEADER) + message(STATUS "Found BQuant GEMM kernel for ctypes lib: ${BQUANT_GEMM_KERNEL_HEADER}") + + add_ctypes_library(dispatcher_grouped_gemm_bquant_lib + grouped_gemm_bquant_ctypes_lib.cpp + KERNEL_HEADER ${BQUANT_GEMM_KERNEL_HEADER} + ) + # Resolve a single GFX arch string from CMAKE_HIP_ARCHITECTURES if available, + # falling back to the cache variable CK_TILE_BQUANT_GFX_ARCH (default gfx942). + # The Python build path always passes -DGFX_ARCH=... explicitly via hipcc, so + # this default only affects builds driven through CMake directly. + if(NOT DEFINED CK_TILE_BQUANT_GFX_ARCH OR CK_TILE_BQUANT_GFX_ARCH STREQUAL "") + if(CMAKE_HIP_ARCHITECTURES) + list(GET CMAKE_HIP_ARCHITECTURES 0 _bquant_gfx_arch) + else() + set(_bquant_gfx_arch "gfx942") + endif() + set(CK_TILE_BQUANT_GFX_ARCH "${_bquant_gfx_arch}" CACHE STRING + "GFX arch for the CMake-built BQuant ctypes .so (default: first CMAKE_HIP_ARCHITECTURES or gfx942)") + endif() + message(STATUS "BQuant ctypes lib GFX_ARCH: ${CK_TILE_BQUANT_GFX_ARCH}") + + target_compile_definitions(dispatcher_grouped_gemm_bquant_lib PRIVATE + CK_TILE_SINGLE_KERNEL_INCLUDE + GFX_ARCH="${CK_TILE_BQUANT_GFX_ARCH}" + ) +else() + message(STATUS "No BQuant GEMM kernel found for ctypes lib - building without kernel") + add_library(dispatcher_grouped_gemm_bquant_lib SHARED grouped_gemm_bquant_ctypes_lib.cpp) + target_include_directories(dispatcher_grouped_gemm_bquant_lib PRIVATE + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_SOURCE_DIR}/dispatcher/include + ) + target_link_libraries(dispatcher_grouped_gemm_bquant_lib PRIVATE hip::device) + set_target_properties(dispatcher_grouped_gemm_bquant_lib PROPERTIES + POSITION_INDEPENDENT_CODE ON + CXX_STANDARD 17 + ) +endif() + +# ============================================================================= +# TileEngine -> Dispatcher Bridge ctypes Libraries (append-only shared block) +# ============================================================================= +# +# The bridge PRs (#9305 gemm_multi_abd, #9306 batched_gemm, #9328 +# batched_contraction) each add a registry-bypass ctypes .so target. To keep the +# branches mutually conflict-proof, this block is BYTE-IDENTICAL on every branch +# that touches this file. Each target is doubly guarded: +# (1) on its generated kernel-header glob, AND +# (2) on if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/_ctypes_lib.cpp) +# so a branch that does not ship a given _ctypes_lib.cpp simply skips that +# target at configure time (no error). The Python bridges build these .so files +# at runtime via hipcc; these CMake targets exist for CMake-driven / CI builds. + +# --- GEMM Multi-ABD (registry-bypass, array-pointer ABI) --------------------- +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/gemm_multi_abd_ctypes_lib.cpp) + file(GLOB GEMM_MULTI_ABD_KERNEL_HEADERS + "${CMAKE_BINARY_DIR}/generated_kernels/gemm_*_multiabd_*.hpp") + if(GEMM_MULTI_ABD_KERNEL_HEADERS) + list(SORT GEMM_MULTI_ABD_KERNEL_HEADERS) + list(GET GEMM_MULTI_ABD_KERNEL_HEADERS 0 GEMM_MULTI_ABD_KERNEL_HEADER) + message(STATUS "Found GEMM Multi-ABD kernel for ctypes lib: ${GEMM_MULTI_ABD_KERNEL_HEADER}") + add_ctypes_library(dispatcher_gemm_multi_abd_lib + gemm_multi_abd_ctypes_lib.cpp + KERNEL_HEADER ${GEMM_MULTI_ABD_KERNEL_HEADER} + ) + target_compile_definitions(dispatcher_gemm_multi_abd_lib PRIVATE + CK_TILE_SINGLE_KERNEL_INCLUDE) + else() + message(STATUS + "No GEMM Multi-ABD kernel found for ctypes lib - skipping dispatcher_gemm_multi_abd_lib " + "(built at runtime by the Python bridge once a kernel header exists)") + endif() +endif() + +# --- Batched GEMM (registry-bypass, batch_count + per-batch strides ABI) ------ +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/batched_gemm_ctypes_lib.cpp) + file(GLOB BATCHED_GEMM_KERNEL_HEADERS "${CMAKE_BINARY_DIR}/generated_kernels/gemm_*_batched.hpp") + if(BATCHED_GEMM_KERNEL_HEADERS) + list(SORT BATCHED_GEMM_KERNEL_HEADERS) + list(GET BATCHED_GEMM_KERNEL_HEADERS 0 BATCHED_GEMM_KERNEL_HEADER) + message(STATUS "Found Batched GEMM kernel for ctypes lib: ${BATCHED_GEMM_KERNEL_HEADER}") + add_library(dispatcher_batched_gemm_lib SHARED batched_gemm_ctypes_lib.cpp) + target_include_directories(dispatcher_batched_gemm_lib PRIVATE + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_SOURCE_DIR}/dispatcher/include + ) + target_link_libraries(dispatcher_batched_gemm_lib PRIVATE hip::device) + target_compile_options(dispatcher_batched_gemm_lib PRIVATE + -include ${BATCHED_GEMM_KERNEL_HEADER} + ) + target_compile_definitions(dispatcher_batched_gemm_lib PRIVATE CK_TILE_SINGLE_KERNEL_INCLUDE) + set_target_properties(dispatcher_batched_gemm_lib PROPERTIES + POSITION_INDEPENDENT_CODE ON + CXX_STANDARD 17 + ) + else() + message(STATUS "No Batched GEMM kernel found for ctypes lib - skipping dispatcher_batched_gemm_lib") + endif() +endif() + +# --- Batched-Contraction (registry-bypass, force-included kernel) ------------ +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/batched_contraction_ctypes_lib.cpp) + file(GLOB BC_KERNEL_HEADERS "${CMAKE_BINARY_DIR}/generated_kernels/batched_contraction_*.hpp") + if(BC_KERNEL_HEADERS) + list(SORT BC_KERNEL_HEADERS) + list(GET BC_KERNEL_HEADERS 0 BC_KERNEL_HEADER) + message(STATUS "Found batched-contraction kernel for ctypes lib: ${BC_KERNEL_HEADER}") + add_ctypes_library(dispatcher_batched_contraction_lib + batched_contraction_ctypes_lib.cpp + KERNEL_HEADER ${BC_KERNEL_HEADER} + ) + # The generated header only exports SelectedKernel/KERNEL_NAME/CONTRACTION_KEY_* + # under this define, so the force-include path requires it. + target_compile_definitions(dispatcher_batched_contraction_lib PRIVATE + CK_TILE_SINGLE_KERNEL_INCLUDE + ) + else() + message(STATUS + "No batched-contraction kernel found for ctypes lib - skipping " + "dispatcher_batched_contraction_lib (built at runtime by the Python " + "bridge once a kernel header exists)") + endif() +endif() + # ============================================================================= # GPU Helper Executable # ============================================================================= diff --git a/dispatcher/bindings/ctypes/GROUPED_GEMM_BRIDGE.md b/dispatcher/bindings/ctypes/GROUPED_GEMM_BRIDGE.md new file mode 100644 index 00000000000..f6a7780b834 --- /dev/null +++ b/dispatcher/bindings/ctypes/GROUPED_GEMM_BRIDGE.md @@ -0,0 +1,121 @@ + + +# Grouped GEMM: Tile Engine -> Dispatcher Bridge + +This document describes the **grouped_gemm** variant of the Tile Engine (TE) -> +Dispatcher bridge (PR #8130). It is the grouped counterpart of the regular-GEMM +bridge (#8123/#8479), the fp8/bf8/int8 bridge (#8887), and the Stream-K bridge +(#8136). + +## What the bridge is + +In the bridge model the **Dispatcher is the single source of truth** for +codegen, build, and runtime; **Tile Engine only generates configs and +benchmarks** them. TE no longer carries its own kernel-instance build path — +it shells out to the dispatcher codegen and runs the resulting kernel. + +For most variants the dispatcher runs a kernel through its registry/backend. +Grouped GEMM cannot use that path (see below), so the grouped bridge takes the +same approach as Stream-K: a dedicated ctypes library that **bypasses the +registry** and calls the generated `SelectedKernel::launch(...)` directly. + +## Why grouped needs special handling + +Grouped GEMM is **multi-problem**: a single launch runs a *list* of `(M, N, K)` +sub-problems, each with its own A/B/C device pointers. Two consequences: + +1. The single-problem run path (`g_dispatcher->run` / `GemmHostArgs`) cannot + express a list of problems. +2. The generated registry wrapper (`generated_tile_backend.hpp::run()`) + hard-codes the single-problem `SelectedKernel::launch(GemmHostArgs, ...)` + signature and will not compile against a grouped `SelectedKernel`. + +So the grouped kernel header exposes a different launch signature + +```cpp +static float launch(const std::vector>& descs, + const stream_config& stream); +``` + +and the grouped ctypes lib force-includes one generated kernel header +(`-include ..._grouped.hpp` with `CK_TILE_SINGLE_KERNEL_INCLUDE`), calls that +`launch` directly, and reports the kernel name from the compile-time +`KERNEL_NAME` macro. + +## Components + +| Layer | File | Role | +|---|---|---| +| Codegen | `dispatcher/codegen/unified_gemm_codegen.py` | `GemmVariant.GROUPED`; `_launch_function_grouped` (DeviceMem internal workspace, `MakeKargs`, persistent/non-persistent grid). Kept in lockstep with PR #8075. | +| Codegen | `dispatcher/codegen/arch_filter.py` | `GEMM_GROUPED` operator tile constraints. | +| C API | `dispatcher/bindings/ctypes/grouped_gemm_ctypes_lib.cpp` | Multi-problem ABI; per-group device alloc/copy; layout-derived strides; warmup/repeat timing. | +| Python | `dispatcher/python/gemm_utils.py` | `GroupedGemmProblem` / `GroupedGemmResult`, `GpuGroupedGemmRunner`, `run_grouped`, `build_grouped`, dtype/layout codecs. | +| Python | `dispatcher/python/ctypes_utils.py` | Threads the `grouped` variant into the codegen `--variants` flag. | +| TE driver | `tile_engine/ops/gemm/grouped_gemm_full_benchmark.py` | Generates configs, builds `.so`s in parallel, benchmarks in disposable workers. | +| TE worker | `tile_engine/ops/gemm/run_one_grouped_gemm_kernel.py` | Runs one grouped kernel; dtype/layout-aware operand generation. | + +## C ABI + +```c +int dispatcher_init(void); // lightweight no-op (no registry) +int dispatcher_run_grouped_gemm( + int group_count, + const int64_t* Ms, // [group_count] + const int64_t* Ns, // [group_count] + const int64_t* Ks, // [group_count] + const void** A_ptrs, // host A buffers, one per group + const void** B_ptrs, // host B buffers, one per group + void** C_ptrs, // host C out buffers, one per group + float* time_ms); // out: average kernel time +// returns 0 ok, -1 HIP/throw, -2 arguments unsupported by the kernel +``` + +The lib `hipMalloc`s A/B/C per group, copies A and B host->device, memsets C, +builds `std::vector>` with **strides derived from +the compile-time `ALayout`/`BLayout`/`CLayout`** of the `-include`d header +(`std::is_same_v<…, RowMajor>`), launches once, then copies each C back. The ABI +is `void*` + element-size, so it is dtype-agnostic; the Python runner owns the +numpy codecs. + +## Coverage + +The bridge runnable set is exactly the Old-TE grouped_gemm runnable set on +`develop` — no more, no less: + +| Layout \ Dtype | fp16 | bf16 | fp8 (E4M3) | bf8 (E5M2) | +|---|---|---|---|---| +| rcr | ✓ | ✓ | ✓ | ✓ | +| rrr | ✓ | ✓ | ✓ | ✓ | +| ccr | ✓ | ✓ | ✓ | ✓ | +| crr | ✓ | ✓ | ✓ | ✓ | + +- **Matrix C is always row-major** (grouped builder constraint), so the layout + string varies A/B only. +- **Excluded:** `int8` (rejected by the TE grouped builder), `fp32`/`fp64` + (no MFMA warp tiles). These are excluded on both sides. +- fp8/bf8 use the **FNUZ** encoding on gfx942 (matches the regular #8887 path); + the Python codecs require `ml_dtypes`. + +## Building and running + +Generate + build one grouped `.so` and run the A/B parity sweep vs Old-TE: + +```bash +# Codegen smoke (no GPU): one variant/dtype/layout +python3 dispatcher/codegen/unified_gemm_codegen.py \ + --output-dir /tmp/grp --datatype bf16 --layout ccr \ + --variants grouped --config dispatcher/codegen/default_config.json + +# Full TE-driven parity sweep (build + benchmark) +python3 tile_engine/ops/gemm/grouped_gemm_full_benchmark.py \ + --arch gfx942 --dtype fp16 --layout rcr --csv grouped_results.csv +``` + +Timing knobs `CK_TILE_BENCH_WARMUP` (default 50) and `CK_TILE_BENCH_REPEAT` +(default 100) are honored by **both** the grouped ctypes lib and the registry +backend, so bridge-vs-Old-TE A/B comparisons stay matched. For fair parity keep +`flush_cache=false`, `rotating_count=1`, run on a single GPU, and re-measure any +`|gap|>15%` outlier standalone. diff --git a/dispatcher/bindings/ctypes/MULTI_D_GEMM_BRIDGE.md b/dispatcher/bindings/ctypes/MULTI_D_GEMM_BRIDGE.md new file mode 100644 index 00000000000..0fa0a6e6dd1 --- /dev/null +++ b/dispatcher/bindings/ctypes/MULTI_D_GEMM_BRIDGE.md @@ -0,0 +1,121 @@ + + +# Multi-D GEMM: Tile Engine -> Dispatcher Bridge + +This document describes the **gemm_multi_d** variant of the Tile Engine (TE) -> +Dispatcher bridge. It is the multi-D counterpart of the regular-GEMM bridge +(#8997), the grouped bridge (#9000), and the Stream-K bridge (#9028). + +## What the bridge is + +In the bridge model the **Dispatcher is the single source of truth** for +codegen, build, and runtime; **Tile Engine only generates configs and +benchmarks** them. TE no longer carries its own kernel-instance build path — it +shells out to the dispatcher codegen and runs the resulting kernel. + +Multi-D fuses extra D operands into the GEMM epilogue, so — like grouped and +Stream-K — it takes a dedicated ctypes library that **bypasses the registry** and +calls the generated `SelectedKernel::launch(...)` directly. + +## Why multi-D needs special handling + +Multi-D computes `E = elementwise_op(A @ B, D0, D1, ...)`: a fixed number +(`NumDTensor`) of extra device pointers are fused into the CShuffle epilogue. Two +consequences: + +1. The single-problem run path (`g_dispatcher->run` / `GemmHostArgs`) cannot + carry the D-pointer array or per-D strides. +2. The generated registry wrapper (`generated_tile_backend.hpp::run()`) ignores + `d_ptrs` and calls the plain `SelectedKernel::launch(GemmHostArgs, ...)` + overload (empty D tensors), so it cannot exercise real D operands. + +So the multi-D kernel header exposes a different launch signature + +```cpp +static float launch(const GemmMultiDArgs& args, const stream_config& stream); +// GemmMultiDArgs == GemmMultiDHostArgs +``` + +and the multi-D ctypes lib force-includes one generated kernel header +(`-include ..._multid_....hpp` with `CK_TILE_SINGLE_KERNEL_INCLUDE`), calls that +`launch` directly, and reports the kernel name from the compile-time +`KERNEL_NAME` macro. + +## Components + +| Layer | File | Role | +|---|---|---| +| Codegen | `dispatcher/codegen/unified_gemm_codegen.py` | `GemmVariant.MULTI_D` (already present): `_multi_d_types`, `_launch_function_multi_d`, `_epilogue_code` (CShuffle multi-D). This PR adds `_multi_d_single_include`: re-exports `NumDTensor`/`DsDataType`/`DsLayout`/`DLayout`/`ElementWiseFn`/`GemmMultiDArgs` + `ALayout`/`BLayout`/`CLayout` and the `GEMM_KEY_MULTI_D`/`GEMM_KEY_NUM_D_TENSORS`/`GEMM_KEY_ELEMENTWISE_OP`/`GEMM_KEY_D_LAYOUT` macros under `CK_TILE_SINGLE_KERNEL_INCLUDE`. | +| C API | `dispatcher/bindings/ctypes/multi_d_gemm_ctypes_lib.cpp` | Multi-D ABI; A/B/C + D device alloc/copy; layout-derived strides; fair-by-default timing (flush_cache=true, rotating_count=1000 to match Old-TE; env-tunable via `CK_TILE_BENCH_WARMUP`/`REPEAT`/`FLUSH`/`ROTATING`); `dispatcher_get_num_d_tensors`. | +| Python | `dispatcher/python/gemm_utils.py` | `MultiDGemmProblem` / `MultiDGemmResult`, `GpuMultiDGemmRunner`, `run_multi_d`, multi_d fields on `GemmKernelConfig` (`elementwise_op`/`num_d_tensors`/`d_layout`), 4-char `codegen_layout`, `_ctypes_source_name`, `expand_sweep(variant="multi_d")`. | +| TE driver | `tile_engine/ops/gemm/gemm_multi_d_full_benchmark.py` | Generates configs, builds `.so`s in parallel, benchmarks in disposable per-GPU workers. | +| TE worker | `tile_engine/ops/gemm/run_one_gemm_multi_d_kernel.py` | Runs one multi_d kernel; num-D read off the .so; fp32 reference for `--verify` (op(A@B, Ds)). | + +## C ABI + +```c +int dispatcher_init(void); // lightweight no-op (no registry) +int dispatcher_get_num_d_tensors(void); // compiled-in NumDTensor +int dispatcher_run_multi_d_gemm( + const void* A, // host A (MxK) + const void* B, // host B (KxN) + const void** d_ptrs, // num_d host D buffers, each MxN + int num_d, // MUST equal dispatcher_get_num_d_tensors() + void* C, // host E/C out (MxN) + int64_t M, int64_t N, int64_t K, + float* time_ms); // out: average kernel time +// returns 0 ok, -1 HIP/bad-args/throw, -2 arguments unsupported by the kernel +``` + +The lib `hipMalloc`s A/B/C and each D, copies A/B/D host->device, memsets C, +builds `GemmMultiDArgs` with strides derived from the compile-time +`ALayout`/`BLayout`/`CLayout`/`DLayout` of the `-include`d header, launches with +`k_batch=1` (multi-D requires k_batch==1), then copies C back. The ABI is +`void*` + element-size; the Python runner owns the numpy codecs. + +## Coverage (matches Old-TE gemm_multi_d exactly) + +| Layout \ Op | MultiDAdd | MultiDMultiply | PassThrough | +|---|---|---|---| +| rcrr | ✓ | ✓ | ✓ | +| rrrr | ✓ | ✓ | ✓ | +| ccrr | ✓ | ✓ | ✓ | +| crrr | ✓ | ✓ | ✓ | + +- **dtype:** fp16 only (the TE `gemm_multi_d_instance_builder.py` argparse + restricts `--datatype` to `fp16`). +- **layouts:** 4-char, `rcrr`/`rrrr`/`ccrr`/`crrr` — A/B vary, C and D are always + row-major (last two chars `r`), matching the TE builder. +- **num D tensors:** swept from `multi_d_config.num_d_tensors` (default `[1, 2]`). + The **apples-to-apples parity default is num_d=2**: Old-TE + `gemm_multi_d_benchmark_single.cpp` bakes `DsDataType = tuple` + (`DsDataType::size() == 2`), so num_d=2 is the byte-identical comparison and + the headline parity slice. (Any num_d=1 claim is *not* the fair slice — Old-TE + never builds a single-D multi_d kernel.) +- **elementwise ops:** `MultiDAdd`, `MultiDMultiply` (Add/Multiply are the + multi-D-signature ops; `PassThrough` is also supported). Unary ops + (Relu/Gelu) are excluded on both sides — wrong signature for multi-D. + +## Known follow-ups + +- **TODO (rocprof):** On the num_d=2 parity slice, 14/640 shapes show |gap|>15% + at 4096^3 (memory-pipeline-bound). Both sides run the *same* shared-codegen + kernel, so this is a large-shape mem-pipeline characteristic, not a bridge + regression; a rocprof root-cause is deferred and does not block parity. + +## Building and running + +```bash +# Codegen smoke (no GPU): one layout/op/num_d +python3 dispatcher/codegen/unified_gemm_codegen.py \ + --output-dir /tmp/md --datatype fp16 --layout rcrr \ + --variants multi_d --config dispatcher/codegen/default_config.json + +# Full A/B parity sweep vs Old-TE (per GPU, subprocess-isolated, --verify checks +# each kernel against an fp32 op(A@B, Ds) reference): +python3 tile_engine/ops/gemm/gemm_multi_d_full_benchmark.py \ + --layout rcrr --verify --csv gemm_multi_d_results.csv +``` diff --git a/dispatcher/bindings/ctypes/gemm_ctypes_lib.cpp b/dispatcher/bindings/ctypes/gemm_ctypes_lib.cpp index 85c0c2f2c13..94079990b07 100644 --- a/dispatcher/bindings/ctypes/gemm_ctypes_lib.cpp +++ b/dispatcher/bindings/ctypes/gemm_ctypes_lib.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "ck_tile/dispatcher/dispatcher.hpp" #include "ck_tile/dispatcher/registry.hpp" @@ -65,15 +66,75 @@ int dispatcher_initialize() return 0; // Already initialized } - // Create kernel key from the force-included kernel header + // Create kernel key from the force-included kernel header. + // + // The GEMM_KEY_* macros are emitted by the codegen into the force-included + // header (see unified_gemm_codegen.py, CK_TILE_SINGLE_KERNEL_INCLUDE block). + // Building the key from them makes the registry entry truthful: it reflects + // THIS kernel's real dtypes/layouts/tile/traits instead of a hard-coded + // fp16/rcr/128x128x32 default. Enum fields use the string_to_* helpers from + // kernel_key.hpp, whose accepted strings match the codegen's emitted values + // byte-for-byte. KernelKey key; - key.signature.dtype_a = DataType::FP16; - key.signature.dtype_b = DataType::FP16; - key.signature.dtype_c = DataType::FP16; - key.signature.dtype_acc = DataType::FP32; - key.signature.layout_a = LayoutTag::RowMajor; - key.signature.layout_b = LayoutTag::ColMajor; - key.signature.layout_c = LayoutTag::RowMajor; +#ifdef GEMM_KEY_DTYPE_A + key.signature.dtype_a = string_to_dtype(GEMM_KEY_DTYPE_A); + key.signature.dtype_b = string_to_dtype(GEMM_KEY_DTYPE_B); + key.signature.dtype_c = string_to_dtype(GEMM_KEY_DTYPE_C); + key.signature.dtype_acc = string_to_dtype(GEMM_KEY_DTYPE_ACC); + key.signature.layout_a = string_to_layout(GEMM_KEY_LAYOUT_A); + key.signature.layout_b = string_to_layout(GEMM_KEY_LAYOUT_B); + key.signature.layout_c = string_to_layout(GEMM_KEY_LAYOUT_C); + key.signature.transpose_a = false; + key.signature.transpose_b = false; + key.signature.grouped = (GEMM_KEY_GROUPED != 0); + key.signature.split_k = GEMM_KEY_SPLIT_K; + key.signature.elementwise_op = "PassThrough"; + key.signature.num_d_tensors = 0; + key.signature.structured_sparsity = false; + + key.algorithm.tile_shape = {GEMM_KEY_TILE_M, GEMM_KEY_TILE_N, GEMM_KEY_TILE_K}; + key.algorithm.wave_shape = {GEMM_KEY_WAVE_M, GEMM_KEY_WAVE_N, GEMM_KEY_WAVE_K}; + key.algorithm.warp_tile_shape = { + GEMM_KEY_WARP_TILE_M, GEMM_KEY_WARP_TILE_N, GEMM_KEY_WARP_TILE_K}; + key.algorithm.pipeline = string_to_pipeline(GEMM_KEY_PIPELINE); + key.algorithm.scheduler = string_to_scheduler(GEMM_KEY_SCHEDULER); + key.algorithm.epilogue = string_to_epilogue(GEMM_KEY_EPILOGUE); + key.algorithm.block_size = GEMM_KEY_BLOCK_SIZE; + key.algorithm.double_buffer = (GEMM_KEY_DOUBLE_BUFFER != 0); + key.algorithm.persistent = (GEMM_KEY_PERSISTENT != 0); + key.algorithm.preshuffle = (GEMM_KEY_PRESHUFFLE != 0); + key.algorithm.transpose_c = (GEMM_KEY_TRANSPOSE_C != 0); + key.algorithm.num_wave_groups = GEMM_KEY_NUM_WAVE_GROUPS; + // pad_m/n/k participate in both the key's hash/equality and the kernel + // name, so they must be derived from the codegen macros too -- otherwise a + // kernel built with padding disabled would register under a key claiming + // pad=true and disagree with its own name. + key.algorithm.pad_m = (GEMM_KEY_PAD_M != 0); + key.algorithm.pad_n = (GEMM_KEY_PAD_N != 0); + key.algorithm.pad_k = (GEMM_KEY_PAD_K != 0); + key.gfx_arch = GFX_ARCH; +#else + // Fallback default for headers generated before GEMM_KEY_* macros existed + // (fp16 / rcr / compv4-cshuffle-intrawave, 128x128x32). The macro path + // above is the source of truth for any freshly generated kernel. + key.signature.dtype_a = DataType::FP16; + key.signature.dtype_b = DataType::FP16; + key.signature.dtype_c = DataType::FP16; + key.signature.dtype_acc = DataType::FP32; + // Derive A/B/C layouts from the force-included kernel's own layout types + // instead of hardcoding rcr. The dispatcher's supports() gate is layout-aware + // (it only constrains a dimension that an operand's inner axis maps to), so a + // wrong key layout makes it reject valid problems -- e.g. a crr kernel does not + // gate K, but with a hardcoded rcr key supports() would apply rcr's K-gate and + // reject TileK=192 problems that Old-TE runs. ALayout/BLayout/CLayout are the + // global aliases exported by the kernel header under CK_TILE_SINGLE_KERNEL_INCLUDE. + using RowMajorLayout = ck_tile::tensor_layout::gemm::RowMajor; + key.signature.layout_a = + std::is_same_v ? LayoutTag::RowMajor : LayoutTag::ColMajor; + key.signature.layout_b = + std::is_same_v ? LayoutTag::RowMajor : LayoutTag::ColMajor; + key.signature.layout_c = + std::is_same_v ? LayoutTag::RowMajor : LayoutTag::ColMajor; key.signature.transpose_a = false; key.signature.transpose_b = false; key.signature.grouped = false; @@ -95,6 +156,7 @@ int dispatcher_initialize() key.algorithm.transpose_c = false; key.algorithm.num_wave_groups = 1; key.gfx_arch = GFX_ARCH; +#endif // GEMM_KEY_DTYPE_A // Register kernel using types from force-included header auto kernel = @@ -310,10 +372,40 @@ int dispatcher_run_gemm( } /** - * Get kernel information + * Get kernel information (legacy single-kernel ABI). + * + * Returns the compile-time KERNEL_NAME of the force-included kernel header. + * Kept for backward compatibility with one-kernel-per-.so callers. */ const char* dispatcher_get_kernel_name() { return KERNEL_NAME; } +/** + * Get the name of the kernel at a given registry index (multi-kernel ABI). + * + * Mirrors the conv/fmha ctypes libs: copies the index-th registered kernel's + * name into the caller-provided buffer so one .so can report a whole batch and + * be selected by name at runtime. Returns 0 on success, -1 on bad args or + * out-of-range index. + */ +int dispatcher_get_kernel_name_at(int index, char* buffer, int buffer_size) +{ + if(!buffer || buffer_size <= 0) + { + return -1; + } + + auto kernels = Registry::instance().get_all(); + if(index < 0 || index >= static_cast(kernels.size())) + { + return -1; + } + + std::string name = kernels[index]->get_name(); + std::strncpy(buffer, name.c_str(), static_cast(buffer_size) - 1); + buffer[buffer_size - 1] = '\0'; + return 0; +} + /** * Initialize dispatcher (alias) */ @@ -398,4 +490,4 @@ void dispatcher_cleanup() g_initialized = false; } -} // extern "C" +} // extern "C" \ No newline at end of file diff --git a/dispatcher/bindings/ctypes/gemm_multi_abd_ctypes_lib.cpp b/dispatcher/bindings/ctypes/gemm_multi_abd_ctypes_lib.cpp new file mode 100644 index 00000000000..af7b6f77caa --- /dev/null +++ b/dispatcher/bindings/ctypes/gemm_multi_abd_ctypes_lib.cpp @@ -0,0 +1,416 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +/** + * GEMM Multi-ABD Dispatcher ctypes Library + * + * Provides a C API for Python ctypes integration for the gemm_multi_abd op. + * + * WHY A SEPARATE .so (divergent ABI): + * gemm_multi_abd is a multi-tensor op: it takes ARRAYS of A, B and D device + * pointers (NumATensors / NumBTensors / NumDTensors), not the single A/B/C + * triple the regular GEMM ABI (dispatcher_run_gemm) exposes. Its launch takes + * a ck_tile::GemmMultiABDHostArgs, so this library bypasses + * the name-keyed dispatcher registry and calls SelectedKernel::launch(...) + * directly on the force-included kernel -- exactly the divergent-ABI bridge + * pattern used for grouped GEMM (#9000). The kernel header is force-included + * via the -include compiler flag and defines SelectedKernel, KERNEL_NAME, and + * the NumA/NumB/NumD tensor counts (inside the kernel's namespace, re-exported + * to global scope under CK_TILE_SINGLE_KERNEL_INCLUDE). + * + * Usage from Python: + * lib = ctypes.CDLL("libgemm_multi_abd_.so") + * lib.dispatcher_initialize() + * lib.dispatcher_run_multi_abd(as_ptrs, bs_ptrs, ds_ptrs, e_ptr, + * num_a, num_b, num_d, M, N, K, &time_ms) + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ck_tile/core.hpp" +#include "ck_tile/host.hpp" +#include "ck_tile/ops/gemm.hpp" +#include "ck_tile/ops/gemm/kernel/gemm_multi_abd_kernel.hpp" + +// Kernel header force-included via -include compiler flag. +// Defines (under CK_TILE_SINGLE_KERNEL_INCLUDE): +// SelectedKernel -- the generated Kernel_ struct with a static +// launch(const GemmMultiABDHostArgs<...>&, stream_config&) +// KERNEL_NAME -- the byte-exact runtime kernel name +// NumATensors / NumBTensors / NumDTensors -- tensor counts baked into the type + +// GPU architecture - must be supplied at compile time via -DGFX_ARCH=. +#ifndef GFX_ARCH +#error \ + "GFX_ARCH must be defined at compile time (pass -DGFX_ARCH=); do not default to a specific GPU architecture." +#endif + +// The force-included header exports the tensor counts into the global namespace +// under CK_TILE_SINGLE_KERNEL_INCLUDE. Guard with a fallback so the file is +// still self-describing if the macros ever change. +#ifndef GEMM_MULTI_ABD_NUM_A +#define GEMM_MULTI_ABD_NUM_A NumATensors +#endif +#ifndef GEMM_MULTI_ABD_NUM_B +#define GEMM_MULTI_ABD_NUM_B NumBTensors +#endif +#ifndef GEMM_MULTI_ABD_NUM_D +#define GEMM_MULTI_ABD_NUM_D NumDTensors +#endif + +namespace { + +constexpr ck_tile::index_t kNumA = GEMM_MULTI_ABD_NUM_A; +constexpr ck_tile::index_t kNumB = GEMM_MULTI_ABD_NUM_B; +constexpr ck_tile::index_t kNumD = GEMM_MULTI_ABD_NUM_D; + +using HostArgs = ck_tile::GemmMultiABDHostArgs; + +bool g_initialized = false; + +} // namespace + +extern "C" { + +/** + * Initialize the library. Multi-ABD is registry-bypass (it calls + * SelectedKernel::launch directly), so there is no registry to populate here; + * this just flips the ready flag and is kept for ABI symmetry with the regular + * GEMM ctypes lib. + * + * Returns: 0 on success. + */ +int dispatcher_initialize() +{ + g_initialized = true; + return 0; +} + +int dispatcher_init() { return dispatcher_initialize(); } + +/** + * Number of tensors the force-included kernel expects (compile-time constants). + */ +int dispatcher_get_num_a_tensors() { return static_cast(kNumA); } +int dispatcher_get_num_b_tensors() { return static_cast(kNumB); } +int dispatcher_get_num_d_tensors() { return static_cast(kNumD); } + +/** + * Kernel name (single-kernel ABI): the byte-exact KERNEL_NAME baked into the + * force-included header. Mirrors dispatcher_get_kernel_name in the regular lib. + */ +const char* dispatcher_get_kernel_name() { return KERNEL_NAME; } + +/** + * Multi-kernel ABI shim: this .so holds exactly one force-included kernel, so + * index 0 returns KERNEL_NAME and any other index is out of range. Kept so the + * Python GemmDispatcherLib multi-kernel path works uniformly across variants. + */ +int dispatcher_get_kernel_name_at(int index, char* buffer, int buffer_size) +{ + if(!buffer || buffer_size <= 0 || index != 0) + { + return -1; + } + std::strncpy(buffer, KERNEL_NAME, static_cast(buffer_size) - 1); + buffer[buffer_size - 1] = '\0'; + return 0; +} + +int dispatcher_get_kernel_count() { return 1; } + +/** + * Run a multi-ABD GEMM on the GPU via the force-included kernel. + * + * The Python runner hands HOST buffers (contiguous, already laid out for the + * kernel's compiled layout); this shim owns the GPU side -- it hipMallocs one + * device buffer per A/B/D tensor and for E, copies inputs up, launches, and + * copies the result back. This mirrors the regular gemm_ctypes_lib's + * host-pointer contract so GpuGemmRunner-style callers just pass numpy arrays. + * + * as_hosts / bs_hosts / ds_hosts : arrays of host pointers (length num_a/b/d). + * e_host : output host pointer (M*N * sizeof(EDataType)). + * elem_a/b/d/e : element size in bytes for each group's dtype + * (so this shim need not know the CK dtype). + * stride_* : per-operand leading stride. These are forwarded + * verbatim into GemmMultiABDHostArgs; ck_tile's + * UniversalGemmKernel uses them AS-IS and does NOT + * treat 0 as a "derive the default" sentinel (a 0 + * or negative stride collapses the tensor + * descriptor and corrupts addressing). They MUST + * therefore be non-null and strictly positive; + * the caller computes them from M,N,K and the + * compiled layout (see GpuMultiABDRunner). + * time_ms : filled with the average kernel time (ms). + * + * Returns 0 on success, negative on error. num_a/num_b/num_d MUST equal the + * kernel's compiled tensor counts or the call is rejected (-3). Missing or + * non-positive strides are rejected (-1). + */ +int dispatcher_run_multi_abd(const void** as_hosts, + const void** bs_hosts, + const void** ds_hosts, + void* e_host, + const int64_t* stride_as, + const int64_t* stride_bs, + const int64_t* stride_ds, + int64_t stride_e, + int elem_a, + int elem_b, + int elem_d, + int elem_e, + int num_a, + int num_b, + int num_d, + int64_t M, + int64_t N, + int64_t K, + float* time_ms) +{ + if(!g_initialized || !as_hosts || !bs_hosts || !e_host) + { + return -1; + } + if(M <= 0 || N <= 0 || K <= 0 || elem_a <= 0 || elem_b <= 0 || elem_e <= 0) + { + return -1; + } + // The tensor counts are baked into the kernel type at compile time; a + // mismatch would silently read past the caller's arrays, so reject it. + if(num_a != static_cast(kNumA) || num_b != static_cast(kNumB) || + num_d != static_cast(kNumD)) + { + return -3; + } + if(kNumD > 0 && (!ds_hosts || elem_d <= 0)) + { + return -1; + } + // Strides are forwarded verbatim to the kernel (no default derivation), so a + // null array or any non-positive value would silently corrupt addressing. + // Require explicit, strictly-positive strides for every operand. + if(!stride_as || !stride_bs || stride_e <= 0 || (kNumD > 0 && !stride_ds)) + { + return -1; + } + for(int i = 0; i < num_a; ++i) + { + if(stride_as[i] <= 0) + { + return -1; + } + } + for(int i = 0; i < num_b; ++i) + { + if(stride_bs[i] <= 0) + { + return -1; + } + } + for(int i = 0; i < num_d; ++i) + { + if(stride_ds[i] <= 0) + { + return -1; + } + } + + // Cast every factor to size_t so the products are computed in 64-bit + // unsigned arithmetic (no reliance on operand-promotion order). + const size_t a_bytes = + static_cast(M) * static_cast(K) * static_cast(elem_a); + const size_t b_bytes = + static_cast(K) * static_cast(N) * static_cast(elem_b); + const size_t d_bytes = + static_cast(M) * static_cast(N) * static_cast(elem_d); + const size_t e_bytes = + static_cast(M) * static_cast(N) * static_cast(elem_e); + + std::vector a_dev(kNumA, nullptr), b_dev(kNumB, nullptr), d_dev(kNumD, nullptr); + void* e_dev = nullptr; + + auto cleanup = [&]() { + for(auto p : a_dev) + if(p) + (void)hipFree(p); + for(auto p : b_dev) + if(p) + (void)hipFree(p); + for(auto p : d_dev) + if(p) + (void)hipFree(p); + if(e_dev) + (void)hipFree(e_dev); + }; + + // Allocate + upload each operand tensor. + for(int i = 0; i < num_a; ++i) + { + if(hipMalloc(&a_dev[i], a_bytes) != hipSuccess) + { + cleanup(); + return -1; + } + if(hipMemcpy(a_dev[i], as_hosts[i], a_bytes, hipMemcpyHostToDevice) != hipSuccess) + { + cleanup(); + return -1; + } + } + for(int i = 0; i < num_b; ++i) + { + if(hipMalloc(&b_dev[i], b_bytes) != hipSuccess) + { + cleanup(); + return -1; + } + if(hipMemcpy(b_dev[i], bs_hosts[i], b_bytes, hipMemcpyHostToDevice) != hipSuccess) + { + cleanup(); + return -1; + } + } + for(int i = 0; i < num_d; ++i) + { + if(hipMalloc(&d_dev[i], d_bytes) != hipSuccess) + { + cleanup(); + return -1; + } + if(hipMemcpy(d_dev[i], ds_hosts[i], d_bytes, hipMemcpyHostToDevice) != hipSuccess) + { + cleanup(); + return -1; + } + } + if(hipMalloc(&e_dev, e_bytes) != hipSuccess) + { + cleanup(); + return -1; + } + if(hipMemset(e_dev, 0, e_bytes) != hipSuccess) + { + cleanup(); + return -1; + } + + // Pack the device pointers / strides into the std::array shapes the + // GemmMultiABDHostArgs constructor requires. + std::array as{}; + std::array bs{}; + std::array ds{}; + std::array str_as{}; + std::array str_bs{}; + std::array str_ds{}; + + // ck_tile::index_t is 32-bit: reject any dimension or stride that would not + // fit before the static_casts below, so an out-of-range value fails loudly + // instead of silently truncating. + { + auto fits_i32 = [](int64_t v) { return v <= static_cast(INT32_MAX); }; + if(!fits_i32(M) || !fits_i32(N) || !fits_i32(K) || !fits_i32(stride_e)) + { + std::cerr << "dispatcher_run_multi_abd: M/N/K or stride_e exceeds the 32-bit " + "index range\n"; + return -1; + } + for(ck_tile::index_t i = 0; i < kNumA; ++i) + if(!fits_i32(stride_as[i])) + { + std::cerr << "dispatcher_run_multi_abd: stride_as exceeds the 32-bit index " + "range\n"; + return -1; + } + for(ck_tile::index_t i = 0; i < kNumB; ++i) + if(!fits_i32(stride_bs[i])) + { + std::cerr << "dispatcher_run_multi_abd: stride_bs exceeds the 32-bit index " + "range\n"; + return -1; + } + for(ck_tile::index_t i = 0; i < kNumD; ++i) + if(!fits_i32(stride_ds[i])) + { + std::cerr << "dispatcher_run_multi_abd: stride_ds exceeds the 32-bit index " + "range\n"; + return -1; + } + } + + // Strides validated non-null, strictly positive, and 32-bit-safe above, so + // pack directly. + for(ck_tile::index_t i = 0; i < kNumA; ++i) + { + as[i] = a_dev[i]; + str_as[i] = static_cast(stride_as[i]); + } + for(ck_tile::index_t i = 0; i < kNumB; ++i) + { + bs[i] = b_dev[i]; + str_bs[i] = static_cast(stride_bs[i]); + } + for(ck_tile::index_t i = 0; i < kNumD; ++i) + { + ds[i] = d_dev[i]; + str_ds[i] = static_cast(stride_ds[i]); + } + + // Multi-ABD supports only k_batch = 1. + HostArgs args{as, + bs, + ds, + e_dev, + /*k_batch=*/1, + static_cast(M), + static_cast(N), + static_cast(K), + str_as, + str_bs, + str_ds, + static_cast(stride_e)}; + + float exec_time = -1.0f; + try + { + // Registry bypass: launch the force-included kernel directly. The + // launch() returns a single float average time (unlike some Old-TE + // launchers that return a tuple), so no tuple normalization is needed. + ck_tile::stream_config stream{nullptr, /*time_kernel=*/true}; + exec_time = SelectedKernel::launch(args, stream); + } + catch(const std::exception& e) + { + std::cerr << "gemm_multi_abd launch failed: " << e.what() << std::endl; + cleanup(); + if(time_ms) + { + *time_ms = -1.0f; + } + return -2; + } + + // Copy result back to the host output buffer. + if(hipMemcpy(e_host, e_dev, e_bytes, hipMemcpyDeviceToHost) != hipSuccess) + { + cleanup(); + return -1; + } + + cleanup(); + if(time_ms) + { + *time_ms = exec_time; + } + return 0; +} + +void dispatcher_cleanup() { g_initialized = false; } + +} // extern "C" diff --git a/dispatcher/bindings/ctypes/grouped_gemm_bquant_ctypes_lib.cpp b/dispatcher/bindings/ctypes/grouped_gemm_bquant_ctypes_lib.cpp new file mode 100644 index 00000000000..22e0b7db9b8 --- /dev/null +++ b/dispatcher/bindings/ctypes/grouped_gemm_bquant_ctypes_lib.cpp @@ -0,0 +1,362 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +/** + * GroupedGemm BQuant ctypes Library + * + * Provides a C API for Python ctypes integration. One .so is compiled per + * kernel variant; the kernel is force-included at compile time: + * hipcc -include -DCK_TILE_SINGLE_KERNEL_INCLUDE grouped_gemm_bquant_ctypes_lib.cpp + * + * Force-include defines (from generated kernel header): + * SelectedKernel, KERNEL_NAME + * ADataType, BDataType, CDataType, QDataType, AccDataType, QuantGroupSize + * + * Design: direct launch -- SelectedKernel::launch(QuantGemmHostArgs, stream_config) is + * called directly. No dispatcher registry is used: BQuant kernels take QuantGemmHostArgs, + * which is incompatible with the GeneratedTileKernelInstance::run() signature used by + * the dispatcher's registry backend. + * + * Memory model: host-pointer (this library owns hipMalloc/hipMemcpy/hipFree). + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ck_tile/host/tensor_shuffle_utils.hpp" + +// Kernel header force-included via -include compiler flag. +// Defines: ADataType, BDataType, CDataType, QDataType, AccDataType, +// QuantGroupSize, SelectedKernel, KERNEL_NAME + +// Compute the byte count for N logical elements of type T. +// For packed types (pk_int4_t, pk_fp4_t) PackedSize=2, so N logical values +// occupy N/2 bytes even though sizeof(T)==1. For all other types PackedSize=1. +template +static constexpr std::size_t elements_to_bytes(std::size_t n) +{ + return n * sizeof(T) / ck_tile::numeric_traits::PackedSize; +} + +// GPU architecture is derived from the running device at launch time (see the +// runtime check in dispatcher_run_bquant_gemm) rather than assumed at compile +// time -- do not hardcode a default architecture here. + +static bool g_initialized = false; + +#define HIP_CHECK(call) \ + { \ + hipError_t _err = (call); \ + if(_err != hipSuccess) \ + { \ + std::cerr << "HIP error: " << hipGetErrorString(_err) << " at " << __FILE__ << ":" \ + << __LINE__ << "\n"; \ + return -1; \ + } \ + } + +extern "C" { + +/** + * Initialize the ctypes lib. Must be called before dispatcher_run_bquant_gemm. + * + * This library uses a single-kernel-per-.so model: SelectedKernel is + * force-included at compile time and invoked directly via SelectedKernel::launch(). + * No dispatcher registry is involved -- BQuant kernels require QuantGemmHostArgs + * which is incompatible with the GeneratedTileKernelInstance::run() signature that + * the dispatcher's registry backend uses. + * + * Returns 0 on success. + */ +int dispatcher_initialize() +{ + if(g_initialized) + return 0; + g_initialized = true; + return 0; +} + +/** + * Run BQuantGrouped GEMM: C[M,N] = A[M,K] @ dequant(B[K,N], BQ[ceil(K/gK), ceil(N/gN)]) + * + * A, B, BQ, C are host pointers. This function manages device memory internally. + * + * Parameters: + * A, B, BQ, C - host data pointers + * M, N, K - matrix dimensions + * stride_A - leading dimension of A (row-major: K; col-major: M) + * stride_B - leading dimension of B (col-major: K; row-major: N) + * stride_BQ - leading dimension of BQ (row-major: ceil(N/gN)) + * stride_C - leading dimension of C (row-major: N) + * QK_B - number of K-groups = ceil(K / quant_group_k) + * QN_B - number of N-groups = ceil(N / quant_group_n) + * k_batch - split-K factor (1 = no split) + * time_ms - output: kernel execution time in ms (may be NULL) + * + * Returns 0 on success, negative on error. + */ +int dispatcher_run_bquant_gemm(const void* A, + const void* B, + const void* BQ, + void* C, + int64_t M, + int64_t N, + int64_t K, + int64_t stride_A, + int64_t stride_B, + int64_t stride_BQ, + int64_t stride_C, + int64_t QK_B, + int64_t QN_B, + int k_batch, + float* time_ms) +{ + if(!g_initialized) + { + std::cerr << "dispatcher_run_bquant_gemm: not initialized\n"; + return -1; + } + if(!A || !B || !BQ || !C) + { + std::cerr << "dispatcher_run_bquant_gemm: null pointer argument\n"; + return -1; + } + if(M <= 0 || N <= 0 || K <= 0 || QK_B <= 0 || QN_B <= 0) + { + std::cerr << "dispatcher_run_bquant_gemm: invalid dimensions\n"; + return -1; + } + + // Derive the GPU architecture from the running device (do not assume one at + // compile time) and reject unsupported archs, per review feedback. + { + int dev = 0; + hipDeviceProp_t props{}; + if(hipGetDevice(&dev) != hipSuccess || hipGetDeviceProperties(&props, dev) != hipSuccess) + { + std::cerr << "dispatcher_run_bquant_gemm: could not query device architecture\n"; + return -1; + } + const std::string arch(props.gcnArchName); + if(arch.rfind("gfx950", 0) != 0 && arch.rfind("gfx942", 0) != 0 && + arch.rfind("gfx90a", 0) != 0) + { + std::cerr << "dispatcher_run_bquant_gemm: unsupported GPU architecture '" << arch + << "' (supported: gfx90a, gfx942, gfx950)\n"; + return -1; + } + } + + // Validate that the caller's QK_B/QN_B match the compile-time quant group sizes + // baked into this .so. A mismatch means the BQ device buffer would be allocated + // with the wrong size while the kernel indexes it with different strides. + { + const int64_t expected_QK_B = + (K + static_cast(QuantGroupSize::kK) - 1) / QuantGroupSize::kK; + const int64_t expected_QN_B = + (N + static_cast(QuantGroupSize::kN) - 1) / QuantGroupSize::kN; + if(QK_B != expected_QK_B || QN_B != expected_QN_B) + { + std::cerr << "dispatcher_run_bquant_gemm: QK_B/QN_B mismatch. " << "Got (" << QK_B + << ", " << QN_B << "), " << "expected (" << expected_QK_B << ", " + << expected_QN_B << ") " << "for K=" << K << " N=" << N + << " with QuantGroupSize kK=" << QuantGroupSize::kK + << " kN=" << QuantGroupSize::kN << "\n"; + return -1; + } + } + + // This implementation only supports packed (contiguous) layouts. + // Device buffers are allocated and copied as M*K, K*N, QK_B*QN_B, M*N packed arrays. + // Non-packed strides would cause the kernel to index into a differently-sized buffer, + // producing incorrect results or out-of-bounds accesses. + if(stride_A != K || stride_B != K || stride_BQ != QN_B || stride_C != N) + { + std::cerr << "dispatcher_run_bquant_gemm: non-packed strides are not supported. " + << "Expected stride_A=" << K << " stride_B=" << K << " stride_BQ=" << QN_B + << " stride_C=" << N << ", got stride_A=" << stride_A << " stride_B=" << stride_B + << " stride_BQ=" << stride_BQ << " stride_C=" << stride_C << "\n"; + return -1; + } + + const ADataType* A_host = static_cast(A); + const BDataType* B_host = static_cast(B); + const QDataType* BQ_host = static_cast(BQ); + CDataType* C_host = static_cast(C); + + ADataType* A_dev = nullptr; + BDataType* B_dev = nullptr; + QDataType* BQ_dev = nullptr; + CDataType* C_dev = nullptr; + + auto cleanup = [&]() { + if(A_dev) + (void)hipFree(A_dev); + if(B_dev) + (void)hipFree(B_dev); + if(BQ_dev) + (void)hipFree(BQ_dev); + if(C_dev) + (void)hipFree(C_dev); + }; + + // Allocate device buffers. + // B may be a packed type (pk_int4_t, pk_fp4_t): 2 logical values per byte. + // elements_to_bytes(n) handles the packed case via numeric_traits::PackedSize. + if(hipMalloc(&A_dev, elements_to_bytes(M * K)) != hipSuccess) + { + cleanup(); + return -1; + } + if(hipMalloc(&B_dev, elements_to_bytes(K * N)) != hipSuccess) + { + cleanup(); + return -1; + } + if(hipMalloc(&BQ_dev, elements_to_bytes(QK_B * QN_B)) != hipSuccess) + { + cleanup(); + return -1; + } + if(hipMalloc(&C_dev, elements_to_bytes(M * N)) != hipSuccess) + { + cleanup(); + return -1; + } + + // Copy inputs to device + if(hipMemcpy(A_dev, A_host, elements_to_bytes(M * K), hipMemcpyHostToDevice) != + hipSuccess) + { + cleanup(); + return -1; + } + if(hipMemcpy(B_dev, B_host, elements_to_bytes(K * N), hipMemcpyHostToDevice) != + hipSuccess) + { + cleanup(); + return -1; + } + // Apply BQ preshuffle when required -- mirrors gemm_bquant_profiler.hpp:118-121. + // BPreshuffleQuant reorders BQ in host memory before the device copy so the kernel + // finds the scale values in the interleaved layout it expects. + if constexpr(SelectedKernel::BPreshuffleQuant) + { + constexpr int block_bq_k = + static_cast(SelectedKernel::TileK) / static_cast(QuantGroupSize::kK); + ck_tile::HostTensor bq_h( + ck_tile::host_tensor_descriptor(static_cast(QK_B), + static_cast(QN_B), + static_cast(QN_B), + ck_tile::bool_constant{} /*row-major*/)); + std::copy(BQ_host, BQ_host + QK_B * QN_B, bq_h.begin()); + auto bq_shuffled = ck_tile::shuffle_bq(&bq_h, block_bq_k); + if(hipMemcpy(BQ_dev, + bq_shuffled.data(), + elements_to_bytes(QK_B * QN_B), + hipMemcpyHostToDevice) != hipSuccess) + { + cleanup(); + return -1; + } + } + else + { + if(hipMemcpy( + BQ_dev, BQ_host, elements_to_bytes(QK_B * QN_B), hipMemcpyHostToDevice) != + hipSuccess) + { + cleanup(); + return -1; + } + } + if(hipMemset(C_dev, 0, elements_to_bytes(M * N)) != hipSuccess) + { + cleanup(); + return -1; + } + + // Build QuantGemmHostArgs (aq_ptr = nullptr, QK_A = 0, stride_AQ = 0 for BQuant-only) + ck_tile::QuantGemmHostArgs args; + args.a_ptr = A_dev; + args.b_ptr = B_dev; + args.aq_ptr = nullptr; + args.bq_ptr = BQ_dev; + args.c_ptr = C_dev; + args.k_batch = k_batch; + args.M = static_cast(M); + args.N = static_cast(N); + args.K = static_cast(K); + args.QK_A = 0; + args.QK_B = static_cast(QK_B); + args.stride_A = static_cast(stride_A); + args.stride_B = static_cast(stride_B); + args.stride_C = static_cast(stride_C); + args.stride_AQ = 0; + args.stride_BQ = static_cast(stride_BQ); + + const bool do_time = (time_ms != nullptr); + // When timing is requested use GPU timer with warmup (cold_niters=3, nrepeat=10). + // Otherwise run once with no overhead. + ck_tile::stream_config stream_cfg{ + nullptr, // stream_id_ + do_time, // time_kernel_ + 0, // log_level_ + do_time ? 3 : 0, // cold_niters_ + do_time ? 10 : 1, // nrepeat_ + do_time, // is_gpu_timer_ + false, // flush_cache_ + 1, // rotating_count_ + }; + + float exec_time = SelectedKernel::launch(args, stream_cfg); + + if(exec_time < 0.0f) + { + std::cerr << "dispatcher_run_bquant_gemm: kernel reported unsupported args\n"; + cleanup(); + return -2; + } + + // Copy result back + if(hipMemcpy(C_host, C_dev, elements_to_bytes(M * N), hipMemcpyDeviceToHost) != + hipSuccess) + { + cleanup(); + return -1; + } + + if(time_ms) + *time_ms = exec_time; + + cleanup(); + return 0; +} + +/** + * Return the compile-time KERNEL_NAME of the force-included kernel. + */ +const char* dispatcher_get_kernel_name() { return KERNEL_NAME; } + +/** + * Initialize dispatcher (alias kept for consistency with gemm_ctypes_lib). + */ +int dispatcher_init() { return dispatcher_initialize(); } + +/** + * Number of kernels in this .so (always 1: the force-included SelectedKernel). + */ +int dispatcher_get_kernel_count() { return 1; } + +/** + * Release resources. + */ +void dispatcher_cleanup() { g_initialized = false; } + +} // extern "C" diff --git a/dispatcher/bindings/ctypes/grouped_gemm_ctypes_lib.cpp b/dispatcher/bindings/ctypes/grouped_gemm_ctypes_lib.cpp new file mode 100644 index 00000000000..af1dc854afc --- /dev/null +++ b/dispatcher/bindings/ctypes/grouped_gemm_ctypes_lib.cpp @@ -0,0 +1,295 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +/** + * Grouped GEMM Dispatcher ctypes Library + * + * Provides C API for Python ctypes integration for the GROUPED GEMM variant. + * Kernel header included via -include at compile time. + * + * The grouped kernel has a genuinely different ABI from regular GEMM: it takes a + * LIST of (M,N,K) sub-problems plus arrays of A/B/C device pointers, and its + * generated launch() builds the per-group arg workspace internally: + * + * static float launch(const std::vector>& descs, + * const stream_config& stream); + * + * The single-problem dispatcher run path (g_dispatcher->run / GemmHostArgs) cannot + * express this, and the generated_tile_backend wrapper hard-codes the single-problem + * launch signature, so this lib calls SelectedKernel::launch(descs, stream) directly + * and reports the kernel name from the compile-time KERNEL_NAME macro instead of the + * registry. + * + * Usage from Python: + * lib = ctypes.CDLL("libdispatcher_grouped_gemm.so") + * lib.dispatcher_init() + * lib.dispatcher_run_grouped_gemm(...) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Kernel header included via -include compiler flag (with CK_TILE_SINGLE_KERNEL_INCLUDE). +// Defines: ADataType, BDataType, CDataType, AccDataType, SelectedKernel, KERNEL_NAME +// and transitively brings in ck_tile::GroupedGemmHostArgs and ck_tile::stream_config. + +// GPU architecture - can be overridden via -DGFX_ARCH="gfx90a" at compile time +#ifndef GFX_ARCH +#define GFX_ARCH "gfx942" +#endif + +static bool g_initialized = false; + +// Read an integer benchmark knob from the environment, falling back to +// `fallback` when unset or unparseable. Mirrors generated_tile_backend.hpp so +// both bridge sides honor the same CK_TILE_BENCH_* env vars. +static int env_int(const char* name, int fallback) +{ + const char* v = std::getenv(name); + if(v == nullptr || *v == '\0') + return fallback; + char* end = nullptr; + const long out = std::strtol(v, &end, 10); + if(end == v) + return fallback; + return static_cast(out); +} + +extern "C" { + +/** + * Initialize the grouped GEMM library. + * + * The grouped path does not use the dispatcher/registry (it launches the + * force-included kernel directly), so this is a lightweight no-op kept for ABI + * parity with the regular GEMM lib. Returns 0 on success. + */ +int dispatcher_initialize() +{ + g_initialized = true; + return 0; +} + +/** + * Initialize dispatcher (alias) + */ +int dispatcher_init() { return dispatcher_initialize(); } + +/** + * Run grouped GEMM on GPU by launching the force-included kernel directly. + * + * For each group: hipMalloc A/B/C, copy A and B host->device, memset C, then build + * a std::vector> with strides derived from the + * compile-time ALayout/BLayout/CLayout of the -include'd kernel header (k_batch=1) + * and launch. After the launch the per-group C buffers are copied back to the + * caller's host buffers. + * + * Layout contract: A is MxK, B is KxN, C is MxN; leading dimensions follow each + * operand's row/col-major layout (CLayout is always RowMajor for grouped). + * + * Returns: 0 on success, -1 on HIP error / generic throw, -2 if the kernel reports + * the arguments are unsupported. + */ +int dispatcher_run_grouped_gemm(int group_count, + const int64_t* Ms, + const int64_t* Ns, + const int64_t* Ks, + const void** A_ptrs, + const void** B_ptrs, + void** C_ptrs, + float* time_ms) +{ + if(!g_initialized || group_count <= 0 || !Ms || !Ns || !Ks || !A_ptrs || !B_ptrs || !C_ptrs) + { + return -1; + } + + std::vector A_dev(group_count, nullptr); + std::vector B_dev(group_count, nullptr); + std::vector C_dev(group_count, nullptr); + + auto cleanup_gpu_mem = [&]() { + for(int g = 0; g < group_count; ++g) + { + if(A_dev[g]) + (void)hipFree(A_dev[g]); + if(B_dev[g]) + (void)hipFree(B_dev[g]); + if(C_dev[g]) + (void)hipFree(C_dev[g]); + } + }; + + std::vector> descs; + descs.reserve(group_count); + + for(int g = 0; g < group_count; ++g) + { + const int64_t M = Ms[g]; + const int64_t N = Ns[g]; + const int64_t K = Ks[g]; + + if(M <= 0 || N <= 0 || K <= 0 || !A_ptrs[g] || !B_ptrs[g] || !C_ptrs[g]) + { + cleanup_gpu_mem(); + return -1; + } + + if(hipMalloc(&A_dev[g], M * K * sizeof(ADataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMalloc(&B_dev[g], K * N * sizeof(BDataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMalloc(&C_dev[g], M * N * sizeof(CDataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + + if(hipMemcpy(A_dev[g], A_ptrs[g], M * K * sizeof(ADataType), hipMemcpyHostToDevice) != + hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMemcpy(B_dev[g], B_ptrs[g], K * N * sizeof(BDataType), hipMemcpyHostToDevice) != + hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMemset(C_dev[g], 0, M * N * sizeof(CDataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + + // Derive leading dimensions from the compile-time layouts the kernel was + // generated with (ALayout/BLayout/CLayout from the -include'd header), + // matching Old-TE gemm_validation_utils.get_abc_layouts: + // stride_A = ALayout row-major ? K : M + // stride_B = BLayout row-major ? N : K + // stride_E = CLayout row-major ? N : M (CLayout is always RowMajor for grouped) + using RowMajor = ck_tile::tensor_layout::gemm::RowMajor; + const auto stride_A = std::is_same_v ? static_cast(K) + : static_cast(M); + const auto stride_B = std::is_same_v ? static_cast(N) + : static_cast(K); + const auto stride_E = std::is_same_v ? static_cast(N) + : static_cast(M); + // k_batch=1 for numeric parity. + descs.emplace_back(static_cast(A_dev[g]), + static_cast(B_dev[g]), + std::array{}, + static_cast(C_dev[g]), + /*k_batch=*/1, + static_cast(M), + static_cast(N), + static_cast(K), + stride_A, + stride_B, + std::array{}, + stride_E); + } + + ck_tile::stream_config stream_cfg; + stream_cfg.stream_id_ = nullptr; + stream_cfg.time_kernel_ = true; + stream_cfg.log_level_ = 0; + stream_cfg.cold_niters_ = env_int("CK_TILE_BENCH_WARMUP", 50); + stream_cfg.nrepeat_ = env_int("CK_TILE_BENCH_REPEAT", 100); + stream_cfg.is_gpu_timer_ = true; + stream_cfg.flush_cache_ = false; + stream_cfg.rotating_count_ = 1; + + float exec_time = 0.0f; + try + { + exec_time = SelectedKernel::launch(descs, stream_cfg); + } + catch(const std::exception& e) + { + cleanup_gpu_mem(); + if(std::string(e.what()).find("not supported") != std::string::npos) + { + if(time_ms) + { + *time_ms = -1.0f; + } + return -2; // Arguments not supported by this kernel + } + return -1; + } + + // Copy each group's result back to host. + for(int g = 0; g < group_count; ++g) + { + const int64_t M = Ms[g]; + const int64_t N = Ns[g]; + if(hipMemcpy(C_ptrs[g], C_dev[g], M * N * sizeof(CDataType), hipMemcpyDeviceToHost) != + hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + } + + if(time_ms) + { + *time_ms = exec_time; + } + + cleanup_gpu_mem(); + return 0; +} + +/** + * Get kernel information (legacy single-kernel ABI). + * + * Returns the compile-time KERNEL_NAME of the force-included kernel header. + */ +const char* dispatcher_get_kernel_name() { return KERNEL_NAME; } + +/** + * Get the name of the kernel at a given registry index (multi-kernel ABI). + * + * Each grouped .so force-includes exactly one kernel header, so index 0 reports + * KERNEL_NAME and any other index is out of range. Mirrors the regular GEMM lib's + * name ABI so the Python bridge can use the same name-lookup path. + * Returns 0 on success, -1 on bad args or out-of-range index. + */ +int dispatcher_get_kernel_name_at(int index, char* buffer, int buffer_size) +{ + if(!buffer || buffer_size <= 0 || index != 0) + { + return -1; + } + + std::strncpy(buffer, KERNEL_NAME, static_cast(buffer_size) - 1); + buffer[buffer_size - 1] = '\0'; + return 0; +} + +/** + * Get the number of kernels in this .so (always 1 for the grouped single-include lib). + */ +int dispatcher_get_kernel_count() { return 1; } + +/** + * Cleanup library resources (no-op; kept for ABI parity). + */ +void dispatcher_cleanup() { g_initialized = false; } + +} // extern "C" diff --git a/dispatcher/bindings/ctypes/multi_d_gemm_ctypes_lib.cpp b/dispatcher/bindings/ctypes/multi_d_gemm_ctypes_lib.cpp new file mode 100644 index 00000000000..e2cdf2133be --- /dev/null +++ b/dispatcher/bindings/ctypes/multi_d_gemm_ctypes_lib.cpp @@ -0,0 +1,359 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +/** + * Multi-D GEMM Dispatcher ctypes Library + * + * Provides a C API for Python ctypes integration for the MULTI_D GEMM variant. + * Kernel header included via -include at compile time. + * + * The multi-D kernel has a genuinely different ABI from regular GEMM: in + * addition to A/B/C it consumes a fixed number (NumDTensor) of extra D device + * pointers that the CShuffle epilogue fuses element-wise into the output: + * + * E = elementwise_op(A @ B, D0, D1, ...) + * + * Its generated launch() takes GemmMultiDArgs (= GemmMultiDHostArgs) + * carrying the D-pointer array and per-D strides: + * + * static float launch(const GemmMultiDArgs& args, const stream_config& stream); + * + * The single-problem dispatcher run path (g_dispatcher->run / GemmHostArgs) + * cannot express the D tensors, and the generated_tile_backend wrapper ignores + * d_ptrs and calls the GemmHostArgs overload (empty D tensors), so this lib + * calls SelectedKernel::launch(GemmMultiDArgs, stream) directly and reports the + * kernel name from the compile-time KERNEL_NAME macro instead of the registry. + * This mirrors the grouped / stream-K bridge libraries. + * + * Usage from Python: + * lib = ctypes.CDLL("libdispatcher_multi_d_gemm.so") + * lib.dispatcher_init() + * lib.dispatcher_run_multi_d_gemm(...) + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Kernel header included via -include compiler flag (with CK_TILE_SINGLE_KERNEL_INCLUDE). +// Defines: ADataType, BDataType, CDataType, AccDataType, SelectedKernel, KERNEL_NAME, +// NumDTensor, DsDataType, DsLayout, DLayout, ElementWiseFn, GemmMultiDArgs, and +// transitively brings in ck_tile::GemmMultiDHostArgs and ck_tile::stream_config. + +// GPU architecture - must be provided via -DGFX_ARCH="" at compile time +#ifndef GFX_ARCH +#error \ + "GFX_ARCH must be defined at compile time (pass -DGFX_ARCH=); do not default to a specific GPU architecture." +#endif + +#ifndef GEMM_KEY_NUM_D_TENSORS +#define GEMM_KEY_NUM_D_TENSORS 0 +#endif + +static bool g_initialized = false; + +// Read an integer benchmark knob from the environment, falling back to +// `fallback` when unset or unparseable. Mirrors generated_tile_backend.hpp so +// both bridge sides honor the same CK_TILE_BENCH_* env vars. +static int env_int(const char* name, int fallback) +{ + const char* v = std::getenv(name); + if(v == nullptr || *v == '\0') + return fallback; + char* end = nullptr; + const long out = std::strtol(v, &end, 10); + if(end == v) + return fallback; + return static_cast(out); +} + +// Read a boolean benchmark knob from the environment. Accepts 1/0, true/false, +// yes/no, on/off (case-insensitive). Falls back to `fallback` when unset. +static bool env_bool(const char* name, bool fallback) +{ + const char* v = std::getenv(name); + if(v == nullptr || *v == '\0') + return fallback; + std::string s(v); + for(auto& c : s) + c = static_cast(std::tolower(static_cast(c))); + if(s == "1" || s == "true" || s == "yes" || s == "on") + return true; + if(s == "0" || s == "false" || s == "no" || s == "off") + return false; + return fallback; +} + +extern "C" { + +/** + * Initialize the multi-D GEMM library. + * + * The multi-D path does not use the dispatcher/registry (it launches the + * force-included kernel directly), so this is a lightweight no-op kept for ABI + * parity with the regular GEMM lib. Returns 0 on success. + */ +int dispatcher_initialize() +{ + g_initialized = true; + return 0; +} + +/** + * Initialize dispatcher (alias) + */ +int dispatcher_init() { return dispatcher_initialize(); } + +/** + * Number of D tensors this kernel was compiled for. + * + * The Python runner queries this so it can allocate/pass exactly the right + * number of D operands (the count is baked into the force-included header). + */ +int dispatcher_get_num_d_tensors() { return static_cast(NumDTensor); } + +/** + * Run multi-D GEMM on GPU by launching the force-included kernel directly. + * + * hipMalloc A/B/C plus `num_d` D buffers, copy A/B and each D host->device, + * memset C, build a GemmMultiDArgs with strides derived from the compile-time + * ALayout/BLayout/CLayout/DLayout of the -include'd header (k_batch=1), launch, + * then copy C back. + * + * Layout contract: A is MxK, B is KxN, C and every D are MxN; leading + * dimensions follow each operand's row/col-major layout. C and D are row-major + * for the TE multi_d builder (4-char layout, last two chars 'r'). + * + * `d_ptrs` points to `num_d` host buffers (each MxN, element type == CDataType). + * `num_d` MUST equal dispatcher_get_num_d_tensors(); a mismatch returns -1. + * + * Returns: 0 on success, -1 on HIP error / bad args / generic throw, -2 if the + * kernel reports the arguments are unsupported. + */ +int dispatcher_run_multi_d_gemm(const void* A, + const void* B, + const void** d_ptrs, + int num_d, + void* C, + int64_t M, + int64_t N, + int64_t K, + float* time_ms) +{ + if(!g_initialized || !A || !B || !C || M <= 0 || N <= 0 || K <= 0) + { + return -1; + } + if(num_d != static_cast(NumDTensor)) + { + return -1; // caller must pass exactly the compiled-in number of D tensors + } + if(NumDTensor > 0 && !d_ptrs) + { + return -1; + } + + ADataType* A_dev = nullptr; + BDataType* B_dev = nullptr; + CDataType* C_dev = nullptr; + std::array D_dev{}; + for(std::size_t i = 0; i < NumDTensor; ++i) + D_dev[i] = nullptr; + + auto cleanup_gpu_mem = [&]() { + if(A_dev) + (void)hipFree(A_dev); + if(B_dev) + (void)hipFree(B_dev); + if(C_dev) + (void)hipFree(C_dev); + for(std::size_t i = 0; i < NumDTensor; ++i) + if(D_dev[i]) + (void)hipFree(D_dev[i]); + }; + + if(hipMalloc(&A_dev, M * K * sizeof(ADataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMalloc(&B_dev, K * N * sizeof(BDataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMalloc(&C_dev, M * N * sizeof(CDataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + for(std::size_t i = 0; i < NumDTensor; ++i) + { + if(!d_ptrs[i]) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMalloc(&D_dev[i], M * N * sizeof(CDataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + } + + if(hipMemcpy(A_dev, A, M * K * sizeof(ADataType), hipMemcpyHostToDevice) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMemcpy(B_dev, B, K * N * sizeof(BDataType), hipMemcpyHostToDevice) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMemset(C_dev, 0, M * N * sizeof(CDataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + for(std::size_t i = 0; i < NumDTensor; ++i) + { + if(hipMemcpy(D_dev[i], d_ptrs[i], M * N * sizeof(CDataType), hipMemcpyHostToDevice) != + hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + } + + // Derive leading dimensions from the compile-time layouts the kernel was + // generated with (ALayout/BLayout/CLayout/DLayout from the -include'd + // header), matching Old-TE gemm_validation_utils.get_abc_layouts: + // stride_A = ALayout row-major ? K : M + // stride_B = BLayout row-major ? N : K + // stride_D = DLayout row-major ? N : M (row-major for multi_d) + // stride_E = CLayout row-major ? N : M (row-major for multi_d) + using RowMajor = ck_tile::tensor_layout::gemm::RowMajor; + const auto stride_A = std::is_same_v ? static_cast(K) + : static_cast(M); + const auto stride_B = std::is_same_v ? static_cast(N) + : static_cast(K); + const auto stride_E = std::is_same_v ? static_cast(N) + : static_cast(M); + const auto stride_D = std::is_same_v ? static_cast(N) + : static_cast(M); + + std::array ds_ptr{}; + std::array stride_Ds{}; + for(std::size_t i = 0; i < NumDTensor; ++i) + { + ds_ptr[i] = static_cast(D_dev[i]); + stride_Ds[i] = stride_D; + } + + // k_batch=1 for numeric parity (multi_d kernel requires k_batch == 1). + GemmMultiDArgs args(static_cast(A_dev), + static_cast(B_dev), + ds_ptr, + static_cast(C_dev), + /*k_batch=*/1, + static_cast(M), + static_cast(N), + static_cast(K), + stride_A, + stride_B, + stride_Ds, + stride_E); + + ck_tile::stream_config stream_cfg; + stream_cfg.stream_id_ = nullptr; + stream_cfg.time_kernel_ = true; + stream_cfg.log_level_ = 0; + stream_cfg.cold_niters_ = env_int("CK_TILE_BENCH_WARMUP", 50); + stream_cfg.nrepeat_ = env_int("CK_TILE_BENCH_REPEAT", 100); + stream_cfg.is_gpu_timer_ = true; + // Fair-by-default: match Old-TE gemm_multi_d benchmark (flush_cache=true, + // rotating_count=1000) so the committed bridge benchmark is reproducible and + // apples-to-apples out of the box. Both remain env-tunable. + stream_cfg.flush_cache_ = env_bool("CK_TILE_BENCH_FLUSH", true); + stream_cfg.rotating_count_ = env_int("CK_TILE_BENCH_ROTATING", 1000); + + float exec_time = 0.0f; + try + { + exec_time = SelectedKernel::launch(args, stream_cfg); + } + catch(const std::exception& e) + { + cleanup_gpu_mem(); + if(std::string(e.what()).find("not supported") != std::string::npos) + { + if(time_ms) + { + *time_ms = -1.0f; + } + return -2; // Arguments not supported by this kernel + } + return -1; + } + + if(hipMemcpy(C, C_dev, M * N * sizeof(CDataType), hipMemcpyDeviceToHost) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + + if(time_ms) + { + *time_ms = exec_time; + } + + cleanup_gpu_mem(); + return 0; +} + +/** + * Get kernel information (legacy single-kernel ABI). + * + * Returns the compile-time KERNEL_NAME of the force-included kernel header. + */ +const char* dispatcher_get_kernel_name() { return KERNEL_NAME; } + +/** + * Get the name of the kernel at a given registry index (multi-kernel ABI). + * + * Each multi-D .so force-includes exactly one kernel header, so index 0 reports + * KERNEL_NAME and any other index is out of range. Mirrors the regular GEMM + * lib's name ABI so the Python bridge can use the same name-lookup path. + * Returns 0 on success, -1 on bad args or out-of-range index. + */ +int dispatcher_get_kernel_name_at(int index, char* buffer, int buffer_size) +{ + if(!buffer || buffer_size <= 0 || index != 0) + { + return -1; + } + + std::strncpy(buffer, KERNEL_NAME, static_cast(buffer_size) - 1); + buffer[buffer_size - 1] = '\0'; + return 0; +} + +/** + * Get the number of kernels in this .so (always 1 for the multi-D single-include lib). + */ +int dispatcher_get_kernel_count() { return 1; } + +/** + * Cleanup library resources (no-op; kept for ABI parity). + */ +void dispatcher_cleanup() { g_initialized = false; } + +} // extern "C" diff --git a/dispatcher/bindings/ctypes/mx_gemm_ctypes_lib.cpp b/dispatcher/bindings/ctypes/mx_gemm_ctypes_lib.cpp new file mode 100644 index 00000000000..018ada94f62 --- /dev/null +++ b/dispatcher/bindings/ctypes/mx_gemm_ctypes_lib.cpp @@ -0,0 +1,401 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +/** + * MX-GEMM Dispatcher ctypes Library (TileEngine -> Dispatcher bridge). + * + * Provides a C API for Python ctypes integration. The kernel header is + * force-included at compile time: + * hipcc -include -DCK_TILE_SINGLE_KERNEL_INCLUDE mx_gemm_ctypes_lib.cpp + * + * Force-include defines (at global scope): SelectedKernel (with static constexpr + * TileM/TileN/TileK, WarpPerBlock_{M,N,K}, WarpTile{M,N,K} and + * static float launch(const MxGemmHostArgs&, const ck_tile::stream_config&)), + * KERNEL_NAME, ADataType/BDataType/CDataType/AccDataType/ScaleType(=e8m0_t), + * using MxGemmHostArgs = ck_tile::MxGemmHostArgs<1,1,0>, ALayout/BLayout/CLayout, + * and #include "ck_tile/ops/gemm.hpp". + * + * Registry bypass: microscaling GEMM's launch takes ck_tile::MxGemmHostArgs + * (with per-32-K e8m0 block scales that must be pre-shuffled for gfx950), which + * the generic dispatcher backend cannot express. So this lib builds the HostArgs + * from plain C arrays and calls SelectedKernel::launch() directly -- the same + * direct-launch pattern used by the batched/multi-D bridges. + * + * Memory model: host-pointer in. The lib owns device allocation/copy/free via + * ck_tile::HostTensor + ck_tile::DeviceMem (RAII), exactly like the Old-TE + * profiler. A/B/C byte sizes come from HostTensor::get_element_space_size_in_bytes(), + * which divides the logical element count by numeric_traits::PackedSize -- so + * fp8 (PackedSize==1) allocates M*K bytes while fp4 (pk_fp4_t PackedSize==2, two + * e2m1 elements per byte) allocates M*K/2 bytes. The incoming A/B host buffers + * are therefore expected PHYSICALLY packed ([M,K/PackedSize]/[N,K/PackedSize] + * bytes); strides passed to the kernel stay in LOGICAL element units. + * Layout is fixed by the compiled-in ALayout/BLayout/CLayout (rcr: A row-major + * [M,K], B col-major [K,N] == [N,K] storage, C row-major [M,N]). K % 32 == 0. + * v1 scope: k_batch == 1 (no split-K). + * + * The scale pre-shuffle mirrors mx_gemm_profiler.hpp exactly: pack params are + * derived from SelectedKernel tile dims at compile time (not hardcoded). + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// Kernel header force-included via -include. Brings in ck_tile core + the +// ck_tile::MxGemmHostArgs type, SelectedKernel/KERNEL_NAME, and (via +// ck_tile/ops/gemm.hpp) the mx pipeline. We additionally pull the host +// helpers explicitly for HostTensor / preShuffleScaleBuffer_gfx950. +#include "ck_tile/host.hpp" +// Old-TE common helpers: provides the free-function template is_row_major(Layout) +// -> ck_tile::bool_constant<...>, matching the mx_gemm profiler usage. +#include "common/utils.hpp" + +#ifndef GFX_ARCH +#error \ + "GFX_ARCH must be defined at compile time (pass -DGFX_ARCH=); do not default to a specific GPU architecture." +#endif + +// The MX (microscaling) block-scale pre-shuffle below uses ck_tile's gfx950-only +// preShuffleScaleBuffer_gfx950 host helper, so this bridge is inherently gfx950 +// only. Make that scope explicit: fail the build clearly on any other arch +// instead of silently mis-calling the gfx950 helper. +static_assert(std::string_view(GFX_ARCH) == "gfx950", + "mx_gemm dispatcher bridge is gfx950-only (uses preShuffleScaleBuffer_gfx950); " + "build with -DGFX_ARCH=gfx950."); + +static bool g_initialized = false; + +namespace { + +int env_int(const char* name, int fallback) +{ + const char* v = std::getenv(name); + if(!v) + return fallback; + return std::atoi(v); +} + +} // namespace + +extern "C" { + +int dispatcher_initialize() +{ + g_initialized = true; + return 0; +} +int dispatcher_init() { return dispatcher_initialize(); } + +const char* dispatcher_get_kernel_name() +{ +#ifdef CK_TILE_SINGLE_KERNEL_INCLUDE + return KERNEL_NAME; +#else + // No kernel force-included (CMake no-kernel fallback): report an empty name. + return ""; +#endif +} +int dispatcher_get_kernel_count() { return 1; } + +void dispatcher_cleanup() { g_initialized = false; } + +/** + * Run microscaling GEMM: C[M,N] = (A[M,K] * scale_a) . (B[K,N] * scale_b). + * + * A, B, C are host pointers. scale_a/scale_b are raw e8m0 bytes, unpacked and + * unshuffled, shaped [M, K/32] and [N, K/32] row-major respectively. The lib + * builds HostTensors from them, runs the SAME preShuffleScaleBuffer_gfx950 path + * as the Old-TE profiler, uploads everything, and calls SelectedKernel::launch. + * + * Returns 0 ok, -1 HIP/bad-args, -2 unsupported shape (divisibility) or kernel rejects. + */ +int dispatcher_run_mx_gemm(const void* A, + const void* B, + void* C, + const uint8_t* scale_a, + const uint8_t* scale_b, + int M, + int N, + int K, + int k_batch, + float* time_ms) +{ +#ifndef CK_TILE_SINGLE_KERNEL_INCLUDE + // No kernel was force-included (see the CMake no-kernel fallback). The body + // below needs SelectedKernel/MxGemmHostArgs/ScaleType/... which only exist + // under -DCK_TILE_SINGLE_KERNEL_INCLUDE, so this build cannot run anything: + // report "unsupported" (-2) instead of failing to compile/link. + (void)A; + (void)B; + (void)C; + (void)scale_a; + (void)scale_b; + (void)M; + (void)N; + (void)K; + (void)k_batch; + (void)time_ms; + std::cerr << "dispatcher_run_mx_gemm: library built without a kernel; unsupported\n"; + return -2; +#else + if(!g_initialized) + { + std::cerr << "dispatcher_run_mx_gemm: not initialized\n"; + return -1; + } + if(!A || !B || !C || !scale_a || !scale_b) + { + std::cerr << "dispatcher_run_mx_gemm: null pointer\n"; + return -1; + } + if(M <= 0 || N <= 0 || K <= 0) + { + std::cerr << "dispatcher_run_mx_gemm: M,N,K must be > 0\n"; + return -1; + } + if(K % 32 != 0) + { + std::cerr << "dispatcher_run_mx_gemm: MX GEMM requires K to be a multiple of 32, got K=" + << K << "\n"; + return -1; + } + if(k_batch != 1) + { + // v1 scope: split-K (k_batch > 1) is not yet supported through this bridge. + // This is a v1 feature limitation, not a bad-argument/HIP error, so report + // -2 (unsupported) per the documented convention above -- the Python + // wrapper then surfaces it as "unsupported" rather than a generic error. + std::cerr << "dispatcher_run_mx_gemm: only k_batch==1 is supported in v1, got " << k_batch + << "\n"; + return -2; + } + + // MX block-scale pre-shuffle is gfx950-only (preShuffleScaleBuffer_gfx950). + // The compile-time static_assert already pins the build to gfx950; also guard + // at runtime so a gfx950-built .so run on a non-gfx950 device fails clearly + // instead of launching an arch-mismatched kernel. + { + int dev = 0; + hipDeviceProp_t props{}; + if(hipGetDevice(&dev) != hipSuccess || hipGetDeviceProperties(&props, dev) != hipSuccess) + { + std::cerr << "dispatcher_run_mx_gemm: could not query device architecture\n"; + return -1; + } + if(std::string_view(props.gcnArchName).substr(0, 6) != "gfx950") + { + std::cerr << "dispatcher_run_mx_gemm: MX GEMM is gfx950-only; running device is " + << props.gcnArchName << "\n"; + return -1; + } + } + + const ALayout layout_a = ALayout{}; + const BLayout layout_b = BLayout{}; + const CLayout layout_c = CLayout{}; + + const ck_tile::index_t m = static_cast(M); + const ck_tile::index_t n = static_cast(N); + const ck_tile::index_t k = static_cast(K); + + // Packed default strides for the compiled-in layouts (rcr: A row-major, + // B col-major, C row-major), matching the Old-TE profiler. get_default_stride + // takes the row-major-ness as a compile-time bool_constant tag (4th arg). + const ck_tile::index_t stride_a = + static_cast(ck_tile::get_default_stride(m, k, 0, is_row_major(layout_a))); + const ck_tile::index_t stride_b = + static_cast(ck_tile::get_default_stride(k, n, 0, is_row_major(layout_b))); + const ck_tile::index_t stride_c = + static_cast(ck_tile::get_default_stride(m, n, 0, is_row_major(layout_c))); + + const ck_tile::index_t scale_k_size = k / 32; + + // ---- Scale pre-shuffle pack params, derived from SelectedKernel (compile + // time), exactly mirroring mx_gemm_profiler.hpp. ---- + constexpr ck_tile::index_t m_per_xdl = SelectedKernel::WarpTileM; + constexpr ck_tile::index_t n_per_xdl = SelectedKernel::WarpTileN; + constexpr ck_tile::index_t k_per_xdl = SelectedKernel::WarpTileK; + constexpr ck_tile::index_t m_iter_per_warp = + SelectedKernel::TileM / (SelectedKernel::WarpPerBlock_M * m_per_xdl); + constexpr ck_tile::index_t n_iter_per_warp = + SelectedKernel::TileN / (SelectedKernel::WarpPerBlock_N * n_per_xdl); + constexpr ck_tile::index_t k_iter_per_warp = SelectedKernel::TileK / k_per_xdl; + + constexpr ck_tile::index_t m_xdl_pack = + (m_iter_per_warp >= 2 && m_iter_per_warp % 2 == 0) ? 2 : 1; + constexpr ck_tile::index_t n_xdl_pack = + (n_iter_per_warp >= 2 && n_iter_per_warp % 2 == 0) ? 2 : 1; + constexpr ck_tile::index_t k_xdl_pack = + (k_iter_per_warp >= 2 && k_iter_per_warp % 2 == 0) ? 2 : 1; + + constexpr ck_tile::index_t xdl_mn_thread = SelectedKernel::WarpTileM; + constexpr ck_tile::index_t xdl_k_thread = 64 / xdl_mn_thread; + + // ---- Divisibility guard. The shuffled scale-buffer sizes below use integer + // division by the xdl pack factors (m/m_xdl_pack, n/n_xdl_pack, + // scale_k_size/k_xdl_pack). If M/N/scale_k are not exact multiples of their + // pack factors, that division silently truncates the shuffled buffers, so the + // pre-shuffle would read/write past valid data and the kernel would consume a + // corrupt scale layout. Return -2 (unsupported shape for the selected warp + // tile) rather than -1 (bad-args/HIP error), consistent with the IsSupportedArguments- + // style rejects used elsewhere in the dispatcher ctypes layer. ---- + if(m % m_xdl_pack != 0 || n % n_xdl_pack != 0 || scale_k_size % k_xdl_pack != 0) + { + std::cerr << "dispatcher_run_mx_gemm: M, N, and scale_k (=K/32) must be divisible by the " + "xdl pack factors (m_xdl_pack=" + << m_xdl_pack << ", n_xdl_pack=" << n_xdl_pack << ", k_xdl_pack=" << k_xdl_pack + << ") for the selected warp tile; got M=" << m << ", N=" << n + << ", scale_k=" << scale_k_size << "\n"; + return -2; + } + + // ---- Build unshuffled scale HostTensors from the incoming raw e8m0 bytes. + // scale_a: [M, K/32] row-major; scale_b: [N, K/32] row-major. ---- + ck_tile::HostTensor scale_a_host( + {static_cast(m), static_cast(scale_k_size)}, + {static_cast(scale_k_size), static_cast(1)}); + ck_tile::HostTensor scale_b_host( + {static_cast(n), static_cast(scale_k_size)}, + {static_cast(scale_k_size), static_cast(1)}); + + const std::size_t scale_a_count = static_cast(m) * scale_k_size; + const std::size_t scale_b_count = static_cast(n) * scale_k_size; + // e8m0_t wraps a single uint8 (raw biased exponent); construct 1:1 from the + // incoming raw byte via the explicit e8m0_t(raw_type) constructor. + for(std::size_t i = 0; i < scale_a_count; ++i) + scale_a_host.mData[i] = ScaleType(static_cast(scale_a[i])); + for(std::size_t i = 0; i < scale_b_count; ++i) + scale_b_host.mData[i] = ScaleType(static_cast(scale_b[i])); + + // ---- Shuffled scale buffers (same lengths as the profiler). ---- + ck_tile::HostTensor scale_a_shuffled( + {static_cast(m / m_xdl_pack * 2), + static_cast(scale_k_size / k_xdl_pack * 2)}, + {static_cast(scale_k_size / k_xdl_pack * 2), static_cast(1)}); + ck_tile::HostTensor scale_b_shuffled( + {static_cast(n / n_xdl_pack * 2), + static_cast(scale_k_size / k_xdl_pack * 2)}, + {static_cast(scale_k_size / k_xdl_pack * 2), static_cast(1)}); + + ck_tile::preShuffleScaleBuffer_gfx950( + scale_a_host.mData.data(), scale_a_shuffled.mData.data(), m, scale_k_size, true); + ck_tile::preShuffleScaleBuffer_gfx950( + scale_b_host.mData.data(), scale_b_shuffled.mData.data(), n, scale_k_size, true); + + // ---- Build A/B/C HostTensors with the SAME descriptors the Old-TE profiler + // uses, then allocate/copy through ck_tile::DeviceMem. This makes the byte + // accounting packing-correct for BOTH fp8 (PackedSize==1) and fp4 + // (pk_fp4_t::PackedSize==2, i.e. two logical e2m1 elements per byte): + // HostTensor::get_element_space_size_in_bytes() == + // sizeof(T) * (logical_elems / numeric_traits::PackedSize). + // The incoming A/B host buffers are already PHYSICALLY packed + // ([M, K/PackedSize] and [N, K/PackedSize] bytes for fp4; [M,K]/[N,K] for + // fp8), so we byte-copy them into mData (which is sized in physical objects). + // Strides remain in LOGICAL element units (get_default_stride above uses + // logical M,N,K), which is what the kernel expects. + ck_tile::HostTensor a_m_k( + ck_tile::host_tensor_descriptor(m, k, stride_a, is_row_major(layout_a))); + ck_tile::HostTensor b_k_n( + ck_tile::host_tensor_descriptor(k, n, stride_b, is_row_major(layout_b))); + ck_tile::HostTensor c_m_n( + ck_tile::host_tensor_descriptor(m, n, stride_c, is_row_major(layout_c))); + + const std::size_t a_bytes = a_m_k.get_element_space_size_in_bytes(); + const std::size_t b_bytes = b_k_n.get_element_space_size_in_bytes(); + const std::size_t c_bytes = c_m_n.get_element_space_size_in_bytes(); + + std::memcpy(a_m_k.mData.data(), A, a_bytes); + std::memcpy(b_k_n.mData.data(), B, b_bytes); + + const std::size_t scale_a_bytes = scale_a_shuffled.get_element_space_size_in_bytes(); + const std::size_t scale_b_bytes = scale_b_shuffled.get_element_space_size_in_bytes(); + + float exec_time = 0.0f; + try + { + // Call-local device buffers, sized via HostTensor (packing-correct). + // Each call allocates and (via RAII) frees its own DeviceMem -- the same + // per-call lifetime model the batched/multi_abd bridges use. A/B/scales + // are uploaded and C is zeroed every call, so per-shape data is fresh. + ck_tile::DeviceMem a_dev(a_bytes); + ck_tile::DeviceMem b_dev(b_bytes); + ck_tile::DeviceMem c_dev(c_bytes); + ck_tile::DeviceMem sa_dev(scale_a_bytes); + ck_tile::DeviceMem sb_dev(scale_b_bytes); + + a_dev.ToDevice(a_m_k.data()); + b_dev.ToDevice(b_k_n.data()); + c_dev.SetZero(); + sa_dev.ToDevice(scale_a_shuffled.data()); + sb_dev.ToDevice(scale_b_shuffled.data()); + + void* a_ptr = a_dev.GetDeviceBuffer(); + void* b_ptr = b_dev.GetDeviceBuffer(); + void* c_ptr = c_dev.GetDeviceBuffer(); + void* scale_a_ptr = sa_dev.GetDeviceBuffer(); + void* scale_b_ptr = sb_dev.GetDeviceBuffer(); + + // ---- Build MxGemmHostArgs in the exact profiler argument order: + // a_ptr, scale_a, b_ptr, scale_b, ds{}, c_ptr, split_k, m, n, k, + // {stride_a}, {stride_b}, ds_strides{}, stride_c. ---- + MxGemmHostArgs gemm_args({a_ptr}, + {scale_a_ptr}, + {b_ptr}, + {scale_b_ptr}, + {}, + c_ptr, + static_cast(k_batch), + m, + n, + k, + {stride_a}, + {stride_b}, + {}, + stride_c); + + const bool do_time = (time_ms != nullptr); + // Defaults match the bridge parity-sweep convention (warmup 50 / repeat + // 100) so bridge-vs-Old-TE timings are apples-to-apples out of the box; + // both remain env-overridable for custom sweeps (set identical values on + // both sides). + const int warmup = do_time ? env_int("CK_TILE_BENCH_WARMUP", 50) : 0; + const int repeat = do_time ? env_int("CK_TILE_BENCH_REPEAT", 100) : 1; + // stream_config field order: stream_id, time_kernel, log_level, cold_niters + // (warmup), nrepeat, is_gpu_timer, flush_cache, rotating_count. + ck_tile::stream_config stream_cfg{nullptr, do_time, 0, warmup, repeat, false, false, 1}; + + exec_time = SelectedKernel::launch(gemm_args, stream_cfg); + if(exec_time < 0.0f) + { + std::cerr << "dispatcher_run_mx_gemm: kernel reports unsupported args\n"; + return -2; + } + + // D2H from c_ptr into the host output tensor. + if(hipMemcpy(c_m_n.data(), c_ptr, c_bytes, hipMemcpyDeviceToHost) != hipSuccess) + throw std::runtime_error("hipMemcpy D2H failed"); + } + catch(const std::exception& e) + { + std::cerr << "dispatcher_run_mx_gemm: launch threw: " << e.what() << "\n"; + return -1; + } + + // C is always a non-packed output type (fp16/bf16), so c_bytes byte-copy back + // to the caller buffer is a 1:1 element copy. + std::memcpy(C, c_m_n.mData.data(), c_bytes); + + if(time_ms) + *time_ms = exec_time; + + return 0; +#endif // CK_TILE_SINGLE_KERNEL_INCLUDE +} + +} // extern "C" diff --git a/dispatcher/bindings/ctypes/streamk_gemm_ctypes_lib.cpp b/dispatcher/bindings/ctypes/streamk_gemm_ctypes_lib.cpp new file mode 100644 index 00000000000..11b7fc44f00 --- /dev/null +++ b/dispatcher/bindings/ctypes/streamk_gemm_ctypes_lib.cpp @@ -0,0 +1,290 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +/** + * Stream-K GEMM Dispatcher ctypes Library + * + * Provides C API for Python ctypes integration for the STREAM-K GEMM variant. + * Kernel header included via -include at compile time. + * + * Stream-K is a single GEMM (one A/B/C, one M/N/K) like regular GEMM, so this + * lib keeps the exact same C ABI as gemm_ctypes_lib.cpp -- ``dispatcher_run_gemm`` + * takes host A/B/C and M/N/K. The difference is internal: the generated launch + * has a Stream-K-specific signature + * + * static float launch(const ck_tile::StreamKHostArgs& args, const stream_config& stream); + * + * which allocates the reduction workspace internally (DeviceMem) and uses the + * Atomic reduction strategy. The single-problem registry path + * (g_dispatcher->run / GemmHostArgs) and the generated_tile_backend wrapper both + * hard-code the plain GemmHostArgs launch, so this lib bypasses the registry and + * calls SelectedKernel::launch(args, stream) directly, reporting the kernel name + * from the compile-time KERNEL_NAME macro. + * + * Because the C ABI matches the regular lib, the Python side reuses + * GemmDispatcherLib / GpuGemmRunner unchanged -- only the .so internals differ. + * + * Usage from Python: + * lib = ctypes.CDLL("libdispatcher_streamk_gemm.so") + * lib.dispatcher_init() + * lib.dispatcher_run_gemm(...) + */ + +#include +#include +#include +#include +#include +#include +#include + +// Kernel header included via -include compiler flag (with CK_TILE_SINGLE_KERNEL_INCLUDE). +// Defines: ADataType, BDataType, CDataType, AccDataType, SelectedKernel, KERNEL_NAME +// and transitively brings in ck_tile::StreamKHostArgs and ck_tile::stream_config. + +// GPU architecture - can be overridden via -DGFX_ARCH="gfx90a" at compile time +#ifndef GFX_ARCH +#define GFX_ARCH "gfx942" +#endif + +static bool g_initialized = false; + +// Read an integer benchmark knob from the environment, falling back to +// `fallback` when unset or unparseable. +static int env_int(const char* name, int fallback) +{ + const char* v = std::getenv(name); + if(v == nullptr || *v == '\0') + return fallback; + char* end = nullptr; + const long out = std::strtol(v, &end, 10); + if(end == v) + return fallback; + return static_cast(out); +} + +// Read a boolean benchmark knob ("0"/"false"/"off", any case => false, else true). +static bool env_bool(const char* name, bool fallback) +{ + const char* v = std::getenv(name); + if(v == nullptr || *v == '\0') + return fallback; + std::string s(v); + for(char& c : s) + if(c >= 'A' && c <= 'Z') + c = static_cast(c - 'A' + 'a'); + return !(s == "0" || s == "false" || s == "off"); +} + +extern "C" { + +/** + * Initialize the stream-k GEMM library. + * + * The stream-k path does not use the dispatcher/registry (it launches the + * force-included kernel directly), so this is a lightweight no-op kept for ABI + * parity with the regular GEMM lib. Returns 0 on success. + */ +int dispatcher_initialize() +{ + g_initialized = true; + return 0; +} + +/** + * Initialize dispatcher (alias) + */ +int dispatcher_init() { return dispatcher_initialize(); } + +/** + * Run a Stream-K GEMM on GPU by launching the force-included kernel directly. + * + * hipMalloc A/B/C, copy A and B host->device, memset C (the Atomic reduction + * strategy accumulates into C, so it must start zeroed), build a + * ck_tile::StreamKHostArgs whose strides are derived from the kernel's actual + * ALayout/BLayout/CLayout (no layout hardcoding) and launch. The launch + * allocates the reduction workspace internally and resets C between timed + * iterations. C is then copied back. + * + * The host buffers must be laid out to match each operand's layout (the Python + * runner arranges A/B/C as RowMajor=C-contiguous, ColumnMajor=F-contiguous). + * + * Returns: 0 on success, -1 on HIP error / generic throw, -2 if the kernel + * reports the arguments are unsupported. + */ +int dispatcher_run_gemm( + const void* A, const void* B, void* C, int64_t M, int64_t N, int64_t K, float* time_ms) +{ + if(!g_initialized || !A || !B || !C || M <= 0 || N <= 0 || K <= 0) + { + return -1; + } + + const ADataType* A_host = static_cast(A); + const BDataType* B_host = static_cast(B); + CDataType* C_host = static_cast(C); + + ADataType* A_dev = nullptr; + BDataType* B_dev = nullptr; + CDataType* C_dev = nullptr; + + auto cleanup_gpu_mem = [&]() { + if(A_dev) + (void)hipFree(A_dev); + if(B_dev) + (void)hipFree(B_dev); + if(C_dev) + (void)hipFree(C_dev); + }; + + if(hipMalloc(&A_dev, M * K * sizeof(ADataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMalloc(&B_dev, K * N * sizeof(BDataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMalloc(&C_dev, M * N * sizeof(CDataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + + if(hipMemcpy(A_dev, A_host, M * K * sizeof(ADataType), hipMemcpyHostToDevice) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMemcpy(B_dev, B_host, K * N * sizeof(BDataType), hipMemcpyHostToDevice) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + if(hipMemset(C_dev, 0, M * N * sizeof(CDataType)) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + + // Strides are DERIVED from the kernel's actual layouts (ALayout/BLayout/CLayout + // come from the force-included generated header) -- nothing layout-specific is + // hardcoded, so every layout (rcr/rrr/ccr/crr/...) works. A RowMajor R x C + // matrix has leading dim C; a ColumnMajor one has leading dim R. + // A is M x K, B is K x N, C is M x N. + using RowMajor = ck_tile::tensor_layout::gemm::RowMajor; + const ck_tile::index_t lda = + static_cast(std::is_same_v ? K : M); + const ck_tile::index_t ldb = + static_cast(std::is_same_v ? N : K); + const ck_tile::index_t ldc = + static_cast(std::is_same_v ? N : M); + // k_batch is fixed to 1 inside StreamKHostArgs. + ck_tile::StreamKHostArgs args(static_cast(A_dev), + static_cast(B_dev), + static_cast(C_dev), + static_cast(M), + static_cast(N), + static_cast(K), + /*stride_A=*/lda, + /*stride_B=*/ldb, + /*stride_C=*/ldc); + + // Benchmark parameters. warmup/repeat default to old Tile Engine's values + // (warmup=50, repeat=100); a generous warmup keeps the GPU clock ramped, and + // 100 timed iterations give a stable median. These were the knobs behind the + // regular bridge's spurious "perf gap" (#8123): the old default of warmup=3/ + // repeat=10 measured a cold, un-ramped clock. Each knob is env-overridable so + // a caller can match another harness without recompiling. + // + // Divergence from the regular path (generated_tile_backend.hpp): flush_cache_ + // and rotating_count_ default OFF here. The Stream-K Atomic reduction + // accumulates into C, and the generated launch's launch_kernel_time_mask + // preprocess re-zeros only the original args.e_ptr -- rotating C across + // multiple buffers would leave the rotated copies un-zeroed and corrupt the + // accumulation. Leave rotating_count_=1 unless a caller knows the kernel + // re-zeros every rotated buffer. + ck_tile::stream_config stream_cfg; + stream_cfg.stream_id_ = nullptr; + stream_cfg.time_kernel_ = true; + stream_cfg.log_level_ = 0; + stream_cfg.cold_niters_ = env_int("CK_TILE_BENCH_WARMUP", 50); + stream_cfg.nrepeat_ = env_int("CK_TILE_BENCH_REPEAT", 100); + stream_cfg.is_gpu_timer_ = true; + stream_cfg.flush_cache_ = env_bool("CK_TILE_BENCH_FLUSH", false); + stream_cfg.rotating_count_ = env_int("CK_TILE_BENCH_ROTATING", 1); + + float exec_time = 0.0f; + try + { + exec_time = SelectedKernel::launch(args, stream_cfg); + } + catch(const std::exception& e) + { + cleanup_gpu_mem(); + if(std::string(e.what()).find("not supported") != std::string::npos) + { + if(time_ms) + { + *time_ms = -1.0f; + } + return -2; // Arguments not supported by this kernel + } + return -1; + } + + if(hipMemcpy(C_host, C_dev, M * N * sizeof(CDataType), hipMemcpyDeviceToHost) != hipSuccess) + { + cleanup_gpu_mem(); + return -1; + } + + if(time_ms) + { + *time_ms = exec_time; + } + + cleanup_gpu_mem(); + return 0; +} + +/** + * Get kernel information (legacy single-kernel ABI). + * + * Returns the compile-time KERNEL_NAME of the force-included kernel header. + */ +const char* dispatcher_get_kernel_name() { return KERNEL_NAME; } + +/** + * Get the name of the kernel at a given registry index (multi-kernel ABI). + * + * Each stream-k .so force-includes exactly one kernel header, so index 0 reports + * KERNEL_NAME and any other index is out of range. Mirrors the regular GEMM lib's + * name ABI so the Python bridge can use the same name-lookup path. + * Returns 0 on success, -1 on bad args or out-of-range index. + */ +int dispatcher_get_kernel_name_at(int index, char* buffer, int buffer_size) +{ + if(!buffer || buffer_size <= 0 || index != 0) + { + return -1; + } + + std::strncpy(buffer, KERNEL_NAME, static_cast(buffer_size) - 1); + buffer[buffer_size - 1] = '\0'; + return 0; +} + +/** + * Get the number of kernels in this .so (always 1 for the stream-k single-include lib). + */ +int dispatcher_get_kernel_count() { return 1; } + +/** + * Cleanup library resources (no-op; kept for ABI parity). + */ +void dispatcher_cleanup() { g_initialized = false; } + +} // extern "C" diff --git a/dispatcher/codegen/README.md b/dispatcher/codegen/README.md index 40a9b7b8c12..965abb1213b 100644 --- a/dispatcher/codegen/README.md +++ b/dispatcher/codegen/README.md @@ -77,7 +77,7 @@ results = codegen.generate_all() | `--datatype` | `fp16`, `bf16`, `fp32`, `int8` | Data type | | `--layout` | `rcr`, `rrr`, `crr`, `ccr` | Matrix layouts | | `--gpu-target` | `gfx942`, `gfx90a`, `gfx950` | Target GPU | -| `--variants` | `standard`, `preshuffle`, `multi_d` | Kernel variants | +| `--variants` | `standard`, `preshuffle`, `multi_d`, `grouped` | Kernel variants | | `--preselected` | `fp16_rcr_essential`, etc. | Predefined kernel set | ### Layout Notation @@ -98,6 +98,28 @@ Element-wise fusion: `C = op(A x B + D0 + D1 + ...)` Supported ops: `PassThrough`, `MultiDAdd`, `Relu`, `Gelu`, `Sigmoid`, `Tanh` +### Grouped +Batched GEMM over a list of independently-shaped groups in a single launch +(`ck_tile::GroupedGemmKernel`). Brings the dispatcher to parity with the Tile Engine +`grouped_gemm` op. The per-group argument vector is built with `MakeKargs`, copied to an +internally-allocated `DeviceMem` workspace, and the device pointer + group count are passed +to the kernel (the dispatcher workspace idiom — no external `kargs_ptr`). + +- Datatypes: `fp16`, `bf16`, `fp8`, `bf8` (matches the Tile Engine grouped runnable set; + `fp8`/`bf8` accumulate in `fp32` and emit an `fp16` C output). +- Layouts: `rcr`, `rrr`, `ccr`, `crr` (C is always row-major). + +```bash +python3 unified_gemm_codegen.py \ + --datatype fp16 \ + --layout rcr \ + --variants grouped \ + --gpu-target gfx942 \ + --output-dir generated_kernels +``` + +Build and run end-to-end with [`examples/gemm/cpp/02_grouped_gemm_driver.cpp`](../examples/gemm/cpp/README.md). + ## Output Structure ``` @@ -105,6 +127,7 @@ generated_kernels/ |---- gemm_fp16_rcr_compv4_..._128x128x32_....hpp # GEMM kernels |---- gemm_fp16_rcr_compv4_..._preshuffle.hpp |---- gemm_fp16_rcr_compv4_..._multid_Relu_d1.hpp +|---- gemm_fp16_rcr_compv3_..._128x128x64_..._grouped.hpp # Grouped GEMM kernels |---- grouped_conv_fwd_fp16_nhwgc_..._128x128x32_....hpp # Grouped conv kernels +---- ... ``` diff --git a/dispatcher/codegen/arch_filter.py b/dispatcher/codegen/arch_filter.py index 63dbee2dd76..64fb5b28633 100644 --- a/dispatcher/codegen/arch_filter.py +++ b/dispatcher/codegen/arch_filter.py @@ -50,6 +50,8 @@ class OperatorType(Enum): GEMM = "gemm" GEMM_PRESHUFFLE = "gemm_preshuffle" GEMM_MULTI_D = "gemm_multi_d" + GEMM_GROUPED = "gemm_grouped" + GEMM_STREAMK = "gemm_streamk" CONV_FWD = "conv_fwd" CONV_BWD_DATA = "conv_bwd_data" CONV_BWD_WEIGHT = "conv_bwd_weight" @@ -85,6 +87,28 @@ class OperatorType(Enum): "tile_n_alignment": 16, "tile_k_alignment": 8, }, + OperatorType.GEMM_GROUPED: { + "min_tile_m": 16, + "min_tile_n": 16, + "min_tile_k": 8, + "tile_m_alignment": 16, + "tile_n_alignment": 16, + "tile_k_alignment": 8, + }, + # NOTE: these are copied from plain GEMM and only gate tile *shape* validity. + # They do NOT express Stream-K's real feasibility requirement -- that a problem + # has enough output tiles to partition K-work across the CUs. That gate is + # runtime (StreamKKernel::IsSupportedArgument / the backend supports() check), + # which lets the dispatcher fall back to a non-Stream-K kernel for too-small + # problems instead of rejecting them at codegen time. + OperatorType.GEMM_STREAMK: { + "min_tile_m": 16, + "min_tile_n": 16, + "min_tile_k": 8, + "tile_m_alignment": 16, + "tile_n_alignment": 16, + "tile_k_alignment": 8, + }, OperatorType.CONV_FWD: { "min_tile_m": 1, # N dimension can be 1 "min_tile_n": 16, # K (output channels) should be reasonable diff --git a/dispatcher/codegen/arch_specs.json b/dispatcher/codegen/arch_specs.json index 3072bfd75be..18880762d05 100644 --- a/dispatcher/codegen/arch_specs.json +++ b/dispatcher/codegen/arch_specs.json @@ -18,13 +18,13 @@ [4, 1, 1] ], "warp_tile_combos": { - "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 16]], + "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 8], [16, 16, 16], [32, 32, 4], [32, 32, 8]], "fp16_fp16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32]], "bf16_bf16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32]], "int8_int8_int32": [[32, 32, 16], [16, 16, 32]] } }, - + "gfx90a": { "family": "cdna2", "target_family": "gfx9", @@ -38,7 +38,7 @@ [4, 1, 1] ], "warp_tile_combos": { - "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 16]], + "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 8], [16, 16, 16], [32, 32, 4], [32, 32, 8]], "fp16_fp16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "bf16_bf16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "fp8_fp8_fp32": [[32, 32, 16], [32, 32, 32]], @@ -46,7 +46,7 @@ "int8_int8_int32": [[32, 32, 16], [16, 16, 32]] } }, - + "gfx942": { "family": "cdna3", "target_family": "gfx9", @@ -55,12 +55,16 @@ "warp_size": 64, "lds_capacity_kb": 64, "warp_configs": [ + [1, 1, 1], + [1, 2, 1], [1, 4, 1], + [2, 1, 1], + [2, 1, 2], [2, 2, 1], [4, 1, 1] ], "warp_tile_combos": { - "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 16]], + "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 8], [16, 16, 16], [32, 32, 4], [32, 32, 8]], "fp16_fp16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "bf16_bf16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "fp8_fp8_fp32": [[32, 32, 16], [32, 32, 32], [16, 16, 32], [16, 16, 64]], @@ -70,7 +74,7 @@ "int8_int8_int32": [[32, 32, 16], [16, 16, 32]] } }, - + "gfx950": { "family": "cdna4", "target_family": "gfx9", @@ -79,14 +83,18 @@ "warp_size": 64, "lds_capacity_kb": 160, "warp_configs": [ + [1, 1, 1], + [1, 2, 1], [1, 4, 1], + [2, 1, 1], + [2, 1, 2], [2, 2, 1], [4, 1, 1], [8, 2, 1], [4, 4, 1] ], "warp_tile_combos": { - "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 16]], + "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 8], [16, 16, 16], [32, 32, 4], [32, 32, 8]], "fp16_fp16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "bf16_bf16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "fp8_fp8_fp32": [[32, 32, 16], [32, 32, 32], [16, 16, 32], [16, 16, 64], [16, 16, 128], [32, 32, 64]], diff --git a/dispatcher/codegen/arch_specs_generated.py b/dispatcher/codegen/arch_specs_generated.py index e6ac816e701..c3137cf32b2 100644 --- a/dispatcher/codegen/arch_specs_generated.py +++ b/dispatcher/codegen/arch_specs_generated.py @@ -4,7 +4,7 @@ AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY! Generated from: arch_specs.json -Generated at: 2026-04-10T20:07:11.665064 +Generated at: 2026-06-01T10:50:14.618422 To update this file: 1. Edit arch_specs.json @@ -28,6 +28,7 @@ "gfx1100": "rdna3", "gfx1200": "rdna4", "gfx1201": "rdna4", + "gfx1250": "rdna4", } # Element size in bytes for each data type @@ -37,23 +38,24 @@ WARP_SUPPORTED_COMBINATIONS: Dict[str, List[List[int]]] = { "gfx908": [[1, 4, 1], [2, 2, 1], [4, 1, 1]], "gfx90a": [[1, 4, 1], [2, 2, 1], [4, 1, 1]], - "gfx942": [[1, 4, 1], [2, 2, 1], [4, 1, 1]], - "gfx950": [[1, 4, 1], [2, 2, 1], [4, 1, 1], [8, 2, 1], [4, 4, 1]], + "gfx942": [[1, 1, 1], [1, 2, 1], [1, 4, 1], [2, 1, 1], [2, 1, 2], [2, 2, 1], [4, 1, 1]], + "gfx950": [[1, 1, 1], [1, 2, 1], [1, 4, 1], [2, 1, 1], [2, 1, 2], [2, 2, 1], [4, 1, 1], [8, 2, 1], [4, 4, 1]], "gfx1100": [[2, 4, 1], [1, 8, 1], [8, 1, 1], [4, 2, 1]], "gfx1200": [[2, 4, 1], [1, 8, 1], [8, 1, 1], [4, 2, 1]], "gfx1201": [[2, 4, 1], [1, 8, 1], [8, 1, 1], [4, 2, 1]], + "gfx1250": [[2, 4, 1], [1, 8, 1], [8, 1, 1], [4, 2, 1], [2, 1, 1], [1, 2, 2], [4, 1, 1], [1, 4, 1], [2, 2, 1]], } # Supported warp tile combinations: arch -> dtype_key -> [[warp_tile_m, n, k], ...] WARP_TILE_SUPPORTED_COMBINATIONS: Dict[str, Dict[str, List[List[int]]]] = { "gfx908": { - "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 16]], + "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 8], [16, 16, 16], [32, 32, 4], [32, 32, 8]], "fp16_fp16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32]], "bf16_bf16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32]], "int8_int8_int32": [[32, 32, 16], [16, 16, 32]], }, "gfx90a": { - "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 16]], + "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 8], [16, 16, 16], [32, 32, 4], [32, 32, 8]], "fp16_fp16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "bf16_bf16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "fp8_fp8_fp32": [[32, 32, 16], [32, 32, 32]], @@ -61,7 +63,7 @@ "int8_int8_int32": [[32, 32, 16], [16, 16, 32]], }, "gfx942": { - "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 16]], + "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 8], [16, 16, 16], [32, 32, 4], [32, 32, 8]], "fp16_fp16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "bf16_bf16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "fp8_fp8_fp32": [[32, 32, 16], [32, 32, 32], [16, 16, 32], [16, 16, 64]], @@ -71,7 +73,7 @@ "int8_int8_int32": [[32, 32, 16], [16, 16, 32]], }, "gfx950": { - "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 16]], + "fp32_fp32_fp32": [[16, 16, 4], [16, 16, 8], [16, 16, 16], [32, 32, 4], [32, 32, 8]], "fp16_fp16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "bf16_bf16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [4, 64, 16], [64, 4, 16]], "fp8_fp8_fp32": [[32, 32, 16], [32, 32, 32], [16, 16, 32], [16, 16, 64], [16, 16, 128], [32, 32, 64]], @@ -104,6 +106,10 @@ "bf8_fp8_fp32": [[16, 16, 16]], "int8_int8_int32": [[16, 16, 16]], }, + "gfx1250": { + "fp16_fp16_fp32": [[16, 16, 32]], + "bf16_bf16_fp32": [[16, 16, 32]], + }, } # Preshuffle-specific warp tile combinations (subset of standard GEMM) @@ -122,40 +128,10 @@ "int8_int8_int32": [[16, 16, 32], [32, 32, 16]], }, "gfx950": { - "fp16_fp16_fp32": [ - [32, 32, 8], - [16, 16, 16], - [32, 32, 16], - [16, 16, 32], - [64, 4, 16], - [32, 32, 32], - [16, 16, 64], - ], - "bf16_bf16_fp32": [ - [32, 32, 8], - [16, 16, 16], - [32, 32, 16], - [16, 16, 32], - [64, 4, 16], - [32, 32, 32], - [16, 16, 64], - ], - "fp8_fp8_fp32": [ - [32, 32, 16], - [32, 32, 32], - [16, 16, 32], - [16, 16, 64], - [16, 16, 128], - [32, 32, 64], - ], - "bf8_bf8_fp32": [ - [32, 32, 16], - [32, 32, 32], - [16, 16, 64], - [16, 16, 32], - [16, 16, 128], - [32, 32, 64], - ], + "fp16_fp16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [64, 4, 16], [32, 32, 32], [16, 16, 64]], + "bf16_bf16_fp32": [[32, 32, 8], [16, 16, 16], [32, 32, 16], [16, 16, 32], [64, 4, 16], [32, 32, 32], [16, 16, 64]], + "fp8_fp8_fp32": [[32, 32, 16], [32, 32, 32], [16, 16, 32], [16, 16, 64], [16, 16, 128], [32, 32, 64]], + "bf8_bf8_fp32": [[32, 32, 16], [32, 32, 32], [16, 16, 64], [16, 16, 32], [16, 16, 128], [32, 32, 64]], }, } diff --git a/dispatcher/codegen/codegen_common.py b/dispatcher/codegen/codegen_common.py index a0486da66d7..d99e0977729 100644 --- a/dispatcher/codegen/codegen_common.py +++ b/dispatcher/codegen/codegen_common.py @@ -118,6 +118,7 @@ class CommonTypeMappings: "fp8": "fp8_t", "bf8": "bf8_t", "int8": "int8_t", + "int32": "int32_t", } DTYPE_TO_CK_QUALIFIED = { @@ -127,6 +128,7 @@ class CommonTypeMappings: "fp8": "ck_tile::fp8_t", "bf8": "ck_tile::bf8_t", "int8": "int8_t", + "int32": "int32_t", } DTYPE_TO_DISPATCHER = { @@ -136,6 +138,7 @@ class CommonTypeMappings: "fp8": "DataType::FP8", "bf8": "DataType::BF8", "int8": "DataType::INT8", + "int32": "DataType::INT32", } # GEMM-specific layout mappings ("r"/"c" for row/column major). @@ -202,8 +205,26 @@ class CommonTypeMappings: @staticmethod def get_output_dtype(dtype: str) -> str: - """Get output datatype (fp8/bf8 -> fp16).""" - return "fp16" if dtype in ("fp8", "bf8") else dtype + """Get output (C) datatype for an A/B element dtype. + + Low-precision float inputs accumulate into and store as fp16 + (fp8/bf8 -> fp16); int8 stores its int32 accumulator (int8 -> int32). + Everything else stores in its own dtype. + """ + if dtype in ("fp8", "bf8"): + return "fp16" + if dtype == "int8": + return "int32" + return dtype + + @staticmethod + def get_acc_dtype(dtype: str) -> str: + """Get accumulator datatype for an A/B element dtype. + + Integer GEMM accumulates in int32; every float dtype accumulates in + fp32. + """ + return "int32" if dtype == "int8" else "fp32" # ============================================================================ @@ -348,3 +369,92 @@ def needs_warp_expansion(config: dict) -> bool: def needs_pipeline_expansion(config: dict) -> bool: """True if pipeline is a wildcard (\"*\").""" return config.get("pipeline", "compv4") == "*" + + +# ============================================================================ +# BQuant kernel name construction +# ============================================================================ + + +def bquant_effective_epilogue( + tile_n: int, + warp_n: int, + warp_tile_n: int, + quant_group_n: int, +) -> str: + """Return the epilogue tag that the codegen will actually emit for the given tile params. + + Mirrors the TiledMMAPermuteN / use_permute_n_epilogue logic in + unified_grouped_gemm_bquant_codegen.py and run_gemm_quant_example.inc: + TiledMMAPermuteN = (N_Repeat % 2 == 0), N_Repeat = TileN / (WarpN * WarpTileN) + use_permute_n_epilogue = TiledMMAPermuteN and quant_group_n == 1 + + Returns "permute_n" when PermuteNEpilogue is selected, "cshuffle" otherwise. + """ + n_repeat = tile_n // (warp_n * warp_tile_n) + use_permute_n = (n_repeat % 2 == 0) and (quant_group_n == 1) + return "permute_n" if use_permute_n else "cshuffle" + + +def make_bquant_kernel_name( + variant_key: str, + layout: str, + pipeline: str, + epilogue: str, # ignored — actual epilogue is computed from tile params via bquant_effective_epilogue + scheduler: str, + tile_m: int, tile_n: int, tile_k: int, + warp_m: int, warp_n: int, warp_k: int, + warp_tile_m: int, warp_tile_n: int, warp_tile_k: int, + quant_group_m: int, + quant_group_n: int, + quant_group_k: int, + preshuffle_b: bool = False, + preshuffle_bquant: bool = False, +) -> str: + """Return the canonical BQuant kernel name used as KERNEL_NAME in generated headers. + + Both BQuantKernelConfig (utils) and BQuantKernelSpec (codegen) delegate to this + function so the two sides are guaranteed to stay byte-exact. + + The epilogue segment in the name reflects the epilogue the codegen actually emits + (computed via bquant_effective_epilogue from tile params) rather than the + user-specified epilogue string, so the name always matches the compiled kernel. + The ``epilogue`` parameter is accepted for call-site compatibility but not used. + """ + effective_epilogue = bquant_effective_epilogue(tile_n, warp_n, warp_tile_n, quant_group_n) + parts = [ + "grouped_gemm_bquant", + variant_key, + layout, + pipeline, + effective_epilogue, + scheduler, + f"{tile_m}x{tile_n}x{tile_k}", + f"{warp_m}x{warp_n}x{warp_k}", + f"{warp_tile_m}x{warp_tile_n}x{warp_tile_k}", + f"qg{quant_group_m}x{quant_group_n}x{quant_group_k}", + ] + if preshuffle_b: + parts.append("preshuffleb") + if preshuffle_bquant: + parts.append("preshufflebq") + return "_".join(parts) + + +# ============================================================================ +# BQuant-specific Type Mappings +# ============================================================================ + +# CK qualified type names for BQuant dtype fields (A, B, C, Q). +# Used by unified_bquant_gemm_codegen.py. Kept here so future AQuant/ABQuant +# codegens can reuse the same map without duplication. +BQUANT_DTYPE_MAP = { + "fp8": "ck_tile::fp8_t", + "bf8": "ck_tile::bf8_t", + "pk_int4": "ck_tile::pk_int4_t", + "pk_fp4": "ck_tile::pk_fp4_t", + "half": "ck_tile::half_t", + "bf16": "ck_tile::bf16_t", + "float": "float", + "e8m0": "ck_tile::e8m0_t", +} diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/ndhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/ndhwgc_bf16.json deleted file mode 100644 index c3f7455c677..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/ndhwgc_bf16.json +++ /dev/null @@ -1,1968 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 80, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/ndhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/ndhwgc_fp16.json deleted file mode 100644 index 001427b8b14..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/ndhwgc_fp16.json +++ /dev/null @@ -1,1968 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 80, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/ndhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/ndhwgc_fp32.json deleted file mode 100644 index 487e8b350d0..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/ndhwgc_fp32.json +++ /dev/null @@ -1,1632 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 66, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/nhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/nhwgc_bf16.json deleted file mode 100644 index 0c8041e7e1d..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/nhwgc_bf16.json +++ /dev/null @@ -1,1968 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 80, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/nhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/nhwgc_fp16.json deleted file mode 100644 index 4f9fffc7487..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/nhwgc_fp16.json +++ /dev/null @@ -1,1968 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 80, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/nhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/nhwgc_fp32.json deleted file mode 100644 index 68bf0ee9cd3..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/profiler/nhwgc_fp32.json +++ /dev/null @@ -1,1632 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 66, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/ndhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/backward_data/tests/ndhwgc_bf16.json deleted file mode 100644 index 7630d57f6c4..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/ndhwgc_bf16.json +++ /dev/null @@ -1,428 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/ndhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/backward_data/tests/ndhwgc_fp16.json deleted file mode 100644 index 0da1061946a..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/ndhwgc_fp16.json +++ /dev/null @@ -1,428 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/ndhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/backward_data/tests/ndhwgc_fp32.json deleted file mode 100644 index 0f542880d75..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/ndhwgc_fp32.json +++ /dev/null @@ -1,344 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/nhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/backward_data/tests/nhwgc_bf16.json deleted file mode 100644 index f43f1126f96..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/nhwgc_bf16.json +++ /dev/null @@ -1,428 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/nhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/backward_data/tests/nhwgc_fp16.json deleted file mode 100644 index b64153598ee..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/nhwgc_fp16.json +++ /dev/null @@ -1,428 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 16, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/nhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/backward_data/tests/nhwgc_fp32.json deleted file mode 100644 index ab6f33bda5c..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_data/tests/nhwgc_fp32.json +++ /dev/null @@ -1,344 +0,0 @@ -{ - "variant": "bwd_data", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 16, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 16, - "tile_k": 32, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/ndhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/ndhwgc_bf16.json deleted file mode 100644 index d15bc2abbeb..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/ndhwgc_bf16.json +++ /dev/null @@ -1,4656 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 66, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 73, - "tile_m": 16, - "tile_n": 256, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 74, - "tile_m": 16, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 75, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 78, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 82, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 83, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 84, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 85, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 86, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 87, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 89, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 90, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 101, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 102, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 103, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 104, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 105, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 106, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 107, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 108, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 109, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 110, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 121, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 122, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 123, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 124, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 125, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 126, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 128, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 129, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 130, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 131, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 132, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 133, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 134, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 135, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 153, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 154, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 155, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 156, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 157, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 158, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 160, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 161, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 162, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 163, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 164, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 165, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 166, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 167, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 185, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 187, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 188, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 193, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 194, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 195, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 196, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 197, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 201, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 203, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 204, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 205, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 209, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 210, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 211, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 212, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 213, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 214, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 215, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 217, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 218, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 219, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 220, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 222, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 224, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 225, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 226, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 227, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 228, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 229, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 235, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 236, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 238, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 239, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 241, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 242, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 244, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 245, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 247, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 248, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 250, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 251, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 252, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 253, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 254, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 255, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 256, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 257, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/ndhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/ndhwgc_fp16.json deleted file mode 100644 index df833da75cb..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/ndhwgc_fp16.json +++ /dev/null @@ -1,4656 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 66, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 73, - "tile_m": 16, - "tile_n": 256, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 74, - "tile_m": 16, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 75, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 78, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 82, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 83, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 84, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 85, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 86, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 87, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 89, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 90, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 101, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 102, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 103, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 104, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 105, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 106, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 107, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 108, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 109, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 110, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 121, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 122, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 123, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 124, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 125, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 126, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 128, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 129, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 130, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 131, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 132, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 133, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 134, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 135, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 153, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 154, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 155, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 156, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 157, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 158, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 160, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 161, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 162, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 163, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 164, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 165, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 166, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 167, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 185, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 187, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 188, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 193, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 194, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 195, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 196, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 197, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 201, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 202, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 203, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 204, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 206, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 208, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 209, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 210, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 211, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 212, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 213, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 217, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 219, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 220, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 221, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 225, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 226, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 227, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 228, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 229, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 230, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 231, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 237, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 238, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 240, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 241, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 243, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 244, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 246, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 247, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 249, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 250, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 252, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 253, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 254, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 255, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 256, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 257, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 258, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 259, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/ndhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/ndhwgc_fp32.json deleted file mode 100644 index 3de4dbedcf6..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/ndhwgc_fp32.json +++ /dev/null @@ -1,1688 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 55, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 58, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 61, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 64, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 65, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 66, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 69, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 70, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 71, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/nhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/nhwgc_bf16.json deleted file mode 100644 index ecabb82f5e1..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/nhwgc_bf16.json +++ /dev/null @@ -1,4852 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 73, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 74, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 75, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 78, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 80, - "tile_m": 16, - "tile_n": 256, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 16, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 82, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 83, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 84, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 85, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 86, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 88, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 89, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 90, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 91, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 92, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 93, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 94, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 96, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 97, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 108, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 109, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 110, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 111, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 112, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 113, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 114, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 115, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 116, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 117, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 128, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 129, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 130, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 131, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 132, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 133, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 135, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 136, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 137, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 138, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 139, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 140, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 141, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 142, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 160, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 161, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 162, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 163, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 164, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 165, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 167, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 168, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 169, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 170, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 171, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 172, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 173, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 174, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 192, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 194, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 195, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 200, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 201, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 202, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 203, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 204, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 208, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 210, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 211, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 212, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 216, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 217, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 218, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 219, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 220, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 221, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 222, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 224, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 225, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 226, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 227, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 229, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 231, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 232, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 233, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 234, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 235, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 236, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 242, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 243, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 245, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 246, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 248, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 249, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 251, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 252, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 254, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 255, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 257, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 258, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 259, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 260, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 261, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 262, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 263, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 264, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/nhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/nhwgc_fp16.json deleted file mode 100644 index 1db3ec1b109..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/nhwgc_fp16.json +++ /dev/null @@ -1,4936 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 65, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 66, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 73, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 74, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 78, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 80, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 82, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 83, - "tile_m": 16, - "tile_n": 256, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 84, - "tile_m": 16, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 85, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 86, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 87, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 88, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 89, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 91, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 92, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 93, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 94, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 95, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 96, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 97, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 99, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 100, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 111, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 112, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 113, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 114, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 115, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 116, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 117, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 118, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 119, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 120, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 131, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 132, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 133, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 134, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 135, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 136, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 138, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 139, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 140, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 141, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 142, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 143, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 144, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 145, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 163, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 164, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 165, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 166, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 167, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 168, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 170, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 171, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 172, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 173, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 174, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 175, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 176, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 177, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 195, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 197, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 198, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 203, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 204, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 205, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 206, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 207, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 211, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 212, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 213, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 214, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 216, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 218, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 219, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 220, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 221, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 222, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 223, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 227, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 229, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 230, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 231, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 235, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 236, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 237, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 238, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 239, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 240, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 241, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 246, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 247, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 249, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 250, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 252, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 253, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 255, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 256, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 258, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 259, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 261, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 262, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 263, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 264, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 265, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 266, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 267, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 268, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/nhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/nhwgc_fp32.json deleted file mode 100644 index 74e1e96d1cd..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/profiler/nhwgc_fp32.json +++ /dev/null @@ -1,1688 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 55, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 58, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 61, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 64, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 65, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 66, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 69, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 70, - "tile_m": 16, - "tile_n": 16, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - }, - { - "id": 71, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": true - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/ndhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/ndhwgc_bf16.json deleted file mode 100644 index 3c82ee6f067..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/ndhwgc_bf16.json +++ /dev/null @@ -1,1184 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 16, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/ndhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/ndhwgc_fp16.json deleted file mode 100644 index df840785ff1..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/ndhwgc_fp16.json +++ /dev/null @@ -1,1128 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 16, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/ndhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/ndhwgc_fp32.json deleted file mode 100644 index 54d384ae324..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/ndhwgc_fp32.json +++ /dev/null @@ -1,344 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/nhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/nhwgc_bf16.json deleted file mode 100644 index 51dc2f286db..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/nhwgc_bf16.json +++ /dev/null @@ -1,1184 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/nhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/nhwgc_fp16.json deleted file mode 100644 index 8effe99610f..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/nhwgc_fp16.json +++ /dev/null @@ -1,1184 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 32, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 16, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 2, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 4, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": true, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": true, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": true, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "basic_async_v1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/nhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/nhwgc_fp32.json deleted file mode 100644 index bdae90101af..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/backward_weight/tests/nhwgc_fp32.json +++ /dev/null @@ -1,344 +0,0 @@ -{ - "variant": "bwd_weight", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": true, - "streamk_reduction_strategy": "TREE", - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ndhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/forward/profiler/ndhwgc_bf16.json deleted file mode 100644 index 7da1a0d27da..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ndhwgc_bf16.json +++ /dev/null @@ -1,6700 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 65, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 66, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 2, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 2, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 73, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 74, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 75, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 78, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 80, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 82, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 83, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 84, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 85, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 86, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 87, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 88, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 89, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 90, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 91, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 92, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 93, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 94, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 95, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 96, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 97, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 98, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 99, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 100, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 101, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 102, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 103, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 104, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 105, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 106, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 107, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 108, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 109, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 110, - "tile_m": 128, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 111, - "tile_m": 128, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 112, - "tile_m": 128, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 113, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 114, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 115, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 116, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 117, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 118, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 119, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 120, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 121, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 122, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 123, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 124, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 125, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 126, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 127, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 128, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 129, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 130, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 131, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 132, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 133, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 134, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 135, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 136, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 137, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 138, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 139, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 140, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 141, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 142, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 143, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 144, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 145, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 146, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 147, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 148, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 149, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 150, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 151, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 152, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 153, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 154, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 155, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 156, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 157, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 158, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 159, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 160, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 161, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 162, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 163, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 164, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 165, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 166, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 167, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 168, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 169, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 170, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 171, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 172, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 173, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 174, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 175, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 176, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 177, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 178, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 179, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 180, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 181, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 182, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 183, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 184, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 185, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 186, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 187, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 188, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 189, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 190, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 191, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 192, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 193, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 194, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 195, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 196, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 197, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 198, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 199, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 200, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 201, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 202, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 203, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 204, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 205, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 206, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 207, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 208, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 209, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 210, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 211, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 212, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 213, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 214, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 215, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 216, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 217, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 218, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 219, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 220, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 221, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 222, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 223, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 224, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 225, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 226, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 227, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 228, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 229, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 230, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 231, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 232, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 233, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 234, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 235, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 236, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 237, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 238, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ndhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/forward/profiler/ndhwgc_fp16.json deleted file mode 100644 index 8a71378f99e..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ndhwgc_fp16.json +++ /dev/null @@ -1,6448 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 65, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 66, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 2, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 2, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 73, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 74, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 75, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 78, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 80, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 82, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 83, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 84, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 85, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 86, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 87, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 88, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 89, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 90, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 91, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 92, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 93, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 94, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 95, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 96, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 97, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 98, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 99, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 100, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 101, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 102, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 103, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 104, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 105, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 106, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 107, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 108, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 109, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 110, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 111, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 112, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 113, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 114, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 115, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 116, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 117, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 118, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 119, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 120, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 121, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 122, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 123, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 124, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 125, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 126, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 127, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 128, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 129, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 130, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 131, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 132, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 133, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 134, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 135, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 136, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 137, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 138, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 139, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 140, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 141, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 142, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 143, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 144, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 145, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 146, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 147, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 148, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 149, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 150, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 151, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 152, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 153, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 154, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 155, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 156, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 157, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 158, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 159, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 160, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 161, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 162, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 163, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 164, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 165, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 166, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 167, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 168, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 169, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 170, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 171, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 172, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 173, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 174, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 175, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 176, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 177, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 178, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 179, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 180, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 181, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 182, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 183, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 184, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 185, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 186, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 187, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 188, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 189, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 190, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 191, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 192, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 193, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 194, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 195, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 196, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 197, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 198, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 199, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 200, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 201, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 202, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 203, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 204, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 205, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 206, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 207, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 208, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 209, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 210, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 211, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 212, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 213, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 214, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 215, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 216, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 217, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 218, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 219, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 220, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 221, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 222, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 223, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 224, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 225, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 226, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 227, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 228, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 229, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ndhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/forward/profiler/ndhwgc_fp32.json deleted file mode 100644 index 53cdfab9fea..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ndhwgc_fp32.json +++ /dev/null @@ -1,4936 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 128, - "tile_n": 192, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 128, - "tile_n": 192, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 192, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 65, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 66, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 67, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 73, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 74, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 75, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 78, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 80, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 82, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 83, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 84, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 85, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 86, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 87, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 88, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 89, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 90, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 91, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 92, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 93, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 94, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 95, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 96, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 97, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 98, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 99, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 100, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 101, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 102, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 103, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 104, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 105, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 106, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 107, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 108, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 109, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 110, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 111, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 112, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 113, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 114, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 115, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 116, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 117, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 118, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 119, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 120, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 121, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 122, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 123, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 124, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 125, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 126, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 127, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 128, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 129, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 130, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 131, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 132, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 133, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 134, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 135, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 136, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 137, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 138, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 139, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 140, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 141, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 142, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 143, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 144, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 145, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 146, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 147, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 148, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 149, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 150, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 151, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 152, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 153, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 154, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 155, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 156, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 157, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 158, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 159, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 160, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 161, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 162, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 163, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 164, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 165, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 166, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 167, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 168, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 169, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 170, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 171, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 172, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 173, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 174, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 175, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ngchw_bf16.json b/dispatcher/codegen/configs/grouped_conv/forward/profiler/ngchw_bf16.json deleted file mode 100644 index 76a0cc135cc..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ngchw_bf16.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "variant": "forward_depthwise", - "ndim_spatial": 2, - "layout": "ngchw", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_h": 8, - "tile_w": 8, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 8, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 1, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 8, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 2, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 3, - "tile_h": 28, - "tile_w": 28, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 4, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 5, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 2, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 6, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 7, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 2, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 8, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 9, - "tile_h": 14, - "tile_w": 28, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 10, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 2, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 11, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 4, - "out_vec": 4 - }, - { - "id": 12, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 13, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 8, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 14, - "tile_h": 8, - "tile_w": 8, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 1, - "sub_h": 1, - "sub_w": 1, - "in_vec": 1, - "out_vec": 1 - }, - { - "id": 15, - "tile_h": 8, - "tile_w": 8, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 8, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 16, - "tile_h": 16, - "tile_w": 16, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 1, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 17, - "tile_h": 16, - "tile_w": 16, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 8, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 18, - "tile_h": 28, - "tile_w": 28, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 8, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 19, - "tile_h": 32, - "tile_w": 32, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 4, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ngchw_fp16.json b/dispatcher/codegen/configs/grouped_conv/forward/profiler/ngchw_fp16.json deleted file mode 100644 index a7c5aa22ac1..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ngchw_fp16.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "variant": "forward_depthwise", - "ndim_spatial": 2, - "layout": "ngchw", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_h": 8, - "tile_w": 8, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 8, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 1, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 8, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 2, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 3, - "tile_h": 28, - "tile_w": 28, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 4, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 5, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 2, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 6, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 7, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 2, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 8, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 9, - "tile_h": 14, - "tile_w": 28, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 10, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 2, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 11, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 4, - "out_vec": 4 - }, - { - "id": 12, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 13, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 8, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 14, - "tile_h": 8, - "tile_w": 8, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 1, - "sub_h": 1, - "sub_w": 1, - "in_vec": 1, - "out_vec": 1 - }, - { - "id": 15, - "tile_h": 8, - "tile_w": 8, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 8, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 16, - "tile_h": 16, - "tile_w": 16, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 1, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 17, - "tile_h": 16, - "tile_w": 16, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 8, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 18, - "tile_h": 28, - "tile_w": 28, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 8, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 19, - "tile_h": 32, - "tile_w": 32, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 4, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ngchw_fp32.json b/dispatcher/codegen/configs/grouped_conv/forward/profiler/ngchw_fp32.json deleted file mode 100644 index cce7d39511e..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/profiler/ngchw_fp32.json +++ /dev/null @@ -1,308 +0,0 @@ -{ - "variant": "forward_depthwise", - "ndim_spatial": 2, - "layout": "ngchw", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_h": 8, - "tile_w": 8, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 8, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 1, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 8, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 2, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 3, - "tile_h": 28, - "tile_w": 28, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 4, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 5, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 2, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 6, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 7, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 2, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 8, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 9, - "tile_h": 14, - "tile_w": 28, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 10, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 2, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 11, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 4, - "out_vec": 4 - }, - { - "id": 12, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 13, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 8, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 14, - "tile_h": 8, - "tile_w": 8, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 1, - "sub_h": 1, - "sub_w": 1, - "in_vec": 1, - "out_vec": 1 - }, - { - "id": 15, - "tile_h": 8, - "tile_w": 8, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 8, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 16, - "tile_h": 16, - "tile_w": 16, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 1, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 17, - "tile_h": 16, - "tile_w": 16, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 8, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 18, - "tile_h": 28, - "tile_w": 28, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 8, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 19, - "tile_h": 32, - "tile_w": 32, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 4, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/profiler/nhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/forward/profiler/nhwgc_bf16.json deleted file mode 100644 index 215bea48b34..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/profiler/nhwgc_bf16.json +++ /dev/null @@ -1,7176 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 128, - "tile_n": 64, - "tile_k": 8, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 256, - "tile_n": 64, - "tile_k": 8, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 128, - "tile_n": 64, - "tile_k": 8, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 8, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 65, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 82, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 83, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 84, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 85, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 86, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 87, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 88, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 89, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 90, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 91, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 92, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 93, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 94, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 95, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 96, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 97, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 98, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 99, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 100, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 2, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 101, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 102, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 103, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 104, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 2, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 105, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 106, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 107, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 108, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 109, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 110, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 111, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 112, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 113, - "tile_m": 128, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 114, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 115, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 116, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 117, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 118, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 119, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 120, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 121, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 122, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 123, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 124, - "tile_m": 128, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 125, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 126, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 127, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 128, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 129, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 130, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 131, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 132, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 133, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 134, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 135, - "tile_m": 128, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 136, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 137, - "tile_m": 64, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 149, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 150, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 151, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 152, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 153, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 154, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 155, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 156, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 157, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 158, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 159, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 160, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 161, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 162, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 163, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 169, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 170, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 171, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 172, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 173, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 174, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 175, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 176, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 177, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 178, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 179, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 180, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 181, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 182, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 183, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 184, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 185, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 186, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 187, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 188, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 189, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 190, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 191, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 192, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 193, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 194, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 195, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 196, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 197, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 198, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 199, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 200, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 201, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 202, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 203, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 204, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 205, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 206, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 207, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 208, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 209, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 210, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 211, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 212, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 213, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 214, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 215, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 216, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 217, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 218, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 219, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 220, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 221, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 222, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 223, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 224, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 225, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 226, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 227, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 228, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 249, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 250, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 251, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 252, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 253, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 254, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 255, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 256, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 257, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 258, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 259, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 260, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 261, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 262, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 263, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 264, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 265, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 266, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 267, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 268, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 269, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 270, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 271, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 272, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 273, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 274, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 275, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 276, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 277, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 278, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 279, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 280, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 281, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 282, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 283, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 284, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 285, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 286, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 287, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 288, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 289, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 290, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 291, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 292, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 293, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 294, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 295, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 296, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 297, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 298, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 299, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 300, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 301, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 302, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 303, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 304, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 305, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 306, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 307, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 308, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/profiler/nhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/forward/profiler/nhwgc_fp16.json deleted file mode 100644 index 886ab42848b..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/profiler/nhwgc_fp16.json +++ /dev/null @@ -1,6924 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 128, - "tile_n": 64, - "tile_k": 8, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 256, - "tile_n": 64, - "tile_k": 8, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 128, - "tile_n": 64, - "tile_k": 8, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 8, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 61, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 62, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 63, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 64, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 65, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 82, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 83, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 84, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 85, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 86, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 87, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 88, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 89, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 90, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 91, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 92, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 93, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 94, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 95, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 2, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 96, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 97, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 98, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 99, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 100, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 2, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 101, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 102, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 103, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 104, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 2, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 105, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 106, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 107, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 109, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 110, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 111, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 112, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 113, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 114, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 115, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 116, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 117, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 118, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 119, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 120, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 121, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 122, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 123, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 124, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 125, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 126, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 127, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 128, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 129, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 130, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 131, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 132, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 133, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 134, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 135, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 136, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 137, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 138, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 139, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 140, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 141, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 142, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 143, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 144, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 157, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 158, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 159, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 160, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 161, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 162, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 163, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 164, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 165, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 166, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 167, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 168, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 169, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 170, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 171, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 172, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 173, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 174, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 175, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 176, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 177, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 178, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 179, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 180, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 181, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 182, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 183, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 184, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 185, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 186, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 187, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 188, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 189, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 190, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 191, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 192, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 193, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 194, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 195, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 196, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 197, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 198, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 199, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 200, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 201, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 202, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 203, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 204, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 205, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 206, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 207, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 208, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 209, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 210, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 211, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 212, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 213, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 214, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 215, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 216, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 237, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 238, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 239, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 240, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 241, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 242, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 243, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 244, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 245, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 246, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 247, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 248, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 249, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 250, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 251, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 252, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 253, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 254, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 255, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 256, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 257, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 258, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 259, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 260, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 261, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 262, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 263, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 264, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 265, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 266, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 267, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 268, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 269, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 270, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 271, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 272, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 273, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 274, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 275, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 276, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 277, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 278, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 279, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 280, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 281, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 282, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 283, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 284, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 285, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 286, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 287, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 288, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 289, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 290, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 291, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 292, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 293, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 294, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 295, - "tile_m": 16, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 296, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/profiler/nhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/forward/profiler/nhwgc_fp32.json deleted file mode 100644 index 4ebc5c28acb..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/profiler/nhwgc_fp32.json +++ /dev/null @@ -1,4936 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 128, - "tile_n": 192, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 128, - "tile_n": 192, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 128, - "tile_n": 192, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 68, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 69, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 70, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 71, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 72, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 73, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 74, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 75, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 76, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 77, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 78, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 79, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 80, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 81, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 82, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 83, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 84, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 85, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 86, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 87, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 88, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 89, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 90, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 91, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 92, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 93, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 94, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 95, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 96, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 101, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 102, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 103, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 104, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 105, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 106, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 107, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 108, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 109, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 110, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 111, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 112, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 113, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 114, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 115, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 116, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 117, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 118, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 119, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 120, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 121, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 122, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 123, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 124, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 125, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 126, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 127, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 128, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 129, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 130, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 131, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 132, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 133, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 134, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 135, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 136, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 137, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 138, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 139, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 140, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 141, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 142, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 143, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 144, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 145, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 146, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 147, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 148, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 165, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 166, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 167, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 168, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 169, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 170, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 171, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 172, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 173, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 174, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 175, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 176, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 177, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 178, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 179, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 180, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 181, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 182, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 183, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 184, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 185, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 186, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 187, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 188, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 189, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 190, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 191, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 192, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 193, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 194, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 195, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 196, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 197, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 198, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 199, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 200, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 201, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 202, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 203, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 204, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 205, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 206, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 207, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 208, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 209, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 210, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 211, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 212, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/tests/ndhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/forward/tests/ndhwgc_bf16.json deleted file mode 100644 index 5dc01979532..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/tests/ndhwgc_bf16.json +++ /dev/null @@ -1,1324 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 46, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/tests/ndhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/forward/tests/ndhwgc_fp16.json deleted file mode 100644 index 7e7eeb04748..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/tests/ndhwgc_fp16.json +++ /dev/null @@ -1,1296 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 16, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 256, - "tile_n": 32, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 45, - "tile_m": 32, - "tile_n": 256, - "tile_k": 64, - "warp_m": 1, - "warp_n": 4, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/tests/ndhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/forward/tests/ndhwgc_fp32.json deleted file mode 100644 index cc2d63f24a4..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/tests/ndhwgc_fp32.json +++ /dev/null @@ -1,988 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 3, - "layout": "ndhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/tests/ngchw_bf16.json b/dispatcher/codegen/configs/grouped_conv/forward/tests/ngchw_bf16.json deleted file mode 100644 index c6f2d65d656..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/tests/ngchw_bf16.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "variant": "forward_depthwise", - "ndim_spatial": 2, - "layout": "ngchw", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_h": 8, - "tile_w": 8, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 8, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 1, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 2, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 2, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 3, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 8, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 4, - "tile_h": 8, - "tile_w": 8, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 1, - "sub_h": 1, - "sub_w": 1, - "in_vec": 1, - "out_vec": 1 - }, - { - "id": 5, - "tile_h": 32, - "tile_w": 32, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 4, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/tests/ngchw_fp16.json b/dispatcher/codegen/configs/grouped_conv/forward/tests/ngchw_fp16.json deleted file mode 100644 index 0f1767979bf..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/tests/ngchw_fp16.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "variant": "forward_depthwise", - "ndim_spatial": 2, - "layout": "ngchw", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_h": 8, - "tile_w": 8, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 8, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 1, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 2, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 2, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 3, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 8, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 4, - "tile_h": 8, - "tile_w": 8, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 1, - "sub_h": 1, - "sub_w": 1, - "in_vec": 1, - "out_vec": 1 - }, - { - "id": 5, - "tile_h": 32, - "tile_w": 32, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 4, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/tests/ngchw_fp32.json b/dispatcher/codegen/configs/grouped_conv/forward/tests/ngchw_fp32.json deleted file mode 100644 index 57ea0d787e5..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/tests/ngchw_fp32.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "variant": "forward_depthwise", - "ndim_spatial": 2, - "layout": "ngchw", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_h": 8, - "tile_w": 8, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 8, - "sub_h": 2, - "sub_w": 2, - "in_vec": 2, - "out_vec": 2 - }, - { - "id": 1, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 1, - "str_w": 1, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 2, - "tile_h": 16, - "tile_w": 16, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 2, - "sub_h": 1, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 3, - "tile_h": 32, - "tile_w": 32, - "filt": 3, - "str_h": 2, - "str_w": 2, - "pad_h": 1, - "pad_w": 1, - "nbatch": 1, - "sub_h": 2, - "sub_w": 8, - "in_vec": 8, - "out_vec": 8 - }, - { - "id": 4, - "tile_h": 8, - "tile_w": 8, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 1, - "sub_h": 1, - "sub_w": 1, - "in_vec": 1, - "out_vec": 1 - }, - { - "id": 5, - "tile_h": 32, - "tile_w": 32, - "filt": 5, - "str_h": 1, - "str_w": 1, - "pad_h": 2, - "pad_w": 2, - "nbatch": 4, - "sub_h": 4, - "sub_w": 4, - "in_vec": 8, - "out_vec": 8 - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/tests/nhwgc_bf16.json b/dispatcher/codegen/configs/grouped_conv/forward/tests/nhwgc_bf16.json deleted file mode 100644 index f5f9eb84843..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/tests/nhwgc_bf16.json +++ /dev/null @@ -1,1576 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "bf16", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 64, - "tile_k": 8, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 2, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 64, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 128, - "tile_n": 64, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 256, - "tile_n": 16, - "tile_k": 64, - "warp_m": 4, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 59, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 60, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/tests/nhwgc_fp16.json b/dispatcher/codegen/configs/grouped_conv/forward/tests/nhwgc_fp16.json deleted file mode 100644 index b386a64fdfe..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/tests/nhwgc_fp16.json +++ /dev/null @@ -1,1548 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp16", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 128, - "tile_n": 64, - "tile_k": 8, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 32, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 64, - "tile_n": 32, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 32, - "tile_n": 128, - "tile_k": 32, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": true, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 128, - "tile_n": 32, - "tile_k": 32, - "warp_m": 2, - "warp_n": 1, - "warp_k": 2, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 224, - "tile_n": 256, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 256, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 256, - "tile_n": 224, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 256, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 256, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 47, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 48, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 49, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 50, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 51, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 52, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 53, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 54, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 55, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 56, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 57, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 16, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 58, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 8, - "vector_size_b": 8, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/configs/grouped_conv/forward/tests/nhwgc_fp32.json b/dispatcher/codegen/configs/grouped_conv/forward/tests/nhwgc_fp32.json deleted file mode 100644 index 58e35221f8e..00000000000 --- a/dispatcher/codegen/configs/grouped_conv/forward/tests/nhwgc_fp32.json +++ /dev/null @@ -1,1268 +0,0 @@ -{ - "variant": "forward", - "ndim_spatial": 2, - "layout": "nhwgc", - "datatype": "fp32", - "instances": [ - { - "id": 0, - "tile_m": 128, - "tile_n": 256, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 1, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 2, - "tile_m": 64, - "tile_n": 32, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 3, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 4, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 5, - "tile_m": 128, - "tile_n": 32, - "tile_k": 16, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 6, - "tile_m": 64, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 1, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 7, - "tile_m": 128, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 8, - "tile_m": 128, - "tile_n": 64, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 9, - "tile_m": 32, - "tile_n": 64, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 10, - "tile_m": 256, - "tile_n": 128, - "tile_k": 16, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 11, - "tile_m": 64, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 12, - "tile_m": 32, - "tile_n": 128, - "tile_k": 16, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 13, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 2, - "vector_size_b": 1, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 14, - "tile_m": 64, - "tile_n": 64, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 1, - "vector_size_b": 2, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 15, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 8, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 16, - "tile_m": 64, - "tile_n": 16, - "tile_k": 16, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 4, - "vector_size_a": 4, - "vector_size_b": 1, - "vector_size_c": 1, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 32, - "num_wave_groups": 1, - "specialization": "filter3x3", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 17, - "tile_m": 128, - "tile_n": 128, - "tile_k": 32, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv4", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": true, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 18, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv3", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 19, - "tile_m": 128, - "tile_n": 128, - "tile_k": 64, - "warp_m": 2, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "compv6", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 20, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 21, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 22, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 23, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 24, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 25, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 26, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 27, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 28, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 29, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "compv1", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 30, - "tile_m": 128, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 31, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 32, - "tile_m": 32, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "intrawave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 33, - "tile_m": 128, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 34, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 35, - "tile_m": 16, - "tile_n": 128, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 36, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 37, - "tile_m": 32, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 38, - "tile_m": 32, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 8, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 39, - "tile_m": 16, - "tile_n": 16, - "tile_k": 64, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 40, - "tile_m": 64, - "tile_n": 16, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 2, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 41, - "tile_m": 16, - "tile_n": 64, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "filter1x1_stride1_pad0", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 42, - "tile_m": 16, - "tile_n": 16, - "tile_k": 128, - "warp_m": 1, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "compv1", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 43, - "tile_m": 64, - "tile_n": 32, - "tile_k": 64, - "warp_m": 2, - "warp_n": 1, - "warp_k": 1, - "warp_tile_m": 32, - "warp_tile_n": 32, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - }, - { - "id": 44, - "tile_m": 16, - "tile_n": 32, - "tile_k": 64, - "warp_m": 1, - "warp_n": 2, - "warp_k": 1, - "warp_tile_m": 16, - "warp_tile_n": 16, - "warp_tile_k": 8, - "vector_size_a": 4, - "vector_size_b": 4, - "vector_size_c": 4, - "pipeline": "mem", - "scheduler": "interwave", - "epilogue": "cshuffle", - "double_smem_buffer": false, - "num_groups_to_merge": 1, - "num_wave_groups": 1, - "specialization": "default", - "two_stage": false, - "explicit_gemm": false, - "split_image": false, - "streamk_enabled": false, - "streamk_reduction_strategy": null, - "streamk_persistent": false - } - ] -} \ No newline at end of file diff --git a/dispatcher/codegen/fmha/instance_gen.py b/dispatcher/codegen/fmha/instance_gen.py index 20536cabdf0..9286e0bf20b 100644 --- a/dispatcher/codegen/fmha/instance_gen.py +++ b/dispatcher/codegen/fmha/instance_gen.py @@ -2396,6 +2396,12 @@ def _bp_bk1(bm0, bn0, bk0, hq): bp_specs = get_batch_prefill_pipelines(dtype, hq, receipt) for tc in tiles: bk1 = _bp_bk1(tc.bm0, tc.bn0, tc.bk0, hq) + + # qr_async stages K into LDS through a bk1-major descriptor while the gemm0 + # loop reads bk0 chunks, therefore the pipeline requires bk0 == bk1 + if tc.bk0 != bk1: + continue + for spec in bp_specs: mm = _MASK_MAP.get(spec.mask, spec.mask) mb = _BIAS_MAP.get(spec.bias, spec.bias) diff --git a/dispatcher/codegen/grouped_conv/__init__.py b/dispatcher/codegen/grouped_conv/__init__.py new file mode 100644 index 00000000000..1df48571843 --- /dev/null +++ b/dispatcher/codegen/grouped_conv/__init__.py @@ -0,0 +1,2 @@ +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT diff --git a/dispatcher/codegen/grouped_conv/grouped_config_rules_builder.py b/dispatcher/codegen/grouped_conv/grouped_config_rules_builder.py new file mode 100644 index 00000000000..2b43d43c50d --- /dev/null +++ b/dispatcher/codegen/grouped_conv/grouped_config_rules_builder.py @@ -0,0 +1,525 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +Builder-derived rule sets ("profiler" and "tests") for Grouped Convolution Tile +Configurations. + +Unlike the rule-derived sets, these configs are produced directly from the CK +Builder ``.conf`` configurations in +``experimental/grouped_convolution_tile_instances/configs///``. + +CK Builder instances are parameterized with Seq() thread block cluster lengths +and k0/k1 decompositions that control thread-to-data mappings at a level of +detail the dispatcher codegen does not model. Multiple Builder instances that +differ only in these parameters produce identical dispatcher configurations +(same tile/warp/vector sizes, pipeline, scheduler, specialization). The +conversion therefore deduplicates so each unique dispatcher config appears +exactly once. + +Selected via ``get_default_configs(rule_set="profiler")`` (profiler subset) or +``get_default_configs(rule_set="tests")`` (tests subset). +""" + +import logging +import sys +from enum import Enum +from pathlib import Path +from typing import List + +# --------------------------------------------------------------------------- +# Path setup — allow importing sibling codegen modules and the CK Builder's +# authoritative .conf parser (generate_instances.py). +# --------------------------------------------------------------------------- +_CODEGEN_DIR = Path(__file__).resolve().parent.parent +if str(_CODEGEN_DIR) not in sys.path: + sys.path.insert(0, str(_CODEGEN_DIR)) + +_BUILDER_DIR = ( + _CODEGEN_DIR.parent.parent + / "experimental" + / "grouped_convolution_tile_instances" +) +if str(_BUILDER_DIR) not in sys.path: + sys.path.insert(0, str(_BUILDER_DIR)) + +# CK Builder .conf source directory. +_BUILDER_CONFIGS_DIR = _BUILDER_DIR / "configs" + +from generate_instances import ( + ConvInstanceTemplateParams, + DEPTHWISE_CONFIGS, + fwd_configs, + bwd_data_configs, + bwd_weight_configs, + get_warp_size, + parse_fwd_instances, + parse_depthwise_config, + parse_bwd_weight_instances, + parse_bwd_data_instances, +) + +log = logging.getLogger(__name__) + + +# ============================================================================= +# CK Builder field mapping helpers +# ============================================================================= +def map_pipeline_version(version_str): + """Map CK Builder pipeline version to dispatcher pipeline string.""" + mapping = { + "V1": "compv1", + "V2": "mem", + "V3": "compv3", + "V4": "compv4", + "V5": "compv5", + "V6": "compv6", + "ASYNC_V1": "basic_async_v1", + "ASYNC_V4": "mem", + "WAVELET": "wavelet", + } + mapped = mapping.get(version_str) + if mapped is None: + log.warning( + "Unknown pipeline version %r; falling back to %r", + version_str, version_str.lower(), + ) + return version_str.lower() + return mapped + + +def map_scheduler(scheduler_str): + """Map CK Builder scheduler to dispatcher scheduler string.""" + if "Intrawave" in scheduler_str: + return "intrawave" + elif "Interwave" in scheduler_str: + return "interwave" + return scheduler_str.lower() + + +def map_specialization(spec_str): + """Map CK Builder specialization to dispatcher specialization string.""" + mapping = { + "Default": "default", + "OddC": "default", + "Filter1x1Pad0": "filter1x1_pad0", + "Filter1x1Stride1Pad0": "filter1x1_stride1_pad0", + "Filter3x3": "filter3x3", + } + return mapping.get(spec_str, spec_str.lower()) + + +class Specialization(Enum): + Default = "Default" + StreamK = "Streamk" + Depthwise = "Depthwise" + + +def _conv_depthwise_params_to_dict(p: list, index: int) -> dict: + if len(p) != 12: + raise ValueError(f"Expected 12 parameters for depthwise conv, got {len(p)}: {p}") + return { + "id": index, + "tile_h": p[0], + "tile_w": p[1], + "filt": p[2], + "str_h": p[3], + "str_w": p[4], + "pad_h": p[5], + "pad_w": p[6], + "nbatch": p[7], + "sub_h": p[8], + "sub_w": p[9], + "in_vec": p[10], + "out_vec": p[11], + } + + +def _conv_params_to_dict(p: ConvInstanceTemplateParams) -> dict: + """Convert a ConvInstanceTemplateParams (CK Builder) to a dispatcher dict.""" + return { + "id": p.id, + "tile_m": p.tile_size[0], + "tile_n": p.tile_size[1], + "tile_k": p.tile_size[2], + "warp_m": p.warps[0], + "warp_n": p.warps[1], + "warp_k": p.warps[2], + "warp_tile_m": p.warp_tile[0], + "warp_tile_n": p.warp_tile[1], + "warp_tile_k": p.warp_tile[2], + "vector_size_a": p.scalar_per_vector[0], + "vector_size_b": p.scalar_per_vector[1], + "vector_size_c": p.scalar_per_vector[2], + "pipeline": map_pipeline_version(p.pipeline_version), + "scheduler": map_scheduler(p.scheduler), + "epilogue": "cshuffle", + "double_smem_buffer": p.double_smem_buffer, + "num_groups_to_merge": p.num_groups_to_merge, + "num_wave_groups": p.num_wave_groups, + "specialization": map_specialization(p.specialization), + "two_stage": p.is_two_stage_instance, + "explicit_gemm": p.explicit_gemm, + "split_image": p.split_image, + "streamk_enabled": p.streamk_enabled, + "streamk_reduction_strategy": p.streamk_reduction_strategy, + "streamk_persistent": p.streamk_persistent, + } + + +def _build_data(input_path, variant, layout, datatype, ndim, specialization, warp_size, verbose=False) -> dict: + """Parse a single CK Builder .conf file into an in-memory config dict. + + Equivalent to the old ``convert_config_file`` but returns the dict directly + instead of writing JSON. The dict shape matches what the loaders below + expect: ``{variant, ndim_spatial, layout, datatype, instances}``. + + ``warp_size`` must match the target architecture's warp size (64 for CDNA + gfx9, 32 for RDNA). + """ + with open(input_path, "r", encoding="utf-8") as f: + lines = f.readlines() + + # problem_name is used only for dtype detection (fp32/fp16/bf16 substring match) + problem_name = f"grouped_convolution_{variant}_tile_{layout}_{datatype}" + + if variant == "bwd_weight": + raw = parse_bwd_weight_instances(lines, problem_name, warp_size=warp_size, verbose=verbose) + elif variant == "forward" and specialization == Specialization.Default: + raw = parse_fwd_instances(lines, problem_name, warp_size=warp_size, verbose=verbose) + elif variant == "forward" and specialization == Specialization.Depthwise: + raw = parse_depthwise_config(input_path, verbose=verbose) + elif variant == "bwd_data": + raw = parse_bwd_data_instances(lines, problem_name, warp_size=warp_size, verbose=verbose) + else: + raise RuntimeError( + f"Variant '{variant}' with specialization '{specialization}' is not yet implemented." + ) + + instances = [ + _conv_params_to_dict(p) if isinstance(p, ConvInstanceTemplateParams) + else _conv_depthwise_params_to_dict(p, i) + for (i, p) in enumerate(raw) + ] + + # Deduplicate: Builder instances that differ only in Seq() thread block + # cluster lengths or k0/k1 decomposition produce identical dispatcher + # configs because the conversion discards these parameters. + seen = set() + unique_instances = [] + for inst in instances: + key = tuple(sorted((k, str(v)) for k, v in inst.items() if k != "id")) + if key not in seen: + seen.add(key) + unique_instances.append(inst) + if len(unique_instances) < len(instances): + log.debug( + f"Deduplicated: {len(instances)} -> {len(unique_instances)} " + f"({len(instances) - len(unique_instances)} duplicates removed)" + ) + instances = unique_instances + + output_variant = ( + "forward_depthwise" + if variant == "forward" and specialization == Specialization.Depthwise + else variant + ) + log.debug(f"Parsed {len(instances)} instances from {input_path}") + return { + "variant": output_variant, + "ndim_spatial": ndim, + "layout": layout, + "datatype": datatype, + "instances": instances, + } + + +# ============================================================================= +# Config-name parsing (which .conf files exist, and how to interpret them) +# ============================================================================= +def _parse_config(config: str, variant: str): + """Parse a config name like 'nhwgc_bf16' into its components.""" + parts = config.split("_") + if len(parts) > 3: + raise ValueError(f"Unsupported config: {config}") + layout = parts[0] + datatype = parts[1] + + specialization = Specialization.Default + + if datatype == "depthwise": + datatype = parts[2] + specialization = Specialization.Depthwise + elif len(parts) == 3 and parts[2] == "streamk": + specialization = Specialization.StreamK + + if layout not in ["nhwgc", "ndhwgc"]: + raise ValueError(f"Invalid layout: {layout}") + + if datatype not in ["fp32", "fp16", "bf16"]: + raise ValueError(f"Invalid datatype: {datatype}") + + ndim = 2 if layout == "nhwgc" else 3 + + source_cfg = config + target_cfg = config + if specialization == Specialization.StreamK: + target_cfg = config.replace("_streamk", "") + elif specialization == Specialization.Depthwise: + target_cfg = config.replace("_depthwise", "") + + return variant, source_cfg, target_cfg, layout, datatype, ndim, specialization + + +def _parse_config_depthwise(): + configs = [] + for config in DEPTHWISE_CONFIGS: + parts = config["name"].split("_") + if len(parts) != 3: + raise ValueError(f"Unsupported depthwise config: {config}") + layout = parts[0] + datatype = parts[2] + specialization = Specialization.Depthwise + + if layout not in ["ngchw", "ngcdhw"]: + raise ValueError(f"Invalid layout: {layout}") + + if datatype not in ["fp32", "fp16", "bf16"]: + raise ValueError(f"Invalid datatype: {datatype}") + + ndim = 2 if layout in ("nhwgc", "ngchw") else 3 + + source_cfg = config["conf"].replace(".conf", "") + target_cfg = f"{layout}_{datatype}" + + configs.append(("forward", source_cfg, target_cfg, layout, datatype, ndim, specialization)) + + return configs + + +def _builder_config_list(): + """List every (variant, source_cfg, target_cfg, layout, datatype, ndim, + specialization) tuple known to the CK Builder.""" + config_fwd_depthwise = _parse_config_depthwise() + config_fwd = [_parse_config(cfg, "forward") for cfg in fwd_configs] + config_bwd_weight = [_parse_config(cfg, "bwd_weight") for cfg in bwd_weight_configs] + config_bwd_data = [_parse_config(cfg, "bwd_data") for cfg in bwd_data_configs] + return config_fwd_depthwise + config_fwd + config_bwd_weight + config_bwd_data + + +# ============================================================================= +# In-memory loaders: config dict -> dispatcher config objects +# ============================================================================= +def _load_depthwise_configs(data: dict, arch: str) -> List: + """Build DepthwiseConvKernelConfig objects from an in-memory config dict.""" + from unified_grouped_conv_codegen import DepthwiseConvKernelConfig + + ndim_spatial = data["ndim_spatial"] + layout = data["layout"] + datatype = data["datatype"] + + configs = [] + for inst in data["instances"]: + configs.append(DepthwiseConvKernelConfig( + tile_h=inst["tile_h"], + tile_w=inst["tile_w"], + filt=inst["filt"], + str_h=inst["str_h"], + str_w=inst["str_w"], + pad_h=inst["pad_h"], + pad_w=inst["pad_w"], + nbatch=inst["nbatch"], + sub_h=inst["sub_h"], + sub_w=inst["sub_w"], + in_vec=inst["in_vec"], + out_vec=inst["out_vec"], + ndim_spatial=ndim_spatial, + arch=arch, + layout=layout, + datatype=datatype, + )) + + log.debug(f"Loaded {len(configs)} depthwise configs (layout={layout}, dtype={datatype})") + return configs + + +def _load_gemm_configs(data: dict, arch: str) -> List: + """Build GroupedConvKernelConfig objects from an in-memory config dict.""" + from unified_grouped_conv_codegen import ( + GroupedConvVariant, + GroupedConvTraitConfig, + GroupedConvKernelConfig, + TileConfig, + StreamKConfig, + StreamKReductionStrategy, + ) + + variant_map = { + "forward": GroupedConvVariant.FORWARD, + "fwd": GroupedConvVariant.FORWARD, + "forward_depthwise": GroupedConvVariant.FORWARD_DEPTHWISE, + "bwd_data": GroupedConvVariant.BACKWARD_DATA, + "bwd_weight": GroupedConvVariant.BACKWARD_WEIGHT, + } + variant = variant_map.get(data["variant"]) + if variant is None: + raise ValueError(f"Unknown variant: {data['variant']}") + + ndim_spatial = data["ndim_spatial"] + layout = data["layout"] + datatype = data["datatype"] + + configs = [] + for inst in data["instances"]: + trait = GroupedConvTraitConfig( + pipeline=inst["pipeline"], + scheduler=inst["scheduler"], + epilogue=inst["epilogue"], + pad_m=True, + pad_n=True, + pad_k=True, + double_smem_buffer=inst.get("double_smem_buffer", False), + num_groups_to_merge=inst.get("num_groups_to_merge", 1), + split_image=inst.get("split_image", False), + explicit_gemm=inst.get("explicit_gemm", False), + two_stage=inst.get("two_stage", False), + specialization=inst.get("specialization", "default"), + streamk_config=StreamKConfig( + streamk_enabled=inst.get("streamk_enabled", False), + strategy=StreamKReductionStrategy(inst.get("streamk_reduction_strategy", "TREE")), + streamk_persistent=inst.get("streamk_persistent", False) + ) if inst.get("streamk_enabled", False) else StreamKConfig() + ) + + # compv2/basic_v2 (GemmPipelineAGmemBGmemCRegV2) is not compatible with + # CK Tile's GroupedConvolutionBackwardWeightKernel. The builder maps + # PipelineVersion::V2 to GemmPipelineAgBgCrMem (i.e. "mem"), not to + # GemmPipelineAGmemBGmemCRegV2. Skip if any config somehow has compv2. + if variant == GroupedConvVariant.BACKWARD_WEIGHT and trait.pipeline in ("compv2", "basic_v2"): + log.info(f"Skipping instance {inst['id']}: compv2/basic_v2 pipeline not compatible with CK Tile bwd_weight") + continue + + config = GroupedConvKernelConfig( + tile=TileConfig( + tile_m=inst["tile_m"], + tile_n=inst["tile_n"], + tile_k=inst["tile_k"], + warp_m=inst["warp_m"], + warp_n=inst["warp_n"], + warp_k=inst["warp_k"], + warp_tile_m=inst["warp_tile_m"], + warp_tile_n=inst["warp_tile_n"], + warp_tile_k=inst["warp_tile_k"], + ), + trait=trait, + variant=variant, + ndim_spatial=ndim_spatial, + arch=arch, + layout=layout, + vector_size_a=inst["vector_size_a"], + vector_size_b=inst["vector_size_b"], + vector_size_c=inst["vector_size_c"], + num_wave_groups=inst.get("num_wave_groups", 1), + ) + # Tag each config with its concrete datatype so that generate_all emits + # the kernel only for that datatype (an untagged config is compiled for + # every datatype). + config.datatype = datatype + configs.append(config) + + log.debug( + f"Loaded {len(configs)} configs (variant={data['variant']}, layout={layout}, dtype={datatype})" + ) + return configs + + +# ============================================================================= +# Unified rule-set entry point +# ============================================================================= +def get_configs( + arch: str, + variants: List, + ndims: List[int], + datatypes: List[str], + subset: str = "profiler", + verbose: bool = False, +) -> List: + """Build all configs for a builder-derived rule set by parsing the CK + Builder ``.conf`` files in memory. + + ``subset`` selects the on-disk config subset (``"profiler"`` or ``"tests"``). + Each requested (variant, ndim, datatype) is filtered against the Builder's + config list, the matching ``.conf`` file is parsed and converted into + dispatcher config objects, with no intermediate JSON written. + + ``verbose`` controls whether the underlying CK Builder parsers print their + "Skipping instance ..." diagnostics. It defaults to ``False`` so the + dispatcher rule set stays quiet; the standalone CK Builder script keeps + printing them (its own default is ``True``). + """ + from unified_grouped_conv_codegen import GroupedConvVariant + + # Builder variant name -> on-disk variant directory name. + variant_dir_map = { + "forward": "forward", + "bwd_weight": "backward_weight", + "bwd_data": "backward_data", + } + + def to_enum(variant_name, specialization): + if variant_name == "forward": + return (GroupedConvVariant.FORWARD_DEPTHWISE + if specialization == Specialization.Depthwise + else GroupedConvVariant.FORWARD) + if variant_name == "bwd_weight": + return GroupedConvVariant.BACKWARD_WEIGHT + if variant_name == "bwd_data": + return GroupedConvVariant.BACKWARD_DATA + return None + + want_variants = set(variants) + want_ndims = set(ndims) if ndims else None + want_dtypes = set(datatypes) if datatypes else None + + warp_size = get_warp_size(arch) + + configs: List = [] + for (variant_name, source_cfg, target_cfg, layout, datatype, ndim, spec) in _builder_config_list(): + if to_enum(variant_name, spec) not in want_variants: + continue + if want_ndims is not None and ndim not in want_ndims: + continue + if want_dtypes is not None and datatype not in want_dtypes: + continue + + input_path = _BUILDER_CONFIGS_DIR / variant_dir_map[variant_name] / subset / f"{source_cfg}.conf" + if not input_path.exists(): + log.warning(f"Builder config not found: {input_path}") + continue + + data = _build_data(input_path, variant_name, layout, datatype, ndim, spec, warp_size, verbose=verbose) + if data["variant"] == "forward_depthwise": + configs.extend(_load_depthwise_configs(data, arch)) + else: + configs.extend(_load_gemm_configs(data, arch)) + + log.info(f"builder rule set ({subset}): generated {len(configs)} configs") + return configs + +def get_configs_profiler( + arch: str, + variants: List, + ndims: List[int], + datatypes: List[str], +) -> List: + return get_configs(arch, variants, ndims, datatypes, subset="profiler") + +def get_configs_tests( + arch: str, + variants: List, + ndims: List[int], + datatypes: List[str], +) -> List: + return get_configs(arch, variants, ndims, datatypes, subset="tests") \ No newline at end of file diff --git a/dispatcher/codegen/grouped_config_rules.py b/dispatcher/codegen/grouped_conv/grouped_config_rules_default.py similarity index 67% rename from dispatcher/codegen/grouped_config_rules.py rename to dispatcher/codegen/grouped_conv/grouped_config_rules_default.py index 576c3af1ff1..7b220c0fd9b 100644 --- a/dispatcher/codegen/grouped_config_rules.py +++ b/dispatcher/codegen/grouped_conv/grouped_config_rules_default.py @@ -4,15 +4,12 @@ # SPDX-License-Identifier: MIT """ -Single Source of Truth for Grouped Convolution Tile Configurations +"default" rule set for Grouped Convolution Tile Configurations. -This module defines all valid tile configurations for grouped convolution kernels. -Both codegen and instance_builder import from here to ensure consistency. +This is the original, hand-curated heuristic rule set (small deterministic +per-tile wave/warp/vector maps + hardcoded pipelines). It is preserved here +verbatim and selected via ``get_default_configs(rule_set="default")``. -Architecture: - grouped_conv_tile_configs.py (SOURCE OF TRUTH) - ├── Used by unified_grouped_conv_codegen.py - └── Used by grouped_conv_instance_builder.py """ from typing import Dict, List, Tuple @@ -146,6 +143,8 @@ ("mem", "interwave", 1, 0), ("mem", "interwave", 0, 1), ("mem", "interwave", 1, 1), + # wavelet: intrawave only, single LDS (DoubleSmemBuffer=false hardcoded) + ("wavelet", "intrawave", 0, 0), ] @@ -178,6 +177,7 @@ def iter_pipeline_variants(pipelines: List[str] = None): "compv6", "comp_async", "basic_async_v1", + "wavelet", ], "bwd_data": [ "basic_v1", @@ -188,6 +188,7 @@ def iter_pipeline_variants(pipelines: List[str] = None): "compv6", "comp_async", "basic_async_v1", + "wavelet", ], "bwd_weight": [ "basic_v1", @@ -198,6 +199,7 @@ def iter_pipeline_variants(pipelines: List[str] = None): "compv6", "comp_async", "basic_async_v1", + "wavelet", ], } @@ -263,7 +265,7 @@ def check_vectors(vec_a: int, vec_b: int, vec_c: int) -> bool: def check_warp_coverage( tile_m: int, tile_n: int, tile_k: int, vec_a: int, vec_b: int, - variant: str = "forward", + variant: str = "forward", warp_size: int = 64, ) -> bool: """Check tile dims don't exceed single-warp vector load coverage. @@ -272,9 +274,72 @@ def check_warp_coverage( Backward data: tile_k is the A-tile dim """ a_tile_dim = tile_k if variant == "bwd_data" else tile_m - if a_tile_dim > WARP_SIZE * vec_a: + if a_tile_dim > warp_size * vec_a: return False - if tile_n > WARP_SIZE * vec_b: + if tile_n > warp_size * vec_b: + return False + return True + +def check_tile_coverage( + tile_m: int, tile_n: int, tile_k: int, + vec_a: int, vec_b: int, pipeline_version: str, + block_size: int = 64, +) -> bool: + """Check if each thread has some data to read. + + Return false when there is more threads than data to read. + """ + if pipeline_version == "compv6": + # V6 pipeline computes A/B_Buffer_Load_Inst_Num as integer division; + # if either is 0 the scheduler divides by zero at compile time. + # tile_k=32 compv6 instances are valid as long as both load-instruction counts stay >= 1. + if (tile_m * tile_k) // (block_size * vec_a) < 1: + return False + if (tile_n * tile_k) // (block_size * vec_b) < 1: + return False + return True + + +def get_warp_size(gpu_target: str) -> int: + """Return warp size for the given GPU target. + + Accepts either a family prefix (gfx9, gfx11, gfx12) or a full arch string + (gfx942, gfx950, gfx1201, ...). gfx9xx => 64, everything else => 32. + """ + if gpu_target.startswith("gfx9"): + return 64 + return 32 + + +def check_wmma_instance( + warp_size: int, + k_per_block: int, + k_warp: int, + k_per_xdl: int, + m_per_xdl: int, + dtype: str, +) -> bool: + """Check WMMA-specific constraints for warp_size=32 targets (gfx11/gfx12). + + Returns False (skip instance) when any constraint is violated. + """ + if warp_size != 32: + return True + if k_per_xdl < 32 and dtype != "float": + return False + if k_warp * k_per_xdl > k_per_block: + return False + if m_per_xdl == 32: + return False + return True + + +def check_wmma_native_warp_tile(warp_size: int, streamk_enabled: bool) -> bool: + """Check native instance warp_tile constraints for warp_size=32 targets. + + Returns False (skip instance) when streamk is enabled. + """ + if warp_size == 32 and streamk_enabled: return False return True @@ -282,10 +347,10 @@ def check_warp_coverage( def check_bwd_data_vec_coverage( tile_m: int, tile_n: int, tile_k: int, warp_m: int, warp_n: int, warp_k: int, - vec_a: int, vec_b: int, + vec_a: int, vec_b: int, warp_size: int = 64, ) -> bool: """Bwd_data: vector width must not exceed elements per thread per tile slice.""" - block_size = WARP_SIZE * warp_m * warp_n * warp_k + block_size = warp_size * warp_m * warp_n * warp_k if vec_a > (tile_m * tile_k) // block_size: return False if vec_b > (tile_n * tile_k) // block_size: @@ -386,6 +451,100 @@ def get_tile_full_config(tile_m: int, tile_n: int, tile_k: int) -> dict: # ============================================================================= +def get_configs( + arch: str, + variants: List, + ndims: List[int], + datatypes: List[str] = None, +) -> List: + """Build all available configs for the "default" (hand-curated) rule set. + + Unified rule-set entry point used by + ``unified_grouped_conv_codegen.get_default_configs``. Small deterministic + per-tile wave/warp maps + hardcoded pipelines, ported verbatim from the + initial rule-based codegen. Configs are dtype-agnostic (``datatype`` left as + None) so ``generate_all`` compiles each for every requested datatype, + matching the original behavior. ``datatypes`` is accepted for interface + uniformity but not used by this rule set. + """ + from unified_grouped_conv_codegen import ( + GroupedConvVariant, + GroupedConvTraitConfig, + GroupedConvKernelConfig, + TileConfig, + ) + + def _expand(tile_list): + out = [] + for tm, tn, tk in tile_list: + key = (tm, tn, tk) + if key in TILE_TO_WAVE and key in TILE_TO_WARP: + wm, wn, _wk = TILE_TO_WAVE[key] + wtm, wtn, wtk = TILE_TO_WARP[key] + out.append((tm, tn, tk, wm, wn, wtm, wtn, wtk)) + return out + + fwd_bwd_data_tiles = _expand(COMMON_TILES) + bwd_weight_tiles = _expand(BWD_WEIGHT_TILES) + + configs: List = [] + + for variant in variants: + if variant == GroupedConvVariant.BACKWARD_WEIGHT: + tile_configs = bwd_weight_tiles + pipelines = [("compv3", "cshuffle"), ("mem", "default")] + two_stage_flags = [False, True] + elif variant == GroupedConvVariant.BACKWARD_DATA: + tile_configs = fwd_bwd_data_tiles + pipelines = [("compv3", "cshuffle"), ("mem", "default")] + two_stage_flags = [False] + else: + tile_configs = fwd_bwd_data_tiles + pipelines = [("compv3", "cshuffle"), ("compv4", "cshuffle")] + two_stage_flags = [False] + + for ndim in ndims: + for pipeline, epilogue in pipelines: + for (tm, tn, tk, wm, wn, wtm, wtn, wtk) in tile_configs: + if pipeline == "compv4" and (tm, tn, tk) not in COMPV4_COMPATIBLE_TILES: + continue + for two_stage in two_stage_flags: + adj_tk = tk * 2 if pipeline == "compv4" else tk + trait = GroupedConvTraitConfig( + pipeline=pipeline, + scheduler="intrawave", + epilogue=epilogue, + double_smem_buffer=(pipeline == "compv4"), + pad_m=True, + pad_n=True, + pad_k=True, + two_stage=two_stage, + ) + if not trait.is_valid(): + continue + config = GroupedConvKernelConfig( + tile=TileConfig( + tile_m=tm, + tile_n=tn, + tile_k=adj_tk, + warp_m=wm, + warp_n=wn, + warp_k=1, + warp_tile_m=wtm, + warp_tile_n=wtn, + warp_tile_k=wtk, + ), + trait=trait, + variant=variant, + ndim_spatial=ndim, + arch=arch, + ) + if config.is_valid_for_arch(): + configs.append(config) + + return configs + + def print_summary(): """Print summary of available tile configurations.""" print("=" * 80) diff --git a/dispatcher/codegen/grouped_conv/grouped_config_rules_full.py b/dispatcher/codegen/grouped_conv/grouped_config_rules_full.py new file mode 100644 index 00000000000..c5621ccd53c --- /dev/null +++ b/dispatcher/codegen/grouped_conv/grouped_config_rules_full.py @@ -0,0 +1,1793 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +Full rule set for Grouped Convolution Tile Configurations. +""" + +import logging +import sys +from dataclasses import dataclass +from enum import Enum +from pathlib import Path +from typing import Dict, List, Optional, Set, Tuple, Union + +# --------------------------------------------------------------------------- +# Path setup — allow importing arch_specs_generated from the codegen directory +# --------------------------------------------------------------------------- +_CODEGEN_DIR = Path(__file__).resolve().parent.parent +if str(_CODEGEN_DIR) not in sys.path: + sys.path.insert(0, str(_CODEGEN_DIR)) + +from arch_specs_generated import WARP_TILE_SUPPORTED_COMBINATIONS + +from .tile_math import ( + get_valid_vec_sizes as _tm_get_valid_vec_sizes, + get_valid_wave_warp_pairs as _tm_get_valid_wave_warp_pairs, +) + +# Dtype string to dtype_key mapping (for tile_math filter functions). +DTYPE_TO_DTYPE_KEY: Dict[str, str] = { + "fp16": "fp16_fp16_fp32", + "bf16": "bf16_bf16_fp32", + "fp32": "fp32_fp32_fp32", +} + +# ============================================================================= +# Tile Lists +# ============================================================================= +# +# ndim + concrete-dtype keyed tile tables +# +# Tiles diverge by both ndim (3D is a subset of 2D) and concrete dtype. +# Keyed by (ndim, dtype) where dtype is the concrete "fp16"/"bf16"/"fp32" string. + +_FWD_TILES: Dict[Tuple[int, str], List[Tuple[int, int, int]]] = { + (2, 'bf16'): [(16, 16, 64), (16, 16, 128), (16, 32, 64), (16, 64, 64), (16, 128, 64), (16, 256, 64), (32, 16, 64), (32, 64, 32), (32, 64, 64), (32, 128, 32), (32, 128, 64), (32, 256, 64), (64, 16, 16), (64, 16, 64), (64, 32, 32), (64, 32, 64), (64, 64, 8), (64, 64, 32), (64, 64, 64), (64, 128, 32), (64, 128, 64), (128, 16, 64), (128, 32, 32), (128, 32, 64), (128, 64, 8), (128, 64, 16), (128, 64, 32), (128, 64, 64), (128, 128, 32), (128, 128, 64), (128, 256, 32), (224, 256, 64), (256, 16, 64), (256, 32, 64), (256, 64, 8), (256, 128, 32), (256, 224, 64), (256, 256, 32)], + (2, 'fp16'): [(16, 16, 64), (16, 16, 128), (16, 32, 64), (16, 64, 64), (16, 128, 64), (16, 256, 64), (32, 16, 64), (32, 64, 32), (32, 64, 64), (32, 128, 32), (32, 128, 64), (32, 256, 64), (64, 16, 16), (64, 16, 64), (64, 32, 32), (64, 32, 64), (64, 64, 8), (64, 64, 32), (64, 64, 64), (64, 128, 32), (64, 128, 64), (128, 16, 64), (128, 32, 32), (128, 32, 64), (128, 64, 8), (128, 64, 16), (128, 64, 32), (128, 64, 64), (128, 128, 32), (128, 128, 64), (128, 256, 32), (224, 256, 64), (256, 16, 64), (256, 32, 64), (256, 64, 8), (256, 128, 32), (256, 224, 64), (256, 256, 32)], + (2, 'fp32'): [(16, 16, 64), (16, 16, 128), (16, 32, 64), (16, 64, 64), (16, 128, 64), (32, 16, 64), (32, 64, 16), (32, 64, 64), (32, 128, 16), (32, 128, 64), (64, 16, 16), (64, 16, 64), (64, 32, 16), (64, 32, 64), (64, 64, 16), (64, 64, 32), (64, 128, 16), (128, 16, 64), (128, 32, 16), (128, 32, 64), (128, 64, 16), (128, 128, 16), (128, 128, 32), (128, 128, 64), (128, 192, 16), (128, 256, 16), (256, 128, 16)], + (3, 'bf16'): [(16, 16, 64), (16, 16, 128), (16, 32, 64), (16, 64, 64), (16, 128, 64), (16, 256, 64), (32, 16, 64), (32, 64, 32), (32, 64, 64), (32, 128, 32), (32, 128, 64), (32, 256, 64), (64, 16, 16), (64, 16, 64), (64, 32, 32), (64, 32, 64), (64, 64, 32), (64, 64, 64), (64, 128, 32), (64, 128, 64), (128, 16, 64), (128, 32, 32), (128, 32, 64), (128, 64, 32), (128, 64, 64), (128, 128, 32), (128, 128, 64), (128, 256, 32), (224, 256, 64), (256, 16, 64), (256, 32, 64), (256, 128, 32), (256, 224, 64), (256, 256, 32)], + (3, 'fp16'): [(16, 16, 64), (16, 16, 128), (16, 32, 64), (16, 64, 64), (16, 128, 64), (16, 256, 64), (32, 16, 64), (32, 64, 32), (32, 64, 64), (32, 128, 32), (32, 128, 64), (32, 256, 64), (64, 16, 16), (64, 16, 64), (64, 32, 32), (64, 32, 64), (64, 64, 32), (64, 64, 64), (64, 128, 32), (64, 128, 64), (128, 16, 64), (128, 32, 32), (128, 32, 64), (128, 64, 32), (128, 64, 64), (128, 128, 32), (128, 128, 64), (128, 256, 32), (224, 256, 64), (256, 16, 64), (256, 32, 64), (256, 128, 32), (256, 224, 64), (256, 256, 32)], + (3, 'fp32'): [(16, 16, 64), (16, 16, 128), (16, 32, 64), (16, 64, 64), (16, 128, 64), (32, 16, 64), (32, 64, 16), (32, 64, 64), (32, 128, 16), (32, 128, 64), (64, 16, 16), (64, 16, 64), (64, 32, 16), (64, 32, 64), (64, 64, 16), (64, 64, 32), (64, 128, 16), (128, 16, 64), (128, 32, 16), (128, 32, 64), (128, 64, 16), (128, 128, 16), (128, 128, 32), (128, 128, 64), (128, 192, 16), (128, 256, 16), (256, 128, 16)], +} + +_BWD_DATA_TILES: Dict[Tuple[int, str], List[Tuple[int, int, int]]] = { + (2, 'bf16'): [(16, 64, 32), (32, 64, 32), (32, 128, 32), (64, 16, 16), (64, 16, 32), (64, 16, 64), (64, 32, 32), (64, 64, 32), (64, 64, 64), (64, 128, 32), (128, 32, 16), (128, 32, 32), (128, 32, 64), (128, 64, 32), (128, 64, 64), (128, 128, 32), (128, 256, 32), (256, 32, 64), (256, 128, 32), (256, 128, 64)], + (2, 'fp16'): [(16, 64, 32), (32, 64, 32), (32, 128, 32), (64, 16, 16), (64, 16, 32), (64, 16, 64), (64, 32, 32), (64, 64, 32), (64, 64, 64), (64, 128, 32), (128, 32, 16), (128, 32, 32), (128, 32, 64), (128, 64, 32), (128, 64, 64), (128, 128, 32), (128, 256, 32), (256, 32, 64), (256, 128, 32), (256, 128, 64)], + (2, 'fp32'): [(16, 64, 32), (32, 64, 32), (32, 128, 32), (64, 16, 16), (64, 16, 32), (64, 32, 32), (64, 64, 32), (64, 128, 32), (128, 32, 16), (128, 32, 32), (128, 64, 32), (128, 128, 32), (128, 256, 32), (256, 128, 32)], + (3, 'bf16'): [(16, 64, 32), (32, 64, 32), (32, 128, 32), (64, 16, 16), (64, 16, 32), (64, 16, 64), (64, 32, 32), (64, 64, 32), (64, 128, 32), (128, 32, 16), (128, 32, 32), (128, 32, 64), (128, 64, 32), (128, 128, 32), (128, 256, 32), (256, 128, 32)], + (3, 'fp16'): [(16, 64, 32), (32, 64, 32), (32, 128, 32), (64, 16, 16), (64, 16, 32), (64, 16, 64), (64, 32, 32), (64, 64, 32), (64, 128, 32), (128, 32, 16), (128, 32, 32), (128, 32, 64), (128, 64, 32), (128, 128, 32), (128, 256, 32), (256, 128, 32)], + (3, 'fp32'): [(16, 64, 32), (32, 64, 32), (32, 128, 32), (64, 16, 16), (64, 16, 32), (64, 32, 32), (64, 64, 32), (64, 128, 32), (128, 32, 16), (128, 32, 32), (128, 64, 32), (128, 128, 32), (128, 256, 32), (256, 128, 32)], +} + +_BWD_WEIGHT_TILES: Dict[Tuple[int, str], List[Tuple[int, int, int]]] = { + (2, 'bf16'): [(16, 16, 32), (16, 16, 64), (16, 32, 64), (16, 64, 64), (16, 128, 32), (16, 128, 64), (16, 256, 32), (16, 256, 64), (32, 16, 64), (32, 32, 32), (32, 64, 32), (32, 128, 32), (64, 16, 64), (64, 32, 32), (64, 32, 64), (64, 64, 32), (64, 64, 64), (64, 128, 32), (64, 128, 64), (128, 16, 64), (128, 32, 32), (128, 64, 32), (128, 128, 32), (128, 128, 64), (128, 256, 32), (256, 16, 64), (256, 32, 64), (256, 128, 32), (256, 256, 32)], + (2, 'fp16'): [(16, 16, 32), (16, 16, 64), (16, 32, 64), (16, 64, 64), (16, 128, 32), (16, 128, 64), (16, 256, 32), (16, 256, 64), (32, 16, 64), (32, 32, 32), (32, 64, 32), (32, 128, 32), (64, 16, 64), (64, 32, 32), (64, 32, 64), (64, 64, 32), (64, 64, 64), (64, 128, 32), (64, 128, 64), (128, 16, 64), (128, 32, 32), (128, 64, 32), (128, 128, 32), (128, 128, 64), (128, 256, 32), (256, 16, 64), (256, 32, 64), (256, 128, 32), (256, 256, 32)], + (2, 'fp32'): [(16, 16, 32), (16, 32, 64), (32, 16, 64), (32, 64, 16), (32, 128, 16), (64, 16, 64), (64, 32, 16), (64, 64, 16), (64, 64, 64), (64, 128, 16), (128, 32, 16), (128, 32, 32), (128, 64, 16), (128, 128, 16), (128, 256, 16), (256, 128, 16)], + (3, 'bf16'): [(16, 16, 32), (16, 16, 64), (16, 32, 64), (16, 64, 64), (16, 128, 32), (16, 128, 64), (16, 256, 32), (16, 256, 64), (32, 16, 64), (32, 32, 32), (32, 64, 32), (32, 128, 32), (64, 16, 64), (64, 32, 32), (64, 64, 32), (64, 64, 64), (64, 128, 32), (128, 16, 64), (128, 32, 32), (128, 64, 32), (128, 128, 32), (128, 128, 64), (128, 256, 32), (256, 16, 64), (256, 128, 32), (256, 256, 32)], + (3, 'fp16'): [(16, 16, 32), (16, 16, 64), (16, 32, 64), (16, 64, 64), (16, 128, 32), (16, 128, 64), (16, 256, 32), (16, 256, 64), (32, 16, 64), (32, 32, 32), (32, 64, 32), (32, 128, 32), (64, 16, 64), (64, 32, 32), (64, 64, 32), (64, 64, 64), (64, 128, 32), (128, 16, 64), (128, 32, 32), (128, 64, 32), (128, 128, 32), (128, 128, 64), (128, 256, 32), (256, 16, 64), (256, 128, 32), (256, 256, 32)], + (3, 'fp32'): [(16, 16, 32), (16, 32, 64), (32, 16, 64), (32, 64, 16), (32, 128, 16), (64, 16, 64), (64, 32, 16), (64, 64, 16), (64, 64, 64), (64, 128, 16), (128, 32, 16), (128, 32, 32), (128, 64, 16), (128, 128, 16), (128, 256, 16), (256, 128, 16)], +} + +_TILES_PER_VARIANT: Dict[str, Dict[Tuple[int, str], List[Tuple[int, int, int]]]] = { + "forward": _FWD_TILES, + "bwd_data": _BWD_DATA_TILES, + "bwd_weight": _BWD_WEIGHT_TILES, +} + +# Override the tile sizes for split-image feature. +_SPLIT_IMAGE_TILES: List[Tuple[int, int, int]] = [ + (64, 64, 16), (64, 64, 32), + (256, 128, 16), (256, 128, 32), +] + +# Tiles that support compv4 pipeline +# compv4 has stricter requirements due to double buffering and LDS constraints +COMPV4_COMPATIBLE_TILES: List[Tuple[int, int, int]] = [ + # warp_tile [16,16,16] - all work with compv4 + (16, 64, 64), + (32, 64, 64), + (64, 64, 64), + # warp_tile [16,16,32] - all work with compv4 + (16, 64, 128), + (32, 64, 128), + (64, 64, 128), +] + +def get_tiles_for_variant(variant: str) -> List[Tuple[int, int, int]]: + """Return all tiles available for the given conv variant. + + Returns the union of tiles across all (ndim, dtype) keys, sorted. + """ + all_tiles: set = set() + for tiles in _TILES_PER_VARIANT.get(variant, {}).values(): + all_tiles.update(tiles) + return sorted(all_tiles) + +def get_tiles(variant: str, ndim: int, dtype: str) -> List[Tuple[int, int, int]]: + """Return tiles for a (variant, ndim, concrete-dtype). + + ``dtype`` is the concrete "fp16"/"bf16"/"fp32" string. Returns the exact + tile list observed in the corresponding profiler JSON, or [] if none. + """ + return list(_TILES_PER_VARIANT.get(variant, {}).get((ndim, dtype), [])) + + +# Warp (m, n) shapes excluded from code generation. +# These are possible shapes, but old CK doesn't +# use them. However, they can potentially be useful. +# (4, 64) / (64, 4) are asymmetric MFMA shapes that only ever appear as +# hand-written native instances; warp_tile_k is no longer part of the key. +_EXCLUDED_WARP_SHAPES: Set[Tuple[int, int]] = { + (4, 64), (64, 4), +} + +# ============================================================================= +# Wave (block-to-wave split) strategies +# ============================================================================= +# +# A macro tile is partitioned among the waves of a thread block along M, N and K. +# The split is described by a WaveStrategy that yields the wave *counts* +# (wave_m, wave_n, wave_k); the per-wave tile is then tile / wave_count. +# +# compute_wave_counts() turns a strategy into the (wave_m, wave_n,wave_k) triple, +# and compute_wave_tile() derives the per-wave tile size from the +# macro tile and strategy. + + +class WaveStrategy(Enum): + """Block-to-wave partitioning strategies for grouped convolution configs. + + Each strategy maps to a (wave_m, wave_n, wave_k) wave-count triple. + """ + SINGLE = "single" # (1, 1, 1) — one wave covers the whole tile + SPLIT_M = "split_m" # (2, 1, 1) — 2 waves along M + SPLIT_N = "split_n" # (1, 2, 1) — 2 waves along N + SPLIT_MN = "split_mn" # (2, 2, 1) — 2x2 waves along M and N + SPLIT_M4 = "split_m4" # (4, 1, 1) — 4 waves along M + SPLIT_N4 = "split_n4" # (1, 4, 1) — 4 waves along N + SPLIT_MK = "split_mk" # (2, 1, 2) — 2 waves along M and 2 along K + + +_WAVE_STRATEGY_COUNTS: Dict[WaveStrategy, Tuple[int, int, int]] = { + WaveStrategy.SINGLE: (1, 1, 1), + WaveStrategy.SPLIT_M: (2, 1, 1), + WaveStrategy.SPLIT_N: (1, 2, 1), + WaveStrategy.SPLIT_MN: (2, 2, 1), + WaveStrategy.SPLIT_M4: (4, 1, 1), + WaveStrategy.SPLIT_N4: (1, 4, 1), + WaveStrategy.SPLIT_MK: (2, 1, 2), +} + + +def compute_wave_counts(strategy: WaveStrategy) -> Tuple[int, int, int]: + """Return the (wave_m, wave_n, wave_k) wave-count triple for a strategy.""" + return _WAVE_STRATEGY_COUNTS[strategy] + + +def compute_wave_tile( + strategy: WaveStrategy, tile_m: int, tile_n: int, tile_k: int, +) -> Tuple[int, int, int]: + """Return the per-wave tile (macro tile / wave counts) for a strategy.""" + wm, wn, wk = compute_wave_counts(strategy) + return (tile_m // wm, tile_n // wn, tile_k // wk) + + +# Curated wave strategies as a shared base table plus small per-variant +# override tables. Most tiles use the same strategy across the variants that +# use them (_BASE_TILE_WAVE_STRATEGIES); the handful that genuinely differ are +# captured in _WAVE_STRATEGY_OVERRIDES. Tiles absent from both fall back to +# [WaveStrategy.SINGLE] in get_wave_strategies(). + +_BASE_TILE_WAVE_STRATEGIES: Dict[Tuple[int, int, int], List[WaveStrategy]] = { + (16, 16, 32): [WaveStrategy.SINGLE], + (16, 16, 64): [WaveStrategy.SINGLE], + (16, 16, 128): [WaveStrategy.SINGLE], + (16, 32, 64): [WaveStrategy.SPLIT_N], + (16, 64, 32): [WaveStrategy.SINGLE], + (16, 64, 64): [WaveStrategy.SPLIT_N], + (16, 128, 32): [WaveStrategy.SINGLE], + (16, 128, 64): [WaveStrategy.SPLIT_N], + (16, 256, 32): [WaveStrategy.SINGLE], + (16, 256, 64): [WaveStrategy.SPLIT_N4], + (32, 16, 64): [WaveStrategy.SPLIT_M, WaveStrategy.SPLIT_MK], + (32, 32, 32): [WaveStrategy.SINGLE], + (32, 64, 16): [WaveStrategy.SINGLE], + (32, 64, 32): [WaveStrategy.SINGLE], + (32, 64, 64): [WaveStrategy.SPLIT_N], + (32, 128, 16): [WaveStrategy.SPLIT_N], + (32, 128, 32): [WaveStrategy.SPLIT_N], + (32, 128, 64): [WaveStrategy.SPLIT_N], + (32, 256, 64): [WaveStrategy.SPLIT_N4], + (64, 16, 16): [WaveStrategy.SINGLE], + (64, 16, 32): [WaveStrategy.SINGLE, WaveStrategy.SPLIT_M4], + (64, 16, 64): [WaveStrategy.SPLIT_M, WaveStrategy.SPLIT_MK], + (64, 32, 16): [WaveStrategy.SINGLE], + (64, 32, 32): [WaveStrategy.SINGLE], + (64, 32, 64): [WaveStrategy.SPLIT_M], + (64, 64, 8): [WaveStrategy.SPLIT_M], + (64, 64, 16): [WaveStrategy.SINGLE], + (64, 64, 32): [WaveStrategy.SINGLE], + (64, 64, 64): [WaveStrategy.SPLIT_MN], + (64, 128, 16): [WaveStrategy.SPLIT_N, WaveStrategy.SPLIT_MN], + (64, 128, 32): [WaveStrategy.SPLIT_N, WaveStrategy.SPLIT_MN], + (64, 128, 64): [WaveStrategy.SPLIT_MN], + (128, 16, 64): [WaveStrategy.SPLIT_M, WaveStrategy.SPLIT_MK], + (128, 32, 16): [WaveStrategy.SPLIT_M], + (128, 32, 32): [WaveStrategy.SPLIT_M, WaveStrategy.SPLIT_MK], + (128, 32, 64): [WaveStrategy.SPLIT_M], + (128, 64, 8): [WaveStrategy.SPLIT_M, WaveStrategy.SPLIT_MN], + (128, 64, 16): [WaveStrategy.SPLIT_M, WaveStrategy.SPLIT_MN], + (128, 64, 32): [WaveStrategy.SPLIT_M, WaveStrategy.SPLIT_MN], + (128, 64, 64): [WaveStrategy.SPLIT_MN], + (128, 128, 16): [WaveStrategy.SPLIT_N, WaveStrategy.SPLIT_MN], + (128, 128, 32): [WaveStrategy.SPLIT_N, WaveStrategy.SPLIT_MN], + (128, 128, 64): [WaveStrategy.SPLIT_MN], + (128, 192, 16): [WaveStrategy.SPLIT_MN], + (128, 256, 16): [WaveStrategy.SPLIT_MN], + (128, 256, 32): [WaveStrategy.SPLIT_MN], + (224, 256, 64): [WaveStrategy.SPLIT_MN], + (256, 16, 64): [WaveStrategy.SPLIT_M4], + (256, 32, 64): [WaveStrategy.SPLIT_M4], + (256, 64, 8): [WaveStrategy.SPLIT_MN], + (256, 128, 16): [WaveStrategy.SPLIT_MN], + (256, 128, 32): [WaveStrategy.SPLIT_MN], + (256, 128, 64): [WaveStrategy.SPLIT_MN], + (256, 224, 64): [WaveStrategy.SPLIT_MN], + (256, 256, 32): [WaveStrategy.SPLIT_MN], +} + +# Per-variant deviations from _BASE_TILE_WAVE_STRATEGIES. An entry here +# fully replaces the base strategy list for that (variant, tile). Only the +# tiles where a variant genuinely differs appear; bwd_data is the main +# deviator (it prefers SPLIT_M4 over SPLIT_M for several skinny-N tiles). +_WAVE_STRATEGY_OVERRIDES: Dict[str, Dict[Tuple[int, int, int], List[WaveStrategy]]] = { + "forward": { + (64, 64, 32): [WaveStrategy.SINGLE, WaveStrategy.SPLIT_MN], + }, + "bwd_data": { + (64, 16, 16): [WaveStrategy.SPLIT_M4], + (64, 16, 64): [WaveStrategy.SPLIT_M4], + (128, 32, 16): [WaveStrategy.SPLIT_M4], + (128, 32, 32): [WaveStrategy.SPLIT_M, WaveStrategy.SPLIT_M4], + (128, 32, 64): [WaveStrategy.SPLIT_M4], + }, + "bwd_weight": { + (16, 64, 64): [WaveStrategy.SPLIT_N, WaveStrategy.SPLIT_N4], + (32, 128, 32): [WaveStrategy.SINGLE, WaveStrategy.SPLIT_N], + (64, 32, 64): [WaveStrategy.SPLIT_M, WaveStrategy.SPLIT_N], + (128, 32, 32): [WaveStrategy.SINGLE, WaveStrategy.SPLIT_M], + }, +} + +# Borderline (variant, tile, wave) pairs whose warp (m, n) selection deviates +# from _default_warp_mn(). These are the per-wave-tile == 32x32 cases, where the +# reference data is not consistent with the size threshold: +# - forward (64, 64, 32)/(2,2,1) uses 16x16 despite a 32x32 per-wave tile; +# - forward (256, 256, 32)/(2,2,1) and bwd_weight (64, 64, 64)/(2,2,1) use +# BOTH 16x16 and 32x32. +_WARP_MN_EXCEPTIONS: Dict[ + Tuple[str, Tuple[int, int, int], Tuple[int, int, int]], List[Tuple[int, int]] +] = { + ("forward", (64, 64, 32), (2, 2, 1)): [(16, 16)], + ("forward", (64, 64, 64), (2, 2, 1)): [(16, 16), (32, 32)], + ("forward", (128, 128, 64), (2, 2, 1)): [(16, 16), (32, 32)], + ("forward", (256, 256, 32), (2, 2, 1)): [(16, 16), (32, 32)], + ("bwd_weight", (64, 64, 64), (2, 2, 1)): [(16, 16), (32, 32)], + # bwd_data wavelet tiles: wavelet instances use a 16x16 MFMA + # warp tile (warp_tile_k=32 for half) even though the per-wave tile is 32x32. + ("bwd_data", (64, 64, 64), (2, 2, 1)): [(16, 16)], + ("bwd_data", (128, 64, 64), (2, 2, 1)): [(16, 16)], + ("bwd_data", (256, 32, 64), (4, 1, 1)): [(16, 16)], + ("bwd_data", (256, 128, 32), (2, 2, 1)): [(16, 16), (32, 32)], + ("bwd_data", (256, 128, 64), (2, 2, 1)): [(16, 16)], +} + + +def _default_warp_mn(tile_m: int, tile_n: int, wave_m: int, wave_n: int) -> Tuple[int, int]: + """Return the default warp (m, n) MFMA shape for a (tile, wave). + + A 32x32 warp tile is used when the per-wave tile (tile / wave) is at least + 32 and a multiple of 32 in both M and N; otherwise a 16x16 warp tile is used. + Borderline cases are overridden via _WARP_MN_EXCEPTIONS. + """ + pm, pn = tile_m // wave_m, tile_n // wave_n + if pm >= 32 and pn >= 32 and pm % 32 == 0 and pn % 32 == 0: + return (32, 32) + return (16, 16) + + +def get_warp_mn_candidates( + tile_m: int, tile_n: int, tile_k: int, + wave_m: int, wave_n: int, wave_k: int, + variant: str = "forward", +) -> List[Tuple[int, int]]: + """Return the curated warp (m, n) candidates for a (variant, tile, wave). + + Uses _WARP_MN_EXCEPTIONS when present, otherwise _default_warp_mn(). + """ + key = (variant, (tile_m, tile_n, tile_k), (wave_m, wave_n, wave_k)) + if key in _WARP_MN_EXCEPTIONS: + return list(_WARP_MN_EXCEPTIONS[key]) + return [_default_warp_mn(tile_m, tile_n, wave_m, wave_n)] + + +def get_wave_strategies( + tile_m: int, tile_n: int, tile_k: int, variant: str, +) -> List[WaveStrategy]: + """Return the curated WaveStrategy list for a (variant, macro tile). + + A per-variant override (_WAVE_STRATEGY_OVERRIDES) takes precedence over the + shared base table (_BASE_TILE_WAVE_STRATEGIES). Tiles absent from both fall + back to [WaveStrategy.SINGLE]. + """ + tile = (tile_m, tile_n, tile_k) + override = _WAVE_STRATEGY_OVERRIDES.get(variant, {}).get(tile) + if override is not None: + return list(override) + entry = _BASE_TILE_WAVE_STRATEGIES.get(tile) + if entry is None: + logging.warning( + "No curated wave strategies for variant=%s tile=(%d,%d,%d); " + "falling back to [WaveStrategy.SINGLE]", + variant, tile_m, tile_n, tile_k, + ) + return [WaveStrategy.SINGLE] + return list(entry) + + +def get_wave_configs( + tile_m: int, tile_n: int, tile_k: int, variant: str, +) -> List[Tuple[int, int, int]]: + """Return wave-count configs for a tile+variant. + + Each curated WaveStrategy is turned into its (wave_m, wave_n, wave_k) triple. + Falls back to generic [(1, 1, 1)] for unknown tiles. + """ + return [ + compute_wave_counts(strategy) + for strategy in get_wave_strategies(tile_m, tile_n, tile_k, variant) + ] + + +def get_all_valid_vector_sizes( + tile_m: int, tile_n: int, tile_k: int, + wave_m: int, wave_n: int, wave_k: int, + wt_m: int, wt_n: int, wt_k: int, + dtype_key: str, +) -> Set[Tuple[int, int, int]]: + """Return the set of (vec_a, vec_b, vec_c) triples tile_math considers valid. + + Thin wrapper around tile_math.get_valid_vec_sizes for use as a hard gate: + curated/strategy vec triples are kept only if present in this set. + """ + return set(_tm_get_valid_vec_sizes( + tile_m, tile_n, tile_k, + wave_m, wave_n, wave_k, + wt_m, wt_n, wt_k, + dtype_key, + )) + + +def get_k_mfma(dtype_key: str, m_per_xdl: int) -> int: + """Return the MFMA K dimension for a square warp tile (m_per_xdl == n_per_xdl). + + Single authority mirroring generate_instances.get_k_mfma (the CK Builder). + Arch-independent (reflects the current CDNA4 MFMA shapes): + - half (fp16/bf16): 32x32 -> 16, 16x16 -> 32 + - float (fp32): 32x32 -> 2, 16x16 -> 4 + """ + if dtype_key.startswith("fp32"): + return 2 if m_per_xdl == 32 else 4 + return 16 if m_per_xdl == 32 else 32 + + +def compute_warp_tile_k( + dtype_key: str, warp_tile_m: int, tile_k: int, streamk: bool = False, + use_legacy: bool = False, +) -> int: + """Derive warp_tile_k (the MFMA K) for a config. + + Mirrors the CK Builder formula (generate_instances.py) + k_per_xdl = min(max(k1, get_k_mfma(dtype, m_per_xdl, n_per_xdl)), k_per_block) + where k1 is the per-instance AK1. For half precision get_k_mfma dominates k1, + so warp_tile_k = min(get_k_mfma, tile_k). For fp32, k1 dominates; the reference + instances use k1 = 4 when tile_k <= 16 else 8. + + Hand-written StreamK *native* instances bypass get_k_mfma and carry the legacy + (gfx942) warp_tile_k verbatim: half 32x32 -> 8, 16x16 -> 16, clamped to tile_k + (fp32 native instances clamp to tile_k // 4 instead). + + ``use_legacy`` applies the same legacy formula for non-streamk contexts that + nevertheless use the gfx942 warp_tile_k convention (e.g. some wavelet bwd_weight + instances). + """ + if streamk or use_legacy: + legacy_half_k = 8 if warp_tile_m == 32 else 16 + cap = tile_k // 4 if dtype_key.startswith("fp32") else tile_k + return min(legacy_half_k, cap) + k1 = 4 if tile_k <= 16 else 8 + return min(max(k1, get_k_mfma(dtype_key, warp_tile_m)), tile_k) + + +def get_warp_configs_for_tile_and_wave( + tile_m: int, tile_n: int, tile_k: int, + wave_m: int, wave_n: int, wave_k: int, + dtype_key: str, arch: str = "gfx942", variant: str = "forward", +) -> List[Tuple[int, int]]: + """Return curated (warp_tile_m, warp_tile_n) shapes for a (variant, wave). + + The (warp_tile_m, warp_tile_n) shape is derived by ``get_warp_mn_candidates`` + (a size-threshold function plus a small exception table); warp_tile_k is + derived later by ``compute_warp_tile_k``. + + A (warp_tile_m, warp_tile_n) shape is kept only when it: + - is arch/dtype-supported (WARP_TILE_SUPPORTED_COMBINATIONS[arch][dtype_key]), + - is not in _EXCLUDED_WARP_SHAPES, + - divides the macro tile: tile_m % (wave_m*warp_tile_m) == 0 and + tile_n % (wave_n*warp_tile_n) == 0. + """ + tile = (tile_m, tile_n, tile_k) + wave = (wave_m, wave_n, wave_k) + curated_waves = { + compute_wave_counts(strategy) + for strategy in get_wave_strategies(tile_m, tile_n, tile_k, variant) + } + + if wave not in curated_waves: + raise ValueError(f"No curated warp tiles for variant={variant} tile={tile} wave={wave}") + curated = get_warp_mn_candidates(tile_m, tile_n, tile_k, wave_m, wave_n, wave_k, variant) + + supported_mn = { + (wt[0], wt[1]) + for wt in WARP_TILE_SUPPORTED_COMBINATIONS.get(arch, {}).get(dtype_key, []) + } + + result: List[Tuple[int, int]] = [] + seen: Set[Tuple[int, int]] = set() + for wt in curated: + mn = (wt[0], wt[1]) + if mn in _EXCLUDED_WARP_SHAPES: + continue + if mn not in supported_mn: + continue + if tile_m % (wave_m * mn[0]) != 0 or tile_n % (wave_n * mn[1]) != 0: + continue + if mn not in seen: + seen.add(mn) + result.append(mn) + return result + + +def get_wave_warp_pairs( + tile_m: int, tile_n: int, tile_k: int, + variant: str, dtype_key: str, arch: str = "gfx942", +) -> List[Tuple[Tuple[int, int, int], Tuple[int, int]]]: + """Return (wave, warp_tile_mn) pairs: curated waves x curated warp (m, n) shapes. + + Combines curated wave configs with the curated per-variant wave->warp map + (both from profiler JSON), filtered by arch/dtype support and divisibility. + warp_tile_k is not part of the pair; it is derived later via + ``compute_warp_tile_k``. + + The curated pairs are gated against _tm_get_valid_wave_warp_pairs (imported from + tile_math.py) on the (wave, warp_m, warp_n) granularity, and any curated pair + rejected is dropped with a warning. + """ + tm_pairs = _tm_get_valid_wave_warp_pairs(tile_m, tile_n, tile_k, dtype_key, arch) + tm_pairs_mn = {(wave, (wt[0], wt[1])) for (wave, wt) in tm_pairs} + result = [] + for wave in get_wave_configs(tile_m, tile_n, tile_k, variant): + for mn in get_warp_configs_for_tile_and_wave( + tile_m, tile_n, tile_k, *wave, dtype_key, arch, variant, + ): + if (wave, mn) not in tm_pairs_mn: + logging.warning( + "Dropping curated wave/warp pair %s rejected by tile_math: " + "tile=(%d,%d,%d) variant=%s dtype_key=%s", + (wave, mn), tile_m, tile_n, tile_k, variant, dtype_key, + ) + continue + result.append((wave, mn)) + + # If no curated pairs survived (e.g. for architectures whose supported wave + # combos don't match the CDNA-derived curated strategies, such as rdna4/gfx1250), + # fall back to all tile_math-valid pairs so those arches still get kernels. + if not result and tm_pairs: + for wave, wt in tm_pairs: + result.append((wave, (wt[0], wt[1]))) + + return result + + +# ============================================================================= +# Vector Size Strategies (tile + dtype based, wave/warp independent) +# ============================================================================= +# +# Convolution GEMM tensors vectorize along different logical dimensions: +# Forward: vec_a, vec_b -> C (channels), vec_c -> K (output channels) +# BWD data: vec_a -> K, vec_b, vec_c -> C +# BWD weight: vec_a -> K, vec_b, vec_c -> C +# +# Each strategy produces one (vec_a, vec_b, vec_c) triple from the dtype-determined max. + + +class VecStrategy(Enum): + """Vectorization strategies for grouped convolution GEMM configs. + + Each strategy produces a single (vec_a, vec_b, vec_c) triple derived + from the dtype-determined maximum vector sizes. + """ + GENERIC = "generic" # (1, 1, 1) — minimum fallback + UNIFORM_MAX = "uniform_max" # (max, max, max) — balanced throughput + MAX_AB_HALF_C = "max_ab_half_c" # (max, max, max/2) — fwd (8,8,4) pattern + MAX_A_MIN_BC = "max_a_min_bc" # (max, 1, 1) — bwd (4,1,1)/(8,1,1) pattern + MIN_A_MAX_BC = "min_a_max_bc" # (1, max, max) — bwd (1,4,4)/(1,8,8) pattern + HALF_UNIFORM = "half_uniform" # (max/2, max/2, max/2) — (2,2,2) pattern + QUARTER_AB_MAX_C = "quarter_ab_max_c" # (max/2, max/2, max) — fwd (4,4,8)/(1,1,8) pattern + MAX_AB_QUARTER_C = "max_ab_quarter_c" # (max, max, max/4) — half (8,8,2), fp32 (4,4,1) + MAX_A_QUARTER_BC = "max_a_quarter_bc" # (max, max/4, max/4) — half (8,2,2) + MIN_AB_MAX_C = "min_ab_max_c" # (1, 1, max) — half (1,1,8), fp32 (1,1,4) + MAX_A_HALF_BC = "max_a_half_bc" # (max, max/2, max/2) — fp32 (4,2,2) + MAX_AB_MIN_C = "max_ab_min_c" # (max, max, 1) — half (8,8,1) + MIN_AB_QUARTER_C = "min_ab_quarter_c" # (1, 1, max/4) — half (1,1,2) + MIN_A_MAX_B_HALF_C = "min_a_max_b_half_c" # (1, max, max/2) — half (1,8,4), fp32 (1,4,2) - TODO: Is this valid? + HALF_A_MAX_BC = "half_a_max_bc" # (max/2, max, max) — fp32 (2,4,4) + HALF_A_MIN_BC = "half_a_min_bc" # (max/2, 1, 1) — fp32 (2,1,1) + + +def _max_vec(dtype_class: str) -> int: + """Return the maximum vector width for a dtype class.""" + if dtype_class == "float": + return 4 + elif dtype_class in ("half", "fp16", "bf16"): + return 8 + else: + raise ValueError(f"Unknown dtype class: {dtype_class}") + + +def compute_vector_size( + strategy: VecStrategy, + dtype_class: str, +) -> Tuple[int, int, int]: + """Compute a (vec_a, vec_b, vec_c) triple for a given strategy and dtype. + + Args: + strategy: Which vectorization pattern to use. + dtype_class: "float" (fp32) or "half" (fp16/bf16). + + Returns: + A single (vec_a, vec_b, vec_c) triple. + """ + m = _max_vec(dtype_class) + h = max(1, m // 2) + q = max(1, m // 4) + + if strategy == VecStrategy.GENERIC: + return (1, 1, 1) + elif strategy == VecStrategy.UNIFORM_MAX: + return (m, m, m) + elif strategy == VecStrategy.MAX_AB_HALF_C: + return (m, m, h) + elif strategy == VecStrategy.MAX_A_MIN_BC: + return (m, 1, 1) + elif strategy == VecStrategy.MIN_A_MAX_BC: + return (1, m, m) + elif strategy == VecStrategy.HALF_UNIFORM: + return (h, h, h) + elif strategy == VecStrategy.QUARTER_AB_MAX_C: + return (h, h, m) + elif strategy == VecStrategy.MAX_AB_QUARTER_C: + return (m, m, q) + elif strategy == VecStrategy.MAX_A_QUARTER_BC: + return (m, q, q) + elif strategy == VecStrategy.MIN_AB_MAX_C: + return (1, 1, m) + elif strategy == VecStrategy.MAX_A_HALF_BC: + return (m, h, h) + elif strategy == VecStrategy.MAX_AB_MIN_C: + return (m, m, 1) + elif strategy == VecStrategy.MIN_AB_QUARTER_C: + return (1, 1, q) + elif strategy == VecStrategy.MIN_A_MAX_B_HALF_C: + return (1, m, h) + elif strategy == VecStrategy.HALF_A_MAX_BC: + return (h, m, m) + elif strategy == VecStrategy.HALF_A_MIN_BC: + return (h, 1, 1) + else: + return (1, 1, 1) + + +# ============================================================================= +# Per-Tile VecStrategy Tables +# ============================================================================= +# Per-variant mapping: tile -> {dtype_class -> list[VecStrategy]}. +# Derived per (variant, tile, dtype_class) via greedy set-cover over VecStrategy. +# Tiles not in the table fall back to [GENERIC] (dtype-independent). +# + +_FWD_TILE_STRATEGIES: Dict[Tuple[int, int, int], Dict[str, List[VecStrategy]]] = { + (16, 16, 64): {"half": [VecStrategy.MAX_AB_HALF_C], "float": [VecStrategy.UNIFORM_MAX]}, + (16, 16, 128): {"half": [VecStrategy.MAX_AB_HALF_C], "float": [VecStrategy.UNIFORM_MAX]}, + (16, 32, 64): {"half": [VecStrategy.MAX_AB_HALF_C], "float": [VecStrategy.UNIFORM_MAX]}, + (16, 64, 64): {"half": [VecStrategy.MAX_AB_HALF_C], "float": [VecStrategy.UNIFORM_MAX]}, + (16, 128, 64): {"half": [VecStrategy.MAX_AB_HALF_C], "float": [VecStrategy.UNIFORM_MAX]}, + (16, 256, 64): {"half": [VecStrategy.MAX_AB_HALF_C]}, + (32, 16, 64): {"half": [VecStrategy.MAX_AB_QUARTER_C], "float": [VecStrategy.MAX_AB_HALF_C]}, + (32, 64, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (32, 64, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_AB_MAX_C]}, + (32, 64, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (32, 128, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (32, 128, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_AB_MAX_C]}, + (32, 128, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (32, 256, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (64, 16, 16): {"half": [VecStrategy.HALF_A_MIN_BC], "float": [VecStrategy.MAX_A_MIN_BC]}, + (64, 16, 64): {"half": [VecStrategy.MAX_AB_QUARTER_C], "float": [VecStrategy.MAX_AB_HALF_C]}, + (64, 32, 16): {"float": [VecStrategy.UNIFORM_MAX, VecStrategy.MAX_AB_QUARTER_C]}, + (64, 32, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_AB_MAX_C, VecStrategy.MAX_AB_MIN_C]}, + (64, 32, 64): {"half": [VecStrategy.MAX_AB_HALF_C], "float": [VecStrategy.UNIFORM_MAX]}, + (64, 64, 8): {"half": [VecStrategy.MIN_AB_MAX_C]}, + (64, 64, 16): {"float": [VecStrategy.GENERIC, VecStrategy.UNIFORM_MAX]}, + (64, 64, 32): {"half": [VecStrategy.GENERIC, VecStrategy.UNIFORM_MAX, VecStrategy.HALF_UNIFORM, VecStrategy.MIN_AB_MAX_C], "float": [VecStrategy.UNIFORM_MAX]}, + (64, 64, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (64, 128, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (64, 128, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_AB_MAX_C]}, + (64, 128, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (128, 16, 64): {"half": [VecStrategy.MAX_AB_QUARTER_C], "float": [VecStrategy.MAX_AB_HALF_C]}, + (128, 32, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (128, 32, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.HALF_UNIFORM, VecStrategy.MIN_AB_MAX_C]}, + (128, 32, 64): {"half": [VecStrategy.MAX_AB_HALF_C], "float": [VecStrategy.UNIFORM_MAX]}, + (128, 64, 8): {"half": [VecStrategy.MIN_AB_MAX_C]}, + (128, 64, 16): {"half": [VecStrategy.MIN_AB_MAX_C], "float": [VecStrategy.UNIFORM_MAX]}, + (128, 64, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_AB_MAX_C]}, + (128, 64, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (128, 128, 16): {"float": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_AB_MAX_C]}, + (128, 128, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_AB_MAX_C]}, + (128, 128, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (128, 192, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (128, 256, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (128, 256, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_AB_MAX_C]}, + (224, 256, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (256, 16, 64): {"half": [VecStrategy.MAX_AB_QUARTER_C]}, + (256, 32, 64): {"half": [VecStrategy.MAX_AB_HALF_C]}, + (256, 64, 8): {"half": [VecStrategy.MIN_AB_MAX_C]}, + (256, 128, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (256, 128, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_AB_MAX_C]}, + (256, 224, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (256, 256, 32): {"half": [VecStrategy.UNIFORM_MAX]}, +} + + +_BWD_DATA_TILE_STRATEGIES: Dict[Tuple[int, int, int], Dict[str, List[VecStrategy]]] = { + (16, 64, 32): {"half": [VecStrategy.MAX_AB_HALF_C, VecStrategy.MAX_A_MIN_BC, VecStrategy.MIN_A_MAX_B_HALF_C], "float": [VecStrategy.UNIFORM_MAX, VecStrategy.MAX_A_MIN_BC, VecStrategy.MIN_A_MAX_BC]}, + (32, 64, 32): {"half": [VecStrategy.UNIFORM_MAX], "float": [VecStrategy.UNIFORM_MAX]}, + (32, 128, 32): {"half": [VecStrategy.UNIFORM_MAX], "float": [VecStrategy.UNIFORM_MAX]}, + (64, 16, 16): {"half": [VecStrategy.HALF_A_MIN_BC], "float": [VecStrategy.MAX_A_MIN_BC]}, + (64, 16, 32): {"half": [VecStrategy.MAX_AB_HALF_C, VecStrategy.MAX_A_MIN_BC, VecStrategy.MAX_A_QUARTER_BC, VecStrategy.MIN_A_MAX_B_HALF_C], "float": [VecStrategy.UNIFORM_MAX, VecStrategy.MAX_A_MIN_BC, VecStrategy.MIN_A_MAX_BC]}, + (64, 32, 32): {"half": [VecStrategy.UNIFORM_MAX], "float": [VecStrategy.UNIFORM_MAX]}, + (64, 64, 32): {"half": [VecStrategy.GENERIC, VecStrategy.UNIFORM_MAX], "float": [VecStrategy.GENERIC, VecStrategy.UNIFORM_MAX]}, + (64, 128, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_A_MAX_BC], "float": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_A_MAX_BC]}, + (128, 32, 16): {"half": [VecStrategy.HALF_A_MIN_BC], "float": [VecStrategy.MAX_A_MIN_BC, VecStrategy.MAX_A_HALF_BC]}, + (128, 32, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MAX_A_MIN_BC, VecStrategy.MAX_A_QUARTER_BC], "float": [VecStrategy.UNIFORM_MAX, VecStrategy.MAX_A_MIN_BC]}, + (128, 64, 32): {"half": [VecStrategy.UNIFORM_MAX], "float": [VecStrategy.UNIFORM_MAX]}, + (128, 128, 32): {"half": [VecStrategy.UNIFORM_MAX], "float": [VecStrategy.UNIFORM_MAX]}, + (128, 256, 32): {"half": [VecStrategy.UNIFORM_MAX], "float": [VecStrategy.UNIFORM_MAX]}, + (256, 128, 32): {"half": [VecStrategy.UNIFORM_MAX], "float": [VecStrategy.UNIFORM_MAX]}, +} + + +_BWD_WEIGHT_TILE_STRATEGIES: Dict[Tuple[int, int, int], Dict[str, List[VecStrategy]]] = { + (16, 16, 32): {"half": [VecStrategy.GENERIC, VecStrategy.MIN_AB_QUARTER_C]}, + (16, 16, 64): {"half": [VecStrategy.GENERIC, VecStrategy.HALF_UNIFORM, VecStrategy.HALF_A_MIN_BC]}, + (16, 32, 64): {"half": [VecStrategy.GENERIC, VecStrategy.MAX_AB_HALF_C], "float": [VecStrategy.HALF_A_MAX_BC]}, + (16, 64, 64): {"half": [VecStrategy.GENERIC, VecStrategy.MAX_AB_HALF_C, VecStrategy.MIN_A_MAX_B_HALF_C]}, + (16, 128, 64): {"half": [VecStrategy.MIN_A_MAX_B_HALF_C]}, + (16, 256, 32): {"half": [VecStrategy.MAX_AB_MIN_C]}, + (16, 256, 64): {"half": [VecStrategy.MIN_A_MAX_B_HALF_C]}, + (32, 16, 64): {"half": [VecStrategy.GENERIC, VecStrategy.HALF_A_MIN_BC], "float": [VecStrategy.MAX_A_HALF_BC]}, + (32, 64, 16): {"float": [VecStrategy.UNIFORM_MAX, VecStrategy.MIN_A_MAX_BC]}, + (32, 64, 32): {"half": [VecStrategy.UNIFORM_MAX]}, + (32, 128, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (32, 128, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MAX_AB_QUARTER_C, VecStrategy.MAX_AB_MIN_C]}, + (64, 16, 64): {"half": [VecStrategy.GENERIC, VecStrategy.MAX_A_MIN_BC, VecStrategy.MAX_A_QUARTER_BC]}, + (64, 32, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (64, 32, 32): {"half": [VecStrategy.UNIFORM_MAX]}, + (64, 64, 16): {"float": [VecStrategy.GENERIC, VecStrategy.UNIFORM_MAX]}, + (64, 64, 32): {"half": [VecStrategy.UNIFORM_MAX]}, + (64, 64, 64): {"half": [VecStrategy.GENERIC, VecStrategy.UNIFORM_MAX, VecStrategy.MAX_AB_HALF_C, VecStrategy.MAX_AB_QUARTER_C, VecStrategy.HALF_A_MIN_BC], "float": [VecStrategy.GENERIC, VecStrategy.UNIFORM_MAX, VecStrategy.MAX_A_MIN_BC, VecStrategy.MIN_A_MAX_BC]}, + (64, 128, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (64, 128, 32): {"half": [VecStrategy.UNIFORM_MAX]}, + (64, 128, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (128, 16, 64): {"half": [VecStrategy.MAX_A_MIN_BC, VecStrategy.MAX_A_QUARTER_BC]}, + (128, 32, 16): {"float": [VecStrategy.UNIFORM_MAX, VecStrategy.MAX_A_MIN_BC]}, + (128, 32, 32): {"half": [VecStrategy.UNIFORM_MAX, VecStrategy.MAX_AB_QUARTER_C, VecStrategy.MAX_A_QUARTER_BC, VecStrategy.MAX_AB_MIN_C]}, + (128, 64, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (128, 64, 32): {"half": [VecStrategy.UNIFORM_MAX]}, + (128, 128, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (128, 128, 32): {"half": [VecStrategy.UNIFORM_MAX]}, + (128, 128, 64): {"half": [VecStrategy.MAX_AB_HALF_C, VecStrategy.HALF_UNIFORM]}, + (128, 256, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (128, 256, 32): {"half": [VecStrategy.UNIFORM_MAX]}, + (256, 16, 64): {"half": [VecStrategy.MAX_A_MIN_BC, VecStrategy.MAX_A_QUARTER_BC]}, + (256, 32, 64): {"half": [VecStrategy.UNIFORM_MAX]}, + (256, 128, 16): {"float": [VecStrategy.UNIFORM_MAX]}, + (256, 128, 32): {"half": [VecStrategy.UNIFORM_MAX]}, + (256, 256, 32): {"half": [VecStrategy.MAX_AB_HALF_C, VecStrategy.HALF_UNIFORM]}, +} + + +def get_vec_strategies( + tile_m: int, tile_n: int, tile_k: int, variant: str, + dtype_class: Optional[str] = None, +) -> List[VecStrategy]: + """Return curated VecStrategy list for a tile+variant (from profiler JSON). + + Tables are dtype-class-keyed. If ``dtype_class`` ("half"/"float") is given, + return only that dtype's strategies. If None, return the union across dtype + classes (preserving order, deduplicated). Falls back to [GENERIC] for tiles + not in the table. + """ + table = { + "forward": _FWD_TILE_STRATEGIES, + "bwd_data": _BWD_DATA_TILE_STRATEGIES, + "bwd_weight": _BWD_WEIGHT_TILE_STRATEGIES, + }.get(variant, {}) + entry = table.get((tile_m, tile_n, tile_k)) + if entry is None: + return [VecStrategy.GENERIC] + if dtype_class is not None: + return entry.get(dtype_class, []) + # Union across dtype classes, deduplicated, order-preserving. + out: List[VecStrategy] = [] + seen = set() + for dc in ("half", "float"): + for s in entry.get(dc, []): + if s not in seen: + seen.add(s) + out.append(s) + return out + + +# ============================================================================= +# Explicit Per-Tile Vec Overrides (don't fit any strategy family) +# ============================================================================= +# A small set of (variant, tile) -> extra vec triples used by the JSON profiler +# configs that no VecStrategy formula produces. These are added on top of the +# strategy-derived vecs (superset semantics). Includes bwd_data's vec_a=16 +# (A vectorizes along K, beyond the dtype-class max) and a handful of +# idiosyncratic per-tile triples. + +_EXTRA_VEC_TRIPLES: Dict[str, Dict[Tuple[int, int, int], Dict[str, List[Tuple[int, int, int]]]]] = { + "forward": { + (32, 64, 64): {"float": [(4, 4, 8)]}, + (32, 128, 64): {"float": [(4, 4, 8)]}, + (64, 64, 32): {"half": [(1, 2, 1), (2, 1, 2)], "float": [(1, 2, 1), (2, 1, 2)]}, + (64, 64, 64): {"half": [(8, 8, 1), (8, 8, 4)]}, + (128, 128, 32): {"float": [(4, 4, 8)]}, + (128, 128, 64): {"half": [(8, 8, 1), (8, 8, 8)], "float": [(4, 4, 8)]}, + (256, 128, 32): {"half": [(2, 2, 2)]}, + }, + "bwd_data": { + (64, 16, 32): {"float": [(8, 1, 1), (8, 2, 2)]}, + (64, 16, 64): {"half": [(16, 1, 1), (16, 2, 2)]}, + (64, 64, 64): {"half": [(8, 8, 4), (8, 8, 8)]}, + (128, 32, 16): {"half": [(4, 2, 2)]}, + (128, 32, 32): {"float": [(8, 1, 1), (8, 2, 2)]}, + (128, 32, 64): {"half": [(16, 1, 1), (16, 2, 2), (16, 8, 8)]}, + (128, 64, 64): {"half": [(8, 8, 8)]}, + (128, 256, 32): {"half": [(8, 4, 8)]}, + (256, 32, 64): {"half": [(8, 8, 8)]}, + (256, 128, 32): {"half": [(4, 8, 8)]}, + (256, 128, 64): {"half": [(8, 8, 4), (8, 8, 8)]}, + }, + "bwd_weight": { + (16, 16, 32): {"float": [(1, 1, 2)]}, + (16, 16, 64): {"half": [(1, 4, 4)]}, + (16, 32, 64): {"half": [(1, 2, 4), (1, 4, 4), (2, 1, 1), (2, 2, 4), (2, 4, 4)]}, + (16, 64, 64): {"half": [(2, 1, 1), (2, 8, 4), (4, 8, 8)]}, + (16, 128, 32): {"half": [(4, 4, 1)]}, + (16, 128, 64): {"half": [(2, 8, 4)]}, + (16, 256, 64): {"half": [(2, 8, 4)]}, + (32, 16, 64): {"half": [(1, 2, 2), (2, 1, 1), (2, 2, 2), (4, 2, 2)]}, + (32, 32, 32): {"half": [(2, 2, 1), (2, 2, 2)]}, + (32, 64, 32): {"half": [(2, 2, 1), (2, 8, 8), (4, 4, 1), (4, 4, 2)]}, + (64, 16, 64): {"half": [(1, 2, 2)], "float": [(8, 2, 2)]}, + (64, 32, 32): {"half": [(4, 4, 1), (4, 4, 2)]}, + (64, 32, 64): {"half": [(8, 8, 8)]}, + (64, 64, 32): {"half": [(2, 2, 2)]}, + (64, 64, 64): {"half": [(1, 4, 4), (2, 2, 2), (2, 2, 4), (4, 8, 8)]}, + (128, 32, 32): {"float": [(8, 2, 2)]}, + }, +} + + +def get_extra_vec_triples( + tile_m: int, tile_n: int, tile_k: int, variant: str, + dtype_class: Optional[str] = None, +) -> List[Tuple[int, int, int]]: + """Return explicit per-tile vec triples not produced by any VecStrategy. + + Dtype-class-keyed. If ``dtype_class`` is given, return only that + dtype's extra triples; if None, return the union across dtype classes. + Empty for tiles whose vecs are fully covered by strategies. + """ + per_dc = _EXTRA_VEC_TRIPLES.get(variant, {}).get((tile_m, tile_n, tile_k)) + if not per_dc: + return [] + if dtype_class is not None: + return per_dc.get(dtype_class, []) + out: List[Tuple[int, int, int]] = [] + seen = set() + for dc in ("half", "float"): + for tr in per_dc.get(dc, []): + if tr not in seen: + seen.add(tr) + out.append(tr) + return out + + +# bwd_weight wavelet tiles that use the legacy gfx942 warp_tile_k formula +# (same as streamk native instances) rather than the new get_k_mfma formula. +# Derived from the CK Builder conf files: these tiles carry warp_tile_k=16 for +# half (warp_tile_m=16) instead of the new formula value of 32. +_BWD_WEIGHT_WAVELET_LEGACY_WARP_K_TILES: Set[Tuple[int, int, int]] = { + (64, 32, 64), + (64, 64, 64), +} + +# ============================================================================= +# Pipeline / Scheduler Rules (per-tile, replaces cross-product) +# ============================================================================= + +_COMPV4_SET: Set[Tuple[int, int, int]] = set(COMPV4_COMPATIBLE_TILES) + + +# ============================================================================= +# Curated per-tile (pipeline, scheduler) map +# ============================================================================= +# Per-variant mapping: tile -> list of (pipeline, scheduler). +# Preferred over the rule-based computation below; tiles absent here fall back to +# the shape-based rules. + +_FWD_TILE_PIPELINES: Dict[Tuple[int, int, int], List[Tuple[str, str]]] = { + (16, 16, 64): [('compv1', 'interwave'), ('compv1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave')], + (16, 16, 128): [('compv1', 'interwave'), ('compv1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave')], + (16, 32, 64): [('compv1', 'interwave'), ('compv1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave')], + (16, 64, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (16, 128, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (16, 256, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (32, 16, 64): [('compv1', 'interwave'), ('compv1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave')], + (32, 64, 16): [('compv1', 'intrawave')], + (32, 64, 32): [('compv1', 'intrawave')], + (32, 64, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (32, 128, 16): [('compv1', 'intrawave')], + (32, 128, 32): [('compv1', 'intrawave')], + (32, 128, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (32, 256, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (64, 16, 16): [('compv1', 'intrawave')], + (64, 16, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (64, 32, 16): [('compv1', 'intrawave')], + (64, 32, 32): [('compv1', 'intrawave')], + (64, 32, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (64, 64, 8): [('compv1', 'intrawave')], + (64, 64, 16): [('compv1', 'intrawave')], + (64, 64, 32): [('compv1', 'intrawave')], + (64, 64, 64): [('compv3', 'intrawave')], + (64, 128, 16): [('compv1', 'intrawave')], + (64, 128, 32): [('compv1', 'intrawave')], + (64, 128, 64): [('compv3', 'intrawave')], + (128, 16, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (128, 32, 16): [('compv1', 'intrawave')], + (128, 32, 32): [('compv1', 'interwave'), ('compv1', 'intrawave')], + (128, 32, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (128, 64, 8): [('compv1', 'intrawave')], + (128, 64, 16): [('compv1', 'intrawave')], + (128, 64, 32): [('compv1', 'intrawave')], + (128, 64, 64): [('compv3', 'intrawave')], + (128, 128, 16): [('compv1', 'intrawave')], + (128, 128, 32): [('compv1', 'intrawave'), ('compv4', 'intrawave')], + (128, 128, 64): [('compv1', 'interwave'), ('compv3', 'intrawave'), ('compv4', 'intrawave'), ('compv6', 'intrawave')], + (128, 192, 16): [('compv1', 'intrawave')], + (128, 256, 16): [('compv1', 'intrawave')], + (128, 256, 32): [('compv1', 'interwave'), ('compv1', 'intrawave')], + (224, 256, 64): [('compv3', 'intrawave')], + (256, 16, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (256, 32, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (256, 64, 8): [('compv1', 'intrawave')], + (256, 128, 16): [('compv1', 'intrawave')], + (256, 128, 32): [('compv1', 'interwave'), ('compv1', 'intrawave')], + (256, 224, 64): [('compv3', 'intrawave')], + (256, 256, 32): [('compv3', 'intrawave'), ('compv4', 'intrawave'), ('compv6', 'intrawave')], +} + +_BWD_DATA_TILE_PIPELINES: Dict[Tuple[int, int, int], List[Tuple[str, str]]] = { + (16, 64, 32): [('compv1', 'intrawave')], + (32, 64, 32): [('compv1', 'intrawave')], + (32, 128, 32): [('compv1', 'intrawave')], + (64, 16, 16): [('compv1', 'intrawave')], + (64, 16, 32): [('compv1', 'intrawave')], + (64, 16, 64): [('compv1', 'intrawave')], + (64, 32, 32): [('compv1', 'intrawave')], + (64, 64, 32): [('compv1', 'intrawave')], + (64, 64, 64): [('wavelet', 'intrawave')], + (64, 128, 32): [('compv1', 'intrawave')], + (128, 32, 16): [('compv1', 'intrawave')], + (128, 32, 32): [('compv1', 'intrawave')], + (128, 32, 64): [('compv1', 'intrawave')], + (128, 64, 32): [('compv1', 'intrawave')], + (128, 64, 64): [('wavelet', 'intrawave')], + (128, 128, 32): [('compv1', 'intrawave')], + (128, 256, 32): [('compv1', 'intrawave')], + (256, 32, 64): [('wavelet', 'intrawave')], + (256, 128, 32): [('compv1', 'intrawave'), ('wavelet', 'intrawave')], + (256, 128, 64): [('wavelet', 'intrawave')], +} + +_BWD_WEIGHT_TILE_PIPELINES: Dict[Tuple[int, int, int], List[Tuple[str, str]]] = { + (16, 16, 32): [('compv1', 'intrawave'), ('compv6', 'intrawave'), ('mem', 'intrawave')], + (16, 16, 64): [('compv1', 'interwave'), ('compv1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave')], + (16, 32, 64): [('basic_async_v1', 'intrawave'), ('compv1', 'interwave'), ('compv1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave')], + (16, 64, 64): [('basic_async_v1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave')], + (16, 128, 32): [('compv1', 'intrawave')], + (16, 128, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (16, 256, 32): [('compv1', 'intrawave')], + (16, 256, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (32, 16, 64): [('compv1', 'interwave'), ('compv1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave')], + (32, 32, 32): [('compv1', 'intrawave'), ('compv6', 'intrawave'), ('mem', 'intrawave')], + (32, 64, 16): [('compv1', 'intrawave')], + (32, 64, 32): [('compv1', 'intrawave'), ('compv6', 'intrawave'), ('mem', 'intrawave')], + (32, 128, 16): [('compv1', 'intrawave')], + (32, 128, 32): [('compv1', 'intrawave'), ('compv6', 'intrawave'), ('mem', 'intrawave')], + (64, 16, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (64, 32, 16): [('compv1', 'intrawave')], + (64, 32, 32): [('compv1', 'intrawave'), ('compv6', 'intrawave'), ('mem', 'intrawave')], + (64, 64, 16): [('compv1', 'intrawave')], + (64, 64, 32): [('compv1', 'intrawave')], + (64, 64, 64): [('basic_async_v1', 'intrawave'), ('compv1', 'intrawave')], + (64, 128, 16): [('compv1', 'intrawave')], + (64, 128, 32): [('compv1', 'intrawave')], + (64, 128, 64): [('basic_async_v1', 'intrawave')], + (128, 16, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (128, 32, 16): [('compv1', 'intrawave')], + (128, 32, 32): [('compv1', 'intrawave'), ('compv6', 'intrawave'), ('mem', 'intrawave')], + (128, 64, 16): [('compv1', 'intrawave')], + (128, 64, 32): [('compv1', 'intrawave')], + (128, 128, 16): [('compv1', 'intrawave')], + (128, 128, 32): [('compv1', 'intrawave')], + (128, 128, 64): [('compv1', 'interwave'), ('compv3', 'intrawave'), ('compv4', 'intrawave'), ('compv6', 'intrawave')], + (128, 256, 16): [('compv1', 'intrawave')], + (128, 256, 32): [('compv1', 'intrawave')], + (256, 16, 64): [('mem', 'interwave'), ('mem', 'intrawave')], + (256, 32, 64): [('basic_async_v1', 'intrawave')], + (256, 128, 16): [('compv1', 'intrawave')], + (256, 128, 32): [('compv1', 'intrawave')], + (256, 256, 32): [('compv3', 'intrawave'), ('compv4', 'intrawave'), ('compv6', 'intrawave')], +} + + +# Dtype-class-keyed pipeline overrides for tiles whose (pipeline, scheduler) +# set differs between half (bf16/fp16) and float (fp32). Consulted first when a +# dtype_class is provided. Tiles used by only one dtype-class are handled by the +# ndim+dtype tile tables, so only tiles present in BOTH classes appear here. +# half = union(bf16, fp16) pipes; float = fp32 pipes (from profiler JSON). +_BWD_WEIGHT_TILE_PIPELINES_DCLASS: Dict[Tuple[int, int, int], Dict[str, List[Tuple[str, str]]]] = { + (16, 16, 32): {'half': [('compv1', 'intrawave'), ('compv6', 'intrawave'), ('mem', 'intrawave')], 'float': [('compv6', 'intrawave'), ('mem', 'intrawave')]}, + (16, 32, 64): {'half': [('basic_async_v1', 'intrawave'), ('compv1', 'interwave'), ('compv1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave')], 'float': [('compv1', 'intrawave')]}, + (16, 64, 64): {'half': [('basic_async_v1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave'), ('wavelet', 'intrawave')], 'float': []}, + (32, 16, 64): {'half': [('compv1', 'interwave'), ('compv1', 'intrawave'), ('mem', 'interwave'), ('mem', 'intrawave')], 'float': [('compv1', 'intrawave')]}, + (64, 16, 64): {'half': [('mem', 'interwave'), ('mem', 'intrawave')], 'float': [('mem', 'intrawave')]}, + (64, 32, 64): {'half': [('wavelet', 'intrawave')], 'float': []}, + (64, 64, 64): {'half': [('basic_async_v1', 'intrawave'), ('compv1', 'intrawave'), ('wavelet', 'intrawave')], 'float': [('compv1', 'intrawave')]}, + (128, 32, 32): {'half': [('compv1', 'intrawave'), ('compv6', 'intrawave'), ('mem', 'intrawave')], 'float': [('compv1', 'intrawave')]}, +} + +_FWD_TILE_PIPELINES_DCLASS: Dict[Tuple[int, int, int], Dict[str, List[Tuple[str, str]]]] = { + (64, 64, 64): {'half': [('compv3', 'intrawave'), ('wavelet', 'intrawave')], 'float': [('compv3', 'intrawave')]}, + (128, 128, 32): {'half': [('compv1', 'intrawave'), ('compv4', 'intrawave')], 'float': [('compv4', 'intrawave')]}, + (128, 128, 64): {'half': [('compv1', 'interwave'), ('compv3', 'intrawave'), ('compv4', 'intrawave'), ('compv6', 'intrawave'), ('wavelet', 'intrawave')], 'float': [('compv1', 'interwave'), ('compv3', 'intrawave'), ('compv6', 'intrawave')]}, +} + + +def get_pipelines_for_tile( + tile_m: int, tile_n: int, tile_k: int, variant: str, + dtype_class: Optional[str] = None, +) -> List[Tuple[str, str]]: + """Return list of (pipeline, scheduler) pairs for a tile shape and variant. + + When ``dtype_class`` ("half"/"float") is given and a dtype-class override + exists for this (variant, tile), that override is returned (trims half-only + pipelines from fp32 and vice versa). Otherwise prefers the curated per-tile + map (from profiler JSON) when the tile is present, falling back to the + shape-based rules below. + """ + tile_key = (tile_m, tile_n, tile_k) + + if dtype_class is not None: + dclass_table = { + "forward": _FWD_TILE_PIPELINES_DCLASS, + "bwd_weight": _BWD_WEIGHT_TILE_PIPELINES_DCLASS, + }.get(variant, {}) + override = dclass_table.get(tile_key) + if override is not None and dtype_class in override: + return list(override[dtype_class]) + + curated = { + "forward": _FWD_TILE_PIPELINES, + "bwd_data": _BWD_DATA_TILE_PIPELINES, + "bwd_weight": _BWD_WEIGHT_TILE_PIPELINES, + }.get(variant, {}) + if tile_key in curated: + return list(curated[tile_key]) + + tile_area = tile_m * tile_n + min_dim = min(tile_m, tile_n) + + if variant == "forward": + pipes: List[Tuple[str, str]] = [("compv1", "intrawave")] + if tile_k >= 32: + pipes.append(("compv1", "interwave")) + if min_dim <= 32 and tile_k >= 64: + pipes.append(("mem", "intrawave")) + pipes.append(("mem", "interwave")) + if tile_area >= 4096 and tile_k >= 32: + pipes.append(("compv3", "intrawave")) + if tile_key in _COMPV4_SET or (tile_area >= 16384 and tile_k >= 32): + pipes.append(("compv4", "intrawave")) + if tile_area >= 4096 and tile_k >= 32: + pipes.append(("compv6", "intrawave")) + return pipes + + elif variant == "bwd_data": + return [("compv1", "intrawave")] + + elif variant == "bwd_weight": + pipes = [("compv1", "intrawave")] + if tile_k >= 64: + pipes.append(("compv1", "interwave")) + if tile_k >= 32: + pipes.append(("mem", "intrawave")) + if tile_k >= 64: + pipes.append(("mem", "interwave")) + if tile_area >= 4096 and tile_k >= 32: + pipes.append(("compv3", "intrawave")) + if tile_key in _COMPV4_SET or (tile_area >= 16384 and tile_k >= 32): + pipes.append(("compv4", "intrawave")) + if tile_k >= 32: + pipes.append(("compv6", "intrawave")) + if tile_k == 64: + pipes.append(("basic_async_v1", "intrawave")) + return pipes + + return [("compv1", "intrawave")] + + +# ============================================================================= +# Specialization Rules (per-tile, replaces cross-product) +# ============================================================================= + + +def get_specs_for_tile( + tile_m: int, tile_n: int, tile_k: int, variant: str, +) -> List[str]: + """Return list of specialization strings for a tile shape and variant. + + Rule-based specialization assignment — assigns only the specializations + that make sense for the given tile dimensions. + """ + if variant == "forward": + if tile_k == 8: + return ["default"] + # tile_k >= 16 + specs = ["default", "filter1x1_pad0", "filter1x1_stride1_pad0"] + if tile_m * tile_n <= 4096: + specs.append("filter3x3") + return specs + elif variant in ("bwd_data", "bwd_weight"): + return ["default", "filter1x1_stride1_pad0"] + + return ["default"] + + +# ============================================================================= +# Pipeline / Scheduler Rules (variant-level, kept for backward compat) +# ============================================================================= + +# Valid (pipeline, scheduler) pairs per variant +# Derived from JSON profiler configs (union of bf16 + fp32). +VARIANT_PIPELINE_SCHEDULER: Dict[str, List[Tuple[str, str]]] = { + "forward": [ + ("compv1", "intrawave"), + ("compv1", "interwave"), + ("compv3", "intrawave"), + ("compv4", "intrawave"), + ("compv6", "intrawave"), + ("mem", "intrawave"), + ("mem", "interwave"), + ], + "bwd_data": [ + ("compv1", "intrawave"), + ], + "bwd_weight": [ + ("compv1", "intrawave"), + ("compv1", "interwave"), + ("compv3", "intrawave"), + ("compv4", "intrawave"), + ("compv6", "intrawave"), + ("mem", "intrawave"), + ("mem", "interwave"), + ("basic_async_v1", "intrawave"), + ], +} + +# Specializations per variant +VARIANT_SPECIALIZATIONS: Dict[str, List[str]] = { + "forward": ["default", "filter1x1_pad0", "filter1x1_stride1_pad0", "filter3x3"], + "bwd_data": ["default", "filter1x1_stride1_pad0"], + "bwd_weight": ["default", "filter1x1_stride1_pad0"], +} + +# ============================================================================= +# Feature Flag Rules (Phase 5) +# ============================================================================= + + +@dataclass +class StreamKSpec: + """StreamK parameters for a feature config.""" + strategy: str = "TREE" # "TREE" | "LINEAR" + persistent: bool = False # non-persistent by default + + +@dataclass +class FeatureSpec: + """A single feature-flag variant rule. + + Fields that are False/1/None represent 'off'. + tile_override / pipeline_override = None means use variant defaults. + """ + split_image: bool = False + explicit_gemm: bool = False + two_stage: bool = False + double_smem_buffer: bool = False + num_groups_to_merge: int = 1 + streamk_config: Optional[StreamKSpec] = None + + # Optional overrides (None = use variant defaults) + tile_override: Optional[List[Tuple[int, int, int]]] = None + pipeline_override: Optional[List[Tuple[str, str]]] = None + + # Optional restrictions (None = applies to all). When set, the feature is + # only emitted for the listed dtype classes ("half"/"float") and/or ndims. + dtype_classes: Optional[List[str]] = None + ndims: Optional[List[int]] = None + + +# Tiles used per feature (derived from JSON profiler analysis). +# Restricting features to specific tiles prevents config explosion. +_FWD_GM_TILES: List[Tuple[int, int, int]] = [ + (64, 16, 16), (128, 32, 32), +] +_BWD_EG_TILES: List[Tuple[int, int, int]] = [ + (16, 16, 64), (16, 32, 64), (16, 64, 64), (16, 128, 64), (16, 256, 64), + (32, 16, 64), (64, 16, 64), (128, 16, 64), (128, 128, 64), + (256, 16, 64), (256, 256, 32), +] +_BWD_EG_2S_TILES: List[Tuple[int, int, int]] = [ + (16, 16, 64), (16, 32, 64), (16, 64, 64), + (32, 16, 64), (64, 16, 64), (128, 16, 64), (256, 16, 64), +] +_BWD_2S_TILES: List[Tuple[int, int, int]] = [ + (16, 16, 32), (64, 64, 64), +] +_BWD_GM2_2S_TILES: List[Tuple[int, int, int]] = [ + (32, 32, 32), (32, 64, 32), +] +_BWD_GM4_2S_TILES: List[Tuple[int, int, int]] = [ + (16, 128, 32), (32, 64, 32), (64, 32, 32), +] +_BWD_GM8_2S_TILES: List[Tuple[int, int, int]] = [ + (16, 256, 32), (32, 128, 32), (128, 32, 32), +] +_BWD_SK_TILES: List[Tuple[int, int, int]] = [ + (16, 16, 32), (16, 32, 64), (32, 16, 64), + (64, 16, 64), (64, 64, 64), (128, 32, 32), +] + +VARIANT_FEATURES: Dict[str, List[FeatureSpec]] = { + "forward": [ + # split_image: small tile subset, compv1/intrawave only + FeatureSpec( + split_image=True, + tile_override=_SPLIT_IMAGE_TILES, + pipeline_override=[("compv1", "intrawave")], + ), + # num_groups_to_merge (restricted to tiles that benefit from merging) + FeatureSpec(num_groups_to_merge=8, tile_override=_FWD_GM_TILES), + FeatureSpec(num_groups_to_merge=16, tile_override=[(64, 16, 16)]), + FeatureSpec(num_groups_to_merge=32, tile_override=[(64, 16, 16)]), + ], + "bwd_data": [ + # num_groups_to_merge=32 wavelet instance for the 256x32x64 tile + FeatureSpec( + num_groups_to_merge=32, + tile_override=[(256, 32, 64)], + pipeline_override=[("wavelet", "intrawave")], + dtype_classes=["half"], + ), + ], + "bwd_weight": [ + # explicit_gemm / two_stage / num_groups_to_merge are half-only: + # the fp32 bwd_weight profiler JSON contains none of these features. + # explicit_gemm only: tiles with tile_k=64 (larger internal GEMM) + FeatureSpec(explicit_gemm=True, tile_override=_BWD_EG_TILES, dtype_classes=["half"]), + # two_stage only + FeatureSpec(two_stage=True, tile_override=_BWD_2S_TILES, dtype_classes=["half"]), + # two_stage + explicit_gemm + FeatureSpec(two_stage=True, explicit_gemm=True, tile_override=_BWD_EG_2S_TILES, dtype_classes=["half"]), + # num_groups_to_merge + two_stage combinations + FeatureSpec(num_groups_to_merge=2, two_stage=True, tile_override=_BWD_GM2_2S_TILES, dtype_classes=["half"]), + FeatureSpec(num_groups_to_merge=4, two_stage=True, tile_override=_BWD_GM4_2S_TILES, dtype_classes=["half"]), + FeatureSpec(num_groups_to_merge=8, two_stage=True, tile_override=_BWD_GM8_2S_TILES, dtype_classes=["half"]), + # basic_async_v1 + num_groups_to_merge=2 + FeatureSpec( + num_groups_to_merge=2, + tile_override=[(16, 32, 64), (16, 64, 64), (64, 128, 64)], + pipeline_override=[("basic_async_v1", "intrawave")], + dtype_classes=["half"], + ), + # StreamK non-persistent + FeatureSpec( + streamk_config=StreamKSpec(strategy="TREE", persistent=False), + tile_override=_BWD_SK_TILES, + pipeline_override=[ + ("compv1", "intrawave"), + ("mem", "intrawave"), + ("basic_async_v1", "intrawave"), + ], + ), + # StreamK persistent + FeatureSpec( + streamk_config=StreamKSpec(strategy="TREE", persistent=True), + tile_override=_BWD_SK_TILES, + pipeline_override=[ + ("compv1", "intrawave"), + ("mem", "intrawave"), + ("basic_async_v1", "intrawave"), + ], + ), + ], +} + +# ============================================================================= +# Pipeline Variant Suffixes (single source of truth — kept for backward compat) +# ============================================================================= +# Empirically verified valid (pipeline, wave_mode, has_dsb, has_si) combinations +# observed in the 2D and 3D bf16 gfx950 benchmark CSVs. 30 entries total per ndim. +# Each tuple: (pipeline, wave_mode, has_dsb, has_si) +# wave_mode: "intrawave" | "interwave" +# has_dsb: 1 if "_dsb" suffix present (double smem buffer), else 0 +# has_si: 1 if "_si" suffix present (store immediate), else 0 +PIPELINE_VARIANTS: List[Tuple[str, str, int, int]] = [ + # basic_v1: both intra/inter × {∅, dsb, si, dsb_si} = 8 combos + ("basic_v1", "intrawave", 0, 0), + ("basic_v1", "intrawave", 1, 0), + ("basic_v1", "intrawave", 0, 1), + ("basic_v1", "intrawave", 1, 1), + ("basic_v1", "interwave", 0, 0), + ("basic_v1", "interwave", 1, 0), + ("basic_v1", "interwave", 0, 1), + ("basic_v1", "interwave", 1, 1), + # compv3: intrawave × {∅, dsb, si, dsb_si} = 4 combos + ("compv3", "intrawave", 0, 0), + ("compv3", "intrawave", 1, 0), + ("compv3", "intrawave", 0, 1), + ("compv3", "intrawave", 1, 1), + # compv4: intrawave × {dsb, dsb_si} only = 2 combos + ("compv4", "intrawave", 1, 0), + ("compv4", "intrawave", 1, 1), + # compv5: intrawave × {∅, dsb, si, dsb_si} = 4 combos + ("compv5", "intrawave", 0, 0), + ("compv5", "intrawave", 1, 0), + ("compv5", "intrawave", 0, 1), + ("compv5", "intrawave", 1, 1), + # compv6: intrawave × {∅, dsb, si, dsb_si} = 4 combos + ("compv6", "intrawave", 0, 0), + ("compv6", "intrawave", 1, 0), + ("compv6", "intrawave", 0, 1), + ("compv6", "intrawave", 1, 1), + # mem: both intra/inter × {∅, dsb, si, dsb_si} = 8 combos + ("mem", "intrawave", 0, 0), + ("mem", "intrawave", 1, 0), + ("mem", "intrawave", 0, 1), + ("mem", "intrawave", 1, 1), + ("mem", "interwave", 0, 0), + ("mem", "interwave", 1, 0), + ("mem", "interwave", 0, 1), + ("mem", "interwave", 1, 1), +] + + +def iter_pipeline_variants(pipelines: List[str] = None): + """Iterate (pipeline, wave_mode, has_dsb, has_si) tuples, optionally filtered. + + Args: + pipelines: optional list of pipeline names to keep. If None, yield all. + """ + if pipelines is None: + for entry in PIPELINE_VARIANTS: + yield entry + return + keep = set(pipelines) + for entry in PIPELINE_VARIANTS: + if entry[0] in keep: + yield entry + + +# Valid pipelines per variant (kept for backward compat; full list) +VARIANT_PIPELINES: Dict[str, List[str]] = { + "forward": [ + "basic_v1", + "mem", + "compv3", + "compv4", + "compv5", + "compv6", + "comp_async", + "basic_async_v1", + ], + "bwd_data": [ + "basic_v1", + "mem", + "compv3", + "compv4", + "compv5", + "compv6", + "comp_async", + "basic_async_v1", + ], + "bwd_weight": [ + "basic_v1", + "mem", + "compv3", + "compv4", + "compv5", + "compv6", + "comp_async", + "basic_async_v1", + ], +} + +# ============================================================================= +# Shared Validation Rules +# ============================================================================= +# These functions are the single source of truth for validation rules +# for convolution code generation. + +# --- Vector size validation --- + + +def is_valid_vector_size(vec: int) -> bool: + """AMD GPUs only support vector widths 1, 2, 4, 8, 16.""" + return vec == 1 or vec % 2 == 0 + + +def check_vectors(vec_a: int, vec_b: int, vec_c: int) -> bool: + """Check all three vector sizes are valid (1 or even).""" + return all(is_valid_vector_size(v) for v in (vec_a, vec_b, vec_c)) + + + +# --- Pipeline-variant restrictions --- + +UNSUPPORTED_VARIANT_PIPELINES = { + "bwd_weight": {"compv5"}, + "bwd_data": {"compv5"}, +} + + +def is_valid_pipeline_for_variant(pipeline: str, variant: str) -> bool: + """Check pipeline is supported for the given conv variant. + + Backward weight and backward data reject compv5 due to transpose_tile2d / + get_length issues. + """ + blocked = UNSUPPORTED_VARIANT_PIPELINES.get(variant, set()) + return pipeline not in blocked + + +# --- Stream-K restrictions --- + + +def is_streamk_valid_for_variant(variant: str) -> bool: + """Stream-K is only supported for backward weight.""" + return variant == "bwd_weight" + + +# ============================================================================= +# Depthwise Convolution Parameter Space +# ============================================================================= + +DEPTHWISE_TILE_SIZES: List[Tuple[int, int]] = [ + (8, 8), (14, 28), (16, 16), (28, 28), (32, 32), +] + +DEPTHWISE_FILTER_SIZES: List[int] = [3, 5] + +DEPTHWISE_STRIDES: List[Tuple[int, int]] = [(1, 1), (2, 2)] + +# Curated depthwise configs matching the JSON profiler set. +# Each tuple: (tile_h, tile_w, filt, str_h, str_w, sub_h, sub_w, nbatch, in_vec, out_vec) +# Padding is derived: pad = (filt - 1) // 2. +# Validated by is_valid_depthwise_config() at module load time. +DEPTHWISE_PARAMS: List[Tuple[int, ...]] = [ + # Filter 3, Stride (1,1) + (8, 8, 3, 1, 1, 2, 2, 8, 2, 2), + (16, 16, 3, 1, 1, 1, 4, 8, 8, 8), + (16, 16, 3, 1, 1, 2, 2, 1, 2, 2), + (28, 28, 3, 1, 1, 4, 4, 1, 8, 8), + (32, 32, 3, 1, 1, 4, 4, 1, 8, 8), + # Filter 3, Stride (2,2) + (14, 28, 3, 2, 2, 2, 4, 1, 8, 8), + (16, 16, 3, 2, 2, 1, 4, 1, 8, 8), + (16, 16, 3, 2, 2, 1, 4, 2, 8, 8), + (16, 16, 3, 2, 2, 2, 2, 1, 2, 2), + (16, 16, 3, 2, 2, 2, 2, 1, 8, 8), + (32, 32, 3, 2, 2, 2, 8, 1, 8, 8), + (32, 32, 3, 2, 2, 4, 4, 1, 4, 4), + (32, 32, 3, 2, 2, 4, 4, 1, 8, 8), + (32, 32, 3, 2, 2, 4, 4, 2, 8, 8), + # Filter 5, Stride (1,1) + (8, 8, 5, 1, 1, 1, 1, 1, 1, 1), + (8, 8, 5, 1, 1, 2, 2, 8, 2, 2), + (16, 16, 5, 1, 1, 1, 4, 1, 8, 8), + (16, 16, 5, 1, 1, 1, 4, 8, 8, 8), + (28, 28, 5, 1, 1, 4, 4, 8, 8, 8), + (32, 32, 5, 1, 1, 4, 4, 4, 8, 8), +] + + +def get_depthwise_configs(): + """Get curated depthwise convolution configurations. + + Returns the profiler config set, with each entry validated by + tile_math.is_valid_depthwise_config(). + + Returns: + List of tile_math.DepthwiseConfig objects. + """ + from .tile_math import DepthwiseConfig, is_valid_depthwise_config + + configs = [] + for params in DEPTHWISE_PARAMS: + th, tw, filt, sh, sw, sub_h, sub_w, nb, iv, ov = params + pad = (filt - 1) // 2 + cfg = DepthwiseConfig(th, tw, filt, sh, sw, pad, pad, nb, sub_h, sub_w, iv, ov) + assert is_valid_depthwise_config(cfg), f"Invalid depthwise config: {params}" + configs.append(cfg) + return configs + + +log = logging.getLogger(__name__) + + +def get_configs( + arch: str, + variants: List, + ndims: List[int], + datatypes: List[str], +) -> List: + """Build all available configs for the "profiler" (JSON-derived) rule set. + + Unified rule-set entry point used by + ``unified_grouped_conv_codegen.get_default_configs``. Iterates over all tile + shapes per (variant, ndim, datatype), selecting wave/warp pairs, vector + sizes, pipelines, and specializations via this module's rule helpers; each + emitted config is tagged with its concrete ``datatype``. + """ + from unified_grouped_conv_codegen import ( + GroupedConvVariant, + GroupedConvTraitConfig, + GroupedConvKernelConfig, + TileConfig, + StreamKConfig, + StreamKReductionStrategy, + DepthwiseConvKernelConfig, + ) + + seen: set = set() + configs: List[Union[GroupedConvKernelConfig, DepthwiseConvKernelConfig]] = [] + + def _add_config(config: "GroupedConvKernelConfig") -> None: + """Deduplicate and add config if arch-valid.""" + if not config.is_valid_for_arch(): + return + key = ( + config.variant, + config.ndim_spatial, + config.tile.tile_m, config.tile.tile_n, config.tile.tile_k, + config.tile.warp_m, config.tile.warp_n, config.tile.warp_k, + config.tile.warp_tile_m, config.tile.warp_tile_n, config.tile.warp_tile_k, + config.trait.pipeline, config.trait.scheduler, config.trait.epilogue, + config.vector_size_a, config.vector_size_b, config.vector_size_c, + config.trait.double_smem_buffer, config.trait.two_stage, + config.trait.explicit_gemm, config.trait.split_image, + config.trait.num_groups_to_merge, config.trait.specialization, + getattr(config.trait.streamk_config, "streamk_enabled", False), + getattr(config.trait.streamk_config, "streamk_persistent", False), + config.datatype, + ) + if key in seen: + return + seen.add(key) + configs.append(config) + + def _make_streamk_config(spec_sk) -> "StreamKConfig": + """Convert a StreamKSpec from this module into a StreamKConfig.""" + return StreamKConfig( + streamk_enabled=True, + strategy=StreamKReductionStrategy.TREE if spec_sk.strategy == "TREE" + else StreamKReductionStrategy.LINEAR, + streamk_persistent=spec_sk.persistent, + ) + + def _emit_configs_for_tile( + tile_m: int, tile_n: int, tile_k: int, + pipelines: List[Tuple[str, str]], + specializations: List[str], + variant, + ndim: int, + datatype: str, + dtype_class: str, + dtype_key: str, + feat: Optional["FeatureSpec"] = None, + ) -> None: + """Emit all valid configs for a single tile shape + pipeline list, for + one concrete datatype. Wave/warp pairs and vec triples are selected for + this dtype only; each emitted config is tagged with ``datatype``.""" + + var_str = { + GroupedConvVariant.FORWARD: "forward", + GroupedConvVariant.BACKWARD_DATA: "bwd_data", + GroupedConvVariant.BACKWARD_WEIGHT: "bwd_weight", + }.get(variant, "forward") + + pairs = get_wave_warp_pairs(tile_m, tile_n, tile_k, var_str, dtype_key, arch) + if not pairs: + return + + # Candidate vec triples for this dtype class (strategies + long-tail + # extras). Gated per (wave, warp) below against tile_math, the authority. + vec_set: set = set() + for strategy in get_vec_strategies(tile_m, tile_n, tile_k, var_str, dtype_class): + vec_set.add(compute_vector_size(strategy, dtype_class)) + for triple in get_extra_vec_triples(tile_m, tile_n, tile_k, var_str, dtype_class): + vec_set.add(triple) + vec_list = sorted(vec_set) + + # bwd_weight wavelet tiles that use legacy warp_tile_k (gfx942 convention) + _bww_legacy = ( + var_str == "bwd_weight" + and (tile_m, tile_n, tile_k) in _BWD_WEIGHT_WAVELET_LEGACY_WARP_K_TILES + ) + + for (wave_m, wave_n, wave_k), (warp_tile_m, warp_tile_n) in pairs: + # Derive warp_tile_k (the MFMA K) for the non-streamk case; this is + # the value used both for the vec gate and for non-streamk configs. + # StreamK configs re-derive it per-config below. + # Some bwd_weight wavelet tiles use the legacy gfx942 formula. + warp_tile_k = compute_warp_tile_k( + dtype_key, warp_tile_m, tile_k, streamk=False, use_legacy=_bww_legacy, + ) + # tile_math gate: a candidate vec triple survives only if it is valid + # for this (tile, wave, warp) under this dtype_key. + tm_valid = get_all_valid_vector_sizes( + tile_m, tile_n, tile_k, + wave_m, wave_n, wave_k, + warp_tile_m, warp_tile_n, warp_tile_k, + dtype_key, + ) + gated_vecs = [] + for triple in vec_list: + if triple in tm_valid: + gated_vecs.append(triple) + else: + log.debug( + "tile_math rejects vec %s for tile=(%d,%d,%d) " + "wave=(%d,%d,%d) warp=(%d,%d,%d)", + triple, tile_m, tile_n, tile_k, + wave_m, wave_n, wave_k, + warp_tile_m, warp_tile_n, warp_tile_k, + ) + + for vec_a, vec_b, vec_c in gated_vecs: + for pipeline, scheduler in pipelines: + # The wavelet pipeline uses its own direct kernel path and + # does not implement the UniversalGemmKernel interface that + # the explicit_gemm path routes through (its operator() takes + # 4 arguments, not the 6 UniversalGemmKernel::RunGemm passes). + # The two are therefore incompatible. + if pipeline == "wavelet" and feat and feat.explicit_gemm: + continue + + # KNOWN LIMITATION (bwd_weight, half precision): + # The interwave pipelines -- "compv1" (runtime BASIC_V1) and + # "mem" (runtime MEMORY) -- produce INCORRECT results for the + # bwd_weight Default specialization when the macro tile is + # split across multiple waves (wave_m * wave_n > 1) in fp16/bf16 + # on grouped convolutions with a small per-group GEMM-M + # (per-group K). Observed failing tiles: 64x64x64 (2,2,1), + # 64x16x64 (2,1,1), 16x32x64 (1,2,1) -- ~50% of the weight + # output (whole groups) comes back zero. + # + # This problems shows up when the CK Tile convolution integration + # tests are executed against the instances generated with "full" rule set. + # Rule set "tests" doesn't create the problematic instances. + + # compv4 forces double_smem_buffer + dsb = (pipeline == "compv4") or (feat.double_smem_buffer if feat else False) + + for spec in specializations: + # Build StreamKConfig + if feat and feat.streamk_config: + sk_cfg = _make_streamk_config(feat.streamk_config) + else: + sk_cfg = StreamKConfig() # disabled by default + + trait = GroupedConvTraitConfig( + pipeline=pipeline, + scheduler=scheduler, + epilogue="cshuffle", + double_smem_buffer=dsb, + pad_m=True, + pad_n=True, + pad_k=True, + two_stage=(feat.two_stage if feat else False), + explicit_gemm=(feat.explicit_gemm if feat else False), + split_image=(feat.split_image if feat else False), + num_groups_to_merge=(feat.num_groups_to_merge if feat else 1), + specialization=spec, + streamk_config=sk_cfg, + ) + + if not trait.is_valid(): + continue + + # Derive warp_tile_k for this config. Hand-written StreamK + # native instances bypass get_k_mfma and carry the legacy + # warp_tile_k, handled inside compute_warp_tile_k. + # Same legacy convention applies to some bwd_weight wavelet tiles. + eff_warp_tile_k = compute_warp_tile_k( + dtype_key, warp_tile_m, tile_k, + streamk=sk_cfg.streamk_enabled, + use_legacy=_bww_legacy and pipeline == "wavelet", + ) + + tile_cfg = TileConfig( + tile_m=tile_m, + tile_n=tile_n, + tile_k=tile_k, + warp_m=wave_m, + warp_n=wave_n, + warp_k=wave_k, + warp_tile_m=warp_tile_m, + warp_tile_n=warp_tile_n, + warp_tile_k=eff_warp_tile_k, + ) + + if not tile_cfg.is_valid(): + continue + + config = GroupedConvKernelConfig( + tile=tile_cfg, + trait=trait, + variant=variant, + ndim_spatial=ndim, + arch=arch, + vector_size_a=vec_a, + vector_size_b=vec_b, + vector_size_c=vec_c, + datatype=datatype, + ) + _add_config(config) + + for variant in variants: + # FORWARD_DEPTHWISE has no GEMM tile loop; its configs are emitted by the + # depthwise block below (tied to FORWARD). Skip the GEMM loop for it. + variant_str = { + GroupedConvVariant.FORWARD: "forward", + GroupedConvVariant.BACKWARD_DATA: "bwd_data", + GroupedConvVariant.BACKWARD_WEIGHT: "bwd_weight", + GroupedConvVariant.FORWARD_DEPTHWISE: None, + }.get(variant) + + if variant_str is not None: + features = VARIANT_FEATURES.get(variant_str, []) + + for ndim in ndims: + for datatype in datatypes: + dtype_key = DTYPE_TO_DTYPE_KEY.get(datatype) + if dtype_key is None: + continue + dclass = "float" if datatype == "fp32" else "half" + + # Tiles for this exact (variant, ndim, dtype). + base_tiles = get_tiles(variant_str, ndim, datatype) + + # --- Base configs (no feature flags) --- + for tile_m, tile_n, tile_k in base_tiles: + tile_pipelines = get_pipelines_for_tile( + tile_m, tile_n, tile_k, variant_str, dclass + ) + tile_specs = get_specs_for_tile(tile_m, tile_n, tile_k, variant_str) + _emit_configs_for_tile( + tile_m, tile_n, tile_k, + tile_pipelines, tile_specs, + variant, ndim, + datatype, dclass, dtype_key, + feat=None, + ) + + # --- Feature-flag configs --- + for feat in features: + if feat.dtype_classes is not None and dclass not in feat.dtype_classes: + continue + if feat.ndims is not None and ndim not in feat.ndims: + continue + feat_tiles = feat.tile_override if feat.tile_override is not None else base_tiles + for tile_m, tile_n, tile_k in feat_tiles: + if feat.pipeline_override is not None: + feat_pipes = feat.pipeline_override + else: + feat_pipes = get_pipelines_for_tile( + tile_m, tile_n, tile_k, variant_str, dclass + ) + tile_specs = get_specs_for_tile(tile_m, tile_n, tile_k, variant_str) + _emit_configs_for_tile( + tile_m, tile_n, tile_k, + feat_pipes, tile_specs, + variant, ndim, + datatype, dclass, dtype_key, + feat=feat, + ) + + # --- Depthwise configs (forward only, 2D only) --- + if variant == GroupedConvVariant.FORWARD and 2 in ndims: + dw_seen: set = set() + for dw_cfg in get_depthwise_configs(): + for dt in (datatypes or ["fp16"]): + dw_key = (dw_cfg.tile_h, dw_cfg.tile_w, dw_cfg.filt, + dw_cfg.str_h, dw_cfg.str_w, dw_cfg.pad_h, + dw_cfg.pad_w, dw_cfg.nbatch, dw_cfg.sub_h, + dw_cfg.sub_w, dw_cfg.in_vec, dw_cfg.out_vec, dt) + if dw_key in dw_seen: + continue + dw_seen.add(dw_key) + configs.append(DepthwiseConvKernelConfig( + tile_h=dw_cfg.tile_h, tile_w=dw_cfg.tile_w, + filt=dw_cfg.filt, + str_h=dw_cfg.str_h, str_w=dw_cfg.str_w, + pad_h=dw_cfg.pad_h, pad_w=dw_cfg.pad_w, + nbatch=dw_cfg.nbatch, + sub_h=dw_cfg.sub_h, sub_w=dw_cfg.sub_w, + in_vec=dw_cfg.in_vec, out_vec=dw_cfg.out_vec, + ndim_spatial=2, + arch=arch, + layout="ngchw", + datatype=dt, + )) + + return configs + + +if __name__ == "__main__": + all_tiles = sorted( + set(get_tiles_for_variant("forward")) + | set(get_tiles_for_variant("bwd_data")) + | set(get_tiles_for_variant("bwd_weight")) + ) + print(f"Total unique tiles: {len(all_tiles)}") + for variant in ("forward", "bwd_data", "bwd_weight"): + print(f" {variant}: {len(get_tiles_for_variant(variant))}") diff --git a/dispatcher/codegen/grouped_conv/grouped_config_rules_full_tests.py b/dispatcher/codegen/grouped_conv/grouped_config_rules_full_tests.py new file mode 100644 index 00000000000..dc7c2befac7 --- /dev/null +++ b/dispatcher/codegen/grouped_conv/grouped_config_rules_full_tests.py @@ -0,0 +1,173 @@ +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +from typing import List + +def _classify_config(cfg) -> str: + """Classify a config into a feature category for stratified test selection. + + The datatype tag is folded into the category so that the stratified subset keeps + at least one config per datatype per feature category. + """ + from unified_grouped_conv_codegen import ( + DepthwiseConvKernelConfig, + ) + dt = getattr(cfg, "datatype", None) or "fp16" + if isinstance(cfg, DepthwiseConvKernelConfig): + return f"depthwise:{dt}" + tr = cfg.trait + if getattr(tr.streamk_config, "streamk_enabled", False): + return f"streamk:{dt}" + if tr.split_image: + return f"split_image:{dt}" + if tr.num_groups_to_merge > 1: + return f"merged_groups:{dt}" + if tr.two_stage: + return f"two_stage:{dt}" + if tr.explicit_gemm: + return f"explicit_gemm:{dt}" + return f"regular:{dt}" + + +def _select_test_configs(configs) -> List: + """Select ~20% of configs with stratified sampling for test builds. + + Guarantees: + 1. At least 1 config from each feature category. + 2. Every (pipeline, scheduler) combo per variant is represented. + + Selection: every 5th config (indices 4, 9, 14, ...) from each category, + matching awk 'NR % 5 == 0' convention. + """ + from collections import defaultdict + from unified_grouped_conv_codegen import ( + GroupedConvKernelConfig + ) + + # Config dataclasses are mutable (unhashable), so membership is tracked by + # position in the original list rather than id() (which is only valid while + # objects stay alive) or a content key (which would require hashability). + configs = list(configs) + + categories = defaultdict(list) # category -> list of original indices + for idx, cfg in enumerate(configs): + categories[_classify_config(cfg)].append(idx) + + selected = set() # original indices + + # Take ~20% from each category (minimum 1) + for cat, cat_indices in categories.items(): + cat_selected = False + for rank, idx in enumerate(cat_indices): + if (rank + 1) % 5 == 0: + selected.add(idx) + cat_selected = True + # Ensure minimum 1 per category + if not cat_selected and cat_indices: + selected.add(cat_indices[0]) + + # Ensure pipeline/scheduler coverage per (variant, datatype) (GEMM only). + gemm_indices = [ + i for i, c in enumerate(configs) + if isinstance(c, GroupedConvKernelConfig) + ] + variant_combos = defaultdict(set) + variant_covered = defaultdict(set) + for i in gemm_indices: + c = configs[i] + vkey = (c.variant, getattr(c, "datatype", None) or "fp16") + combo = (c.trait.pipeline, c.trait.scheduler) + variant_combos[vkey].add(combo) + if i in selected: + variant_covered[vkey].add(combo) + + for vkey, required in variant_combos.items(): + variant, dt = vkey + missing = required - variant_covered[vkey] + for combo in missing: + for i in gemm_indices: + c = configs[i] + if c.variant == variant and \ + (getattr(c, "datatype", None) or "fp16") == dt and \ + (c.trait.pipeline, c.trait.scheduler) == combo: + selected.add(i) + break + + return [configs[i] for i in sorted(selected)] + +def get_configs( + arch: str, + variants: List, + ndims: List[int], + datatypes: List[str] + ) -> List: + """Build all available configs for the "full-tests" rule set. + + Unified rule-set entry point used by + ``unified_grouped_conv_codegen.get_default_configs``. + Trims down the "full" config set using the rules defined in ``_select_test_configs``. + """ + + from .grouped_config_rules_full import get_configs as get_full_configs + + all_configs = get_full_configs(arch, variants, ndims, datatypes) + test_configs = _select_test_configs(all_configs) + return test_configs + + +def _select_tiny_configs(configs, min_count: int = 10) -> List: + """Select a minimal set of configs for quick development builds. + + Uses the same category mechanism as ``_select_test_configs`` + (``_classify_config`` folds the feature category and datatype together, so a + represented category also represents its variant), additionally split by + spatial dimensionality so both 2D and 3D kernels are represented, but + maximally trimmed down: pick a single config per (category, ndim), then + round-robin fill up to ``min_count`` so the set is at least ``min_count`` + configs (or all available, if fewer). Every (feature category, ndim) present + in ``configs`` is represented. + """ + from collections import OrderedDict + + by_category: "OrderedDict[tuple, list]" = OrderedDict() + for cfg in configs: + key = (_classify_config(cfg), getattr(cfg, "ndim_spatial", None)) + by_category.setdefault(key, []).append(cfg) + + selected: List = [] + # One per category first so every category (and thus variant) is represented. + for cfgs in by_category.values(): + if cfgs: + selected.append(cfgs[0]) + + # Fill up to min_count round-robin across categories. + idx = 1 + while len(selected) < min_count: + added = False + for cfgs in by_category.values(): + if idx < len(cfgs): + selected.append(cfgs[idx]) + added = True + if len(selected) >= min_count: + break + if not added: + break # all configs exhausted + idx += 1 + + return selected + + +def get_tiny_configs( + arch: str, + variants: List, + ndims: List[int], + datatypes: List[str], +) -> List: + """Build the "tiny" rule set: a minimal subset of the "full-tests" rule set. + + Returns at least 10 configs (or all available, if fewer), with every feature + category represented (same category mechanism as the "full-tests" rule set, but + maximally trimmed). Intended for fast development/iteration builds. + """ + test_configs = get_configs(arch, variants, ndims, datatypes) + return _select_tiny_configs(test_configs) \ No newline at end of file diff --git a/dispatcher/codegen/grouped_conv/tile_math.py b/dispatcher/codegen/grouped_conv/tile_math.py new file mode 100644 index 00000000000..2ca818cc496 --- /dev/null +++ b/dispatcher/codegen/grouped_conv/tile_math.py @@ -0,0 +1,563 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +Mathematical functions for deriving valid tile/warp/vector configurations. + +Key source files this is derived from: + - block_universal_gemm_as_bs_cr.hpp (tile divisibility by warps) + - gemm_pipeline_agmem_bgmem_creg_v1_default_policy.hpp (vec/LDS formulas) + - conv_algorithm_limits.hpp (VMEM/LDS vector size validity) + - warp_gemm_dispatcher.hpp (XDL warp tile shapes per dtype) + - arch_specs_generated.py (arch-specific wave/warp-tile combos) +""" + +import sys +from dataclasses import dataclass +from pathlib import Path +from typing import List, Optional, Set, Tuple + +# --------------------------------------------------------------------------- +# Path setup — allow running from any directory +# --------------------------------------------------------------------------- +_CODEGEN_DIR = Path(__file__).resolve().parent.parent +if str(_CODEGEN_DIR) not in sys.path: + sys.path.insert(0, str(_CODEGEN_DIR)) + +from arch_specs_generated import ( + WARP_SUPPORTED_COMBINATIONS, # [wave_m, wave_n, wave_k] per arch + WARP_TILE_SUPPORTED_COMBINATIONS, # [warp_m, warp_n, warp_k] per arch+dtype + ELEMENT_SIZE_MAP, # bytes per element per dtype string +) + +# Warp size on AMD GPUs +WARP_SIZE = 64 + +# --------------------------------------------------------------------------- +# Internal helpers +# --------------------------------------------------------------------------- + +def _pos_divisors(n: int) -> List[int]: + """Return all positive divisors of n in ascending order.""" + if n <= 0: + return [] + divs = [] + i = 1 + while i * i <= n: + if n % i == 0: + divs.append(i) + if i != n // i: + divs.append(n // i) + i += 1 + return sorted(divs) + + +def _lds_valid(vec: int, sizeof_dtype: float) -> bool: + """LDS vector load/store must be a power-of-2 multiple of 8 bits, up to 256 bits. + + Some bwd_data configs use larger global-load vectors (e.g. fp32×8=256 bits) + where the global load is split across DWORD pairs rather than going through LDS. + We therefore accept up to 256 bits and require the width to be a power of 2 in bytes. + """ + bits = vec * sizeof_dtype * 8 + # Must be positive, a power of 2 in bit-width, and at most 256 bits + if bits <= 0 or bits > 256: + return False + # Check power of 2 + b = int(bits) + return b > 0 and (b & (b - 1)) == 0 + + +def _pipeline_wave_valid( + wave_m: int, wave_n: int, wave_k: int, + warp_tile_m: int, warp_tile_n: int, warp_tile_k: int, + pipeline: Optional[str], +) -> bool: + """Return True if this wave/warp combo is valid for the given pipeline. + + Pipeline-specific constraints derived from static asserts in: + - gemm_pipeline_ag_bg_cr_comp_async_eight_waves_policy.hpp + (NWarps==2, WarpTile::at(I1)==16 for basic_async_v1 eight-wave) + - TDM pipeline (BlockSize == warp_size * 4, WarpTile M=N=32) + """ + if pipeline is None: + return True + + p = pipeline.lower() + + if p == "basic_async_v1": + # Eight-wave async: NWarps must be 2, warp_tile_n must be 16 + return wave_n == 2 and warp_tile_n == 16 + + if p in ("tdm", "tdmv2"): + # TDM requires exactly 4 waves and 32x32 warp tile + return (wave_m * wave_n * wave_k == 4 + and warp_tile_m == 32 and warp_tile_n == 32) + + # All other pipelines (compv1..v6, mem, comp_async, basic_v1, etc.): no constraint + return True + + +def _deduplicate(pairs: List[Tuple[Tuple, Tuple]]) -> List[Tuple[Tuple, Tuple]]: + """Remove duplicate (wave, warp_tile) pairs while preserving order.""" + return list(dict.fromkeys(pairs)) + + +# --------------------------------------------------------------------------- +# Public API +# --------------------------------------------------------------------------- + +def get_valid_wave_warp_pairs( + tile_m: int, + tile_n: int, + tile_k: int, + dtype_key: str, + arch: str = "gfx942", + pipeline: Optional[str] = None, +) -> List[Tuple[Tuple[int, int, int], Tuple[int, int, int]]]: + """Return all valid ((wave_m, wave_n, wave_k), (warp_tile_m, warp_tile_n, warp_tile_k)) pairs. + + Derived from the static assert in block_universal_gemm_as_bs_cr.hpp: + MIterPerWarp * MWarp * WarpGemm::kM == MPerBlock + NIterPerWarp * NWarp * WarpGemm::kN == NPerBlock + + which means: tile_m == wave_m * warp_tile_m * iter_m (iter_m >= 1) + tile_n == wave_n * warp_tile_n * iter_n (iter_n >= 1) + + Args: + tile_m, tile_n, tile_k: block tile dimensions + dtype_key: e.g. "bf16_bf16_fp32", "fp32_fp32_fp32" + arch: GPU architecture string, default "gfx942" + pipeline: optional pipeline name to apply pipeline-specific constraints + + Returns: + List of ((wave_m, wave_n, wave_k), (warp_tile_m, warp_tile_n, warp_tile_k)) tuples. + Each pair is structurally valid for the given arch and pipeline. + """ + supported_wave_combos: Set[Tuple[int, int, int]] = { + tuple(c) for c in WARP_SUPPORTED_COMBINATIONS.get(arch, []) + } + warp_tile_shapes: List[List[int]] = ( + WARP_TILE_SUPPORTED_COMBINATIONS + .get(arch, {}) + .get(dtype_key, []) + ) + + results: List[Tuple[Tuple, Tuple]] = [] + + for wt in warp_tile_shapes: + warp_m, warp_n, warp_k = wt[0], wt[1], wt[2] + + # Tile must be divisible by the warp tile in M and N + if tile_m % warp_m != 0 or tile_n % warp_n != 0: + continue + + # Enumerate all integer (iter_m, iter_n) >= 1 such that the block is tiled exactly + for iter_m in _pos_divisors(tile_m // warp_m): + wave_m = tile_m // (warp_m * iter_m) + for iter_n in _pos_divisors(tile_n // warp_n): + wave_n = tile_n // (warp_n * iter_n) + + # Normal case: wave_k = 1 + if (wave_m, wave_n, 1) in supported_wave_combos: + if _pipeline_wave_valid(wave_m, wave_n, 1, warp_m, warp_n, warp_k, pipeline): + results.append(((wave_m, wave_n, 1), (warp_m, warp_n, warp_k))) + + # Special case: wave_k = 2 + # Only a small number of tiles use this (e.g. (128,32,32) with warp=(32,32,8)). + # Supported on gfx942/gfx950 via the [2,1,2] wave combo. + if (wave_m, wave_n, 2) in supported_wave_combos: + if _pipeline_wave_valid(wave_m, wave_n, 2, warp_m, warp_n, warp_k, pipeline): + results.append(((wave_m, wave_n, 2), (warp_m, warp_n, warp_k))) + + return _deduplicate(results) + + +def get_valid_vec_sizes( + tile_m: int, + tile_n: int, + tile_k: int, + wave_m: int, + wave_n: int, + wave_k: int, + warp_tile_m: int, + warp_tile_n: int, + warp_tile_k: int, + dtype_key: str, + pipeline: Optional[str] = None, +) -> List[Tuple[int, int, int]]: + """Return all valid (vec_a, vec_b, vec_c) triples for a fully-specified config. + + The thread-pixel budget formula: + block_size = WARP_SIZE * wave_m * wave_n * wave_k + pixels_a = tile_m * tile_k / block_size (elements per thread, A tile) + pixels_b = tile_n * tile_k / block_size (elements per thread, B tile) + + Valid vec_a/vec_b must be compatible with their respective pixel budget and + satisfy VMEM/LDS hardware constraints. Compatibility means either the + vector divides the per-thread pixel budget (v divides pixels) OR the vector + is an exact multiple of it (pixels divides v) — in the latter case a single + wide load simply decomposes into v/pixels sub-loads, which is valid on + hardware (observed for asymmetric small-pixel tiles). vec_c is constrained + by the XDL output shuffle: tile_n must be divisible by vec_c. + + Args: + tile_m, tile_n, tile_k: block tile dimensions + wave_m, wave_n, wave_k: wave counts + warp_tile_m, warp_tile_n, warp_tile_k: XDL warp tile dimensions + dtype_key: e.g. "bf16_bf16_fp32" + pipeline: optional, currently unused + + Returns: + Sorted list of (vec_a, vec_b, vec_c) tuples. + """ + dtype_a = dtype_key.split("_")[0] + dtype_b = dtype_key.split("_")[1] + sizeof_a = float(ELEMENT_SIZE_MAP.get(dtype_a, 2)) # bytes per A element + + # vec_b / vec_c reuse sizeof_a, so this is only valid when A and B share an + # element type (the C output element type is assumed to match the input). + # The third field is the accumulator (fp32/int32), so it is intentionally + # not compared here. + if dtype_a != dtype_b: + raise ValueError( + f"get_valid_vec_sizes assumes A and B share an element type, got {dtype_key}" + ) + + block_size = WARP_SIZE * wave_m * wave_n * wave_k + + if block_size == 0 or tile_m * tile_k % block_size != 0 or tile_n * tile_k % block_size != 0: + return [] + + pixels_a = (tile_m * tile_k) // block_size + pixels_b = (tile_n * tile_k) // block_size + + # Maximum vector width per element type. + # Standard VMEM load limit is 16 bytes (128 bits), which gives: + # fp32 (4 bytes) -> 4 elements; bf16/fp16 (2 bytes) -> 8; fp8 (1 byte) -> 16 + # However, some bwd_data configurations use vec_a=8 for fp32 (32-byte loads via + # 2×16-byte split), which compiles and runs on hardware. To avoid false negatives + # the cap is relaxed to 16 bytes × 2 = the hardware dword-per-lane pair limit. + # The LDS validity check below enforces the finer-grained hardware constraint. + max_vec_ab = max(1, int(32 // sizeof_a)) # 2× standard VMEM width + + # Output vec_c: relaxed to the same 32-byte (2× VMEM) ceiling as vec_a/vec_b. + # The finer-grained _lds_valid check below still enforces the <=256-bit + # hardware ceiling, so e.g. bf16 vec_c stays <= 16. This admits fp32 vec_c=8 + # observed in the profiler configs. + max_vec_c = max(1, int(32 // sizeof_a)) + + # A vector width is compatible with the per-thread pixel budget if it either + # divides the budget or is an exact multiple of it (the wide load decomposes + # into v/pixels sub-loads). + valid_a = [ + v for v in [1, 2, 4, 8, 16] + if v <= max_vec_ab + and (pixels_a % v == 0 or v % pixels_a == 0) + and _lds_valid(v, sizeof_a) + ] + + valid_b = [ + v for v in [1, 2, 4, 8, 16] + if v <= max_vec_ab + and (pixels_b % v == 0 or v % pixels_b == 0) + and _lds_valid(v, sizeof_a) + ] + + # vec_c constraint: XDL accumulator is laid out in N-major tiles of size warp_tile_n. + # The output shuffle requires tile_n divisible by (wave_n * warp_tile_n * vec_c). + # vec_c constraint: the C accumulator is stored contiguously along N per thread. + # The output shuffle in the XDL block gemm only requires tile_n to be divisible + # by vec_c (not by wave_n * warp_tile_n * vec_c as the input tiles). + # thread_cluster_dims[3] = 1 because each thread writes one N-element per shuffle step; + # the n_xdl_per_wave repeats are handled by the outer loop, not the vector width. + valid_c = [ + v for v in [1, 2, 4, 8, 16] + if v <= max_vec_c + and tile_n % v == 0 + and _lds_valid(v, sizeof_a) + ] + + return sorted({(va, vb, vc) for va in valid_a for vb in valid_b for vc in valid_c}) + + +def get_vec_sizes_for_wave_warp( + tile_m: int, + tile_n: int, + tile_k: int, + warp_tile_k: int, + dtype_key: str, + arch: str = "gfx942", + pipeline: Optional[str] = None, +) -> List[Tuple[int, int, int]]: + """Return union of valid (vec_a, vec_b, vec_c) across all wave/warp pairs with given warp_tile_k. + + Convenience wrapper matching the _TILE_WTILK_TO_VECS key signature: + key = (tile_m, tile_n, tile_k, warp_tile_k) + + This takes the union over all valid wave/warp pairs whose warp_tile_k matches, + so the result is a superset of what any single wave/warp pair would produce. + + Args: + tile_m, tile_n, tile_k: block tile dimensions + warp_tile_k: XDL warp tile K dimension (selects dtype variant, e.g. 8 or 16 for bf16) + dtype_key: e.g. "bf16_bf16_fp32" + arch: GPU architecture string + pipeline: optional pipeline constraint + + Returns: + Sorted list of (vec_a, vec_b, vec_c) tuples (union across matching wave/warp pairs). + """ + results: Set[Tuple[int, int, int]] = set() + + for (wave_m, wave_n, wave_k), (wt_m, wt_n, wt_k) in get_valid_wave_warp_pairs( + tile_m, tile_n, tile_k, dtype_key, arch=arch, pipeline=pipeline + ): + if wt_k == warp_tile_k: + vecs = get_valid_vec_sizes( + tile_m, tile_n, tile_k, + wave_m, wave_n, wave_k, + wt_m, wt_n, wt_k, + dtype_key, pipeline=pipeline, + ) + results.update(vecs) + + return sorted(results) + + +# --------------------------------------------------------------------------- +# Dtype key inference helpers (for test infrastructure) +# --------------------------------------------------------------------------- + +def dtype_keys_for_warp_tile_k(warp_tile_k: int) -> List[str]: + """Infer plausible dtype_keys from warp_tile_k. + + Used by tests to map _TILE_WTILK_TO_VECS keys (which encode warp_tile_k + but not dtype explicitly) back to dtype_key strings. + + warp_tile_k mapping (from warp_gemm_dispatcher.hpp): + fp32_fp32_fp32 : warp_tile_k ∈ {4, 8, 16} + bf16_bf16_fp32 : warp_tile_k ∈ {8, 16, 32} (gfx942: {8,16}; gfx950: {8,16,32}) + fp16_fp16_fp32 : warp_tile_k ∈ {8, 16, 32} + fp8_fp8_fp32 : warp_tile_k ∈ {16, 32, 64, 128} + """ + candidates = [] + if warp_tile_k in {4, 8, 16}: + candidates.append("fp32_fp32_fp32") + if warp_tile_k in {8, 16, 32}: + candidates.append("bf16_bf16_fp32") + candidates.append("fp16_fp16_fp32") + if warp_tile_k in {16, 32, 64, 128}: + candidates.append("fp8_fp8_fp32") + return candidates + + +# --------------------------------------------------------------------------- +# Depthwise Convolution Configuration +# --------------------------------------------------------------------------- + + +def _ceil_div(a: int, b: int) -> int: + """Ceiling integer division.""" + return (a + b - 1) // b + + +def _ceil_to_multiple(val: int, multiple: int) -> int: + """Round up val to the nearest multiple.""" + if multiple <= 0: + return val + return _ceil_div(val, multiple) * multiple + + +@dataclass(frozen=True) +class DepthwiseConfig: + """Configuration for a depthwise convolution kernel tile.""" + + tile_h: int + tile_w: int + filt: int + str_h: int + str_w: int + pad_h: int + pad_w: int + nbatch: int + sub_h: int + sub_w: int + in_vec: int + out_vec: int + + +def is_valid_depthwise_config(cfg: DepthwiseConfig, dtype_size: int = 2) -> bool: + """Check all depthwise pipeline constraints for a config. + + Implements the 19 constraints from the depthwise pipeline's static_asserts + and IsDepthwiseArgumentSupported checks. Constraints 1-4, 10-12, 18-19 are + auto-satisfied by construction (fixed BlockSize=64, Dilation=1, square odd + filter, same-padding, and the LDS stride formula). + + Args: + cfg: Depthwise configuration to validate. + dtype_size: Bytes per element (2 for fp16/bf16, 4 for fp32). + + Returns: + True if all constraints are satisfied. + """ + # Constraint 5: filter must be odd + if cfg.filt < 1 or cfg.filt % 2 != 1: + return False + + # Constraint 6: in_vec and out_vec must be positive powers of 2 + for v in (cfg.in_vec, cfg.out_vec): + if v <= 0 or (v & (v - 1)) != 0: + return False + + # Constraint 7: SubTileH <= TileOutH, SubTileW <= TileOutW + if cfg.sub_h <= 0 or cfg.sub_w <= 0: + return False + if cfg.sub_h > cfg.tile_h or cfg.sub_w > cfg.tile_w: + return False + + # Constraint 9: StrideW == 1 || StrideW % 2 == 0 + if cfg.str_w != 1 and cfg.str_w % 2 != 0: + return False + + # Constraint 15: PadW > 0 + if cfg.pad_w <= 0: + return False + + # Derived values + tile_in_w = cfg.tile_w * cfg.str_w + lds_tile_h = cfg.tile_h * cfg.str_h + 2 * cfg.pad_h + lds_tile_w = tile_in_w + 2 * cfg.pad_w + + h_repeats = _ceil_div(cfg.tile_h, cfg.sub_h) + w_repeats = _ceil_div(cfg.tile_w, cfg.sub_w) + total_subtiles = h_repeats * w_repeats + + # Constraint 8: TotalSubTiles <= 64 (BlockSize) + if total_subtiles > 64: + return False + + tile_per_wave = 64 // total_subtiles + if tile_per_wave == 0: + return False + + # Constraint 13: NBatch % TilePerWave == 0 + if cfg.nbatch <= 0 or cfg.nbatch % tile_per_wave != 0: + return False + + in_vec_internal = min(cfg.in_vec, 4) + + # Constraint 14: SubTileW * StrideW % InVecInternal == 0 + if (cfg.sub_w * cfg.str_w) % in_vec_internal != 0: + return False + + # LDS stride construction (constraints 10-12 are auto-satisfied) + lds_stride_base = _ceil_to_multiple(lds_tile_w, cfg.in_vec) + lds_stride_min = lds_tile_w + cfg.pad_w + lds_stride = max(lds_stride_base, + _ceil_to_multiple(lds_stride_min, in_vec_internal)) + + # Constraint 16: ceil(LdsTileW / InVec) <= 64 + if _ceil_div(lds_tile_w, cfg.in_vec) > 64: + return False + + # Constraint 17: SmemSize <= 65536 bytes + lds_tile_size = lds_tile_h * lds_stride + smem_size = lds_tile_size * tile_per_wave * dtype_size + if smem_size > 65536: + return False + + return True + + +def get_valid_depthwise_configs( + tile_sizes: List[Tuple[int, int]], + filter_sizes: List[int], + strides: List[Tuple[int, int]], + block_size: int = 64, + dtype_size: int = 2, +) -> List[DepthwiseConfig]: + """Generate all valid depthwise configs from parameter space. + + For each combination of tile, filter, and stride, enumerates valid + sub-tile, batch, and vector configurations. Padding is derived from + filter size as standard "same" padding: pad = (filt - 1) // 2. + + Args: + tile_sizes: List of (tile_h, tile_w) output tile dimensions. + filter_sizes: List of square filter sizes (must be odd). + strides: List of (stride_h, stride_w) pairs. + block_size: Thread block size (default 64). + dtype_size: Bytes per element (default 2 for fp16/bf16). + + Returns: + List of valid DepthwiseConfig objects (deduplicated). + """ + configs: List[DepthwiseConfig] = [] + seen: Set[DepthwiseConfig] = set() + vec_values = [1, 2, 4, 8] + + for tile_h, tile_w in tile_sizes: + # Sub-tile candidates: powers of 2 + divisors of tile dimension + sub_h_set: Set[int] = set() + sub_w_set: Set[int] = set() + v = 1 + while v <= tile_h: + sub_h_set.add(v) + v *= 2 + for d in _pos_divisors(tile_h): + sub_h_set.add(d) + v = 1 + while v <= tile_w: + sub_w_set.add(v) + v *= 2 + for d in _pos_divisors(tile_w): + sub_w_set.add(d) + + sub_h_list = sorted(sub_h_set) + sub_w_list = sorted(sub_w_set) + + for filt in filter_sizes: + if filt % 2 != 1: + continue + pad = (filt - 1) // 2 + + for str_h, str_w in strides: + for sub_h in sub_h_list: + for sub_w in sub_w_list: + # Early prune on total sub-tiles + h_reps = _ceil_div(tile_h, sub_h) + w_reps = _ceil_div(tile_w, sub_w) + total_st = h_reps * w_reps + if total_st > block_size: + continue + + tile_per_wave = block_size // total_st + if tile_per_wave == 0: + continue + + # Enumerate nbatch (powers of 2, divisible by tile_per_wave) + nb = 1 + while nb <= 128: + if nb % tile_per_wave == 0: + for in_vec in vec_values: + for out_vec in vec_values: + cfg = DepthwiseConfig( + tile_h=tile_h, tile_w=tile_w, + filt=filt, + str_h=str_h, str_w=str_w, + pad_h=pad, pad_w=pad, + nbatch=nb, + sub_h=sub_h, sub_w=sub_w, + in_vec=in_vec, out_vec=out_vec, + ) + if cfg not in seen and \ + is_valid_depthwise_config(cfg, dtype_size): + seen.add(cfg) + configs.append(cfg) + nb *= 2 + + return configs diff --git a/dispatcher/codegen/unified_gemm_codegen.py b/dispatcher/codegen/unified_gemm_codegen.py index c0fb08aa443..e93c212d491 100755 --- a/dispatcher/codegen/unified_gemm_codegen.py +++ b/dispatcher/codegen/unified_gemm_codegen.py @@ -187,6 +187,10 @@ def is_preshuffle_config_valid( log = logging.getLogger(__name__) +def _is_power_of_two(x: int) -> bool: + return x > 0 and (x & (x - 1)) == 0 + + # ============================================================================ # Configuration and Data Structures # ============================================================================ @@ -198,6 +202,23 @@ class GemmVariant(Enum): STANDARD = "standard" PRESHUFFLE = "preshuffle" MULTI_D = "multi_d" + MULTI_ABD = "multi_abd" + GROUPED = "grouped" + # Stream-K. COVERAGE LIMITATION: the dispatcher does NOT yet emit the full + # Old-TE Stream-K tile surface. The kernels generated here are driven by the + # tile list passed to this codegen, which is narrower than tile_engine's: + # measured per layout, e.g. fp16/bf16 rcr TE=180 vs DISP=73 tiles (124 TE-only, + # 17 DISP-only); ccr TE=144 vs DISP=73; fp8/bf8 closer (rcr TE=296 vs DISP=232) + # but still short. TE-vs-DISP numeric+perf parity is therefore validated + # per matched tile config, NOT over the whole TE tile space -- "functional + # equivalence" should be read with that scope. Closing the gap means feeding + # the missing TE tiles into the tile list (the codegen handles them); the + # divergent DISP-only tiles are configs TE does not enumerate at all. + # NOTE: this limitation is inherent only to driving the codegen standalone. + # When the bridge is implemented on top of this codegen, the tile list is + # supplied by Tile-Engine directly, so the emitted Stream-K surface matches + # the full Old-TE tile space by construction and the gap closes. + STREAM_K = "stream_k" # TileConfig imported from codegen_common @@ -223,6 +244,18 @@ class KernelConfig: elementwise_op: str = "PassThrough" num_d_tensors: int = 0 d_layout: str = "r" # Layout for D tensors (r=row, c=col) - same for all D tensors + # Stream-K reduction strategy: "atomic" (partials atomic-add into C), + # "linear", or "tree" (partials accumulate through a device workspace). + reduction_strategy: str = "atomic" + + # Multi-ABD variant: arrays of A/B tensors and per-group element-wise ops. + # These are behavior-affecting and MUST participate in key_name() so distinct + # tensor counts / elementwise ops never alias to the same kernel. + num_a_tensors: int = 1 + num_b_tensors: int = 1 + a_elementwise_op: str = "PassThrough" + b_elementwise_op: str = "PassThrough" + cde_elementwise_op: str = "PassThrough" # Fixed parameters block_size: int = 256 @@ -285,6 +318,22 @@ def key_name(self, datatype: str, layout: str) -> str: parts.append(f"nd{self.num_d_tensors}") parts.append(f"dly_{self.d_layout}") + # Multi-ABD variant: include per-group tensor counts, all three + # element-wise ops, and the D layout. Every one of these changes the + # generated kernel's types, so they must be in the unique key. + if self.variant == GemmVariant.MULTI_ABD: + parts.append(f"na{self.num_a_tensors}") + parts.append(f"nb{self.num_b_tensors}") + parts.append(f"nd{self.num_d_tensors}") + parts.append(f"aew_{self.a_elementwise_op}") + parts.append(f"bew_{self.b_elementwise_op}") + parts.append(f"cdew_{self.cde_elementwise_op}") + parts.append(f"dly_{self.d_layout}") + # Stream-K variant: reduction strategy distinguishes otherwise-identical + # kernels (each strategy is a separate compiled binary). + if self.variant == GemmVariant.STREAM_K: + parts.append(f"redux_{self.reduction_strategy}") + # Occupancy parameters (only if non-default) if self.num_wave_groups != 1: parts.append(f"wg{self.num_wave_groups}") @@ -320,8 +369,10 @@ def generate(config: KernelConfig, datatype: str, layout: str) -> str: t = config.tile tr = config.trait - # For multi-d, use 4-char layout (abcd), otherwise use 3-char layout (abc) - if config.variant == GemmVariant.MULTI_D: + # For multi-d / multi-abd, use 4-char layout (abcd), otherwise 3-char (abc). + # For multi-abd the 4th char is the D layout (A,B,E,D convention); the + # incoming ``layout`` is the 3-char A,B,E slice. + if config.variant in (GemmVariant.MULTI_D, GemmVariant.MULTI_ABD): full_layout = layout + config.d_layout # e.g., "rcr" + "r" = "rcrr" else: full_layout = layout @@ -340,6 +391,23 @@ def generate(config: KernelConfig, datatype: str, layout: str) -> str: name += "_preshuffle" elif config.variant == GemmVariant.MULTI_D: name += f"_multid_{config.elementwise_op}_d{config.num_d_tensors}" + elif config.variant == GemmVariant.MULTI_ABD: + # Encode every behavior-affecting multi-abd parameter so distinct + # tensor counts / elementwise ops get distinct kernel names. + name += ( + f"_multiabd_a{config.num_a_tensors}_b{config.num_b_tensors}" + f"_d{config.num_d_tensors}" + f"_{config.a_elementwise_op}_{config.b_elementwise_op}" + f"_{config.cde_elementwise_op}" + ) + elif config.variant == GemmVariant.GROUPED: + name += "_grouped" + elif config.variant == GemmVariant.STREAM_K: + name += "_streamk" + # Atomic keeps the bare "_streamk" suffix for name parity with the + # original single-strategy bridge; linear/tree are disambiguated. + if config.reduction_strategy != "atomic": + name += f"_{config.reduction_strategy}" return name @@ -387,12 +455,38 @@ def _header(self, kernel_name: str, config: KernelConfig) -> str: includes += """ #include "ck_tile/ops/elementwise/unary_element_wise_operation.hpp" #include "ck_tile/ops/gemm/kernel/gemm_multi_d_kernel.hpp" +""" + + if config.variant == GemmVariant.MULTI_ABD: + includes += """ +#include +#include +#include "ck_tile/ops/elementwise/unary_element_wise_operation.hpp" +#include "ck_tile/ops/gemm/kernel/gemm_multi_abd_kernel.hpp" +""" + + if config.variant == GemmVariant.GROUPED: + includes += """ +#include +#include +#include "ck_tile/host/device_memory.hpp" +#include "ck_tile/host/hip_check_error.hpp" +#include "ck_tile/ops/gemm/kernel/grouped_gemm_kernel.hpp" """ if config.preshuffle: includes += """ #include "ck_tile/ops/gemm/pipeline/wp_pipeline_agmem_bgmem_creg_v2.hpp" #include "ck_tile/ops/gemm/pipeline/wp_pipeline_agmem_bgmem_creg_base_policy.hpp" +""" + + if config.variant == GemmVariant.STREAM_K: + includes += """ +#include +#include +#include "ck_tile/host/device_memory.hpp" +#include "ck_tile/ops/gemm/kernel/streamk_gemm/streamk_gemm_kernel.hpp" +#include "ck_tile/ops/gemm/kernel/streamk_gemm/streamk_gemm_tile_partitioner.hpp" """ return includes @@ -410,12 +504,13 @@ def _types(self, config: KernelConfig, kernel_name: str) -> str: def _kernel_local_types(self, config: KernelConfig) -> str: """Generate data type and layout definitions inside kernel namespace""" output_dtype = self.tm.get_output_dtype(self.datatype) + acc_dtype = self.tm.get_acc_dtype(self.datatype) return f""" // Data types (inside namespace to avoid conflicts across layouts) using ADataType = {self.tm.DTYPE_TO_CK[self.datatype]}; using BDataType = {self.tm.DTYPE_TO_CK[self.datatype]}; - using AccDataType = float; + using AccDataType = {self.tm.DTYPE_TO_CK[acc_dtype]}; using CDataType = {self.tm.DTYPE_TO_CK[output_dtype]}; // Layouts (inside namespace to avoid conflicts when mixing layouts) @@ -441,6 +536,107 @@ def _multi_d_types(self, config: KernelConfig) -> str: using ElementWiseFn = element_wise::{config.elementwise_op}; static constexpr index_t NumDTensor = {config.num_d_tensors}; using GemmMultiDArgs = GemmMultiDHostArgs; +""" + + def _multi_d_single_include(self, config: KernelConfig) -> str: + """Multi-D symbol exports + KEY macros for the force-included header. + + The multi_d ctypes lib (multi_d_gemm_ctypes_lib.cpp) force-includes ONE + generated header and calls SelectedKernel::launch(GemmMultiDArgs, ...) + directly, so it needs the Multi-D types (NumDTensor / DsDataType / + DsLayout / DLayout / ElementWiseFn / GemmMultiDArgs) and the num-D / + elementwise-op signature fields at global scope. These live in the + kernel's private namespace by default; re-export them here (guarded by + CK_TILE_SINGLE_KERNEL_INCLUDE) so single-include builds can reach them. + Standard/preshuffle configs emit nothing extra. + """ + if config.variant != GemmVariant.MULTI_D: + return "" + ns_name = "ns_" + KernelNaming.generate( + config, self.datatype, self.layout + ).replace("-", "_") + return f"""// Multi-D symbol exports for the single-include ctypes lib. +// NB: ALayout/BLayout/CLayout are already exported by the enclosing +// CK_TILE_SINGLE_KERNEL_INCLUDE block; re-exporting them here would be a C++ +// redefinition (breaks multi_d_gemm_ctypes_lib.cpp). Only the Multi-D-specific +// types/macros are added below. +using DsDataType = {ns_name}::DsDataType; +using DsLayout = {ns_name}::DsLayout; +using DLayout = {ns_name}::DLayout; +using ElementWiseFn = {ns_name}::ElementWiseFn; +static constexpr ck_tile::index_t NumDTensor = {ns_name}::NumDTensor; +using GemmMultiDArgs = {ns_name}::GemmMultiDArgs; +// Multi-D signature descriptors (consumed by the ctypes lib / KernelKey). +#define GEMM_KEY_MULTI_D 1 +#define GEMM_KEY_NUM_D_TENSORS {config.num_d_tensors} +#define GEMM_KEY_ELEMENTWISE_OP "{config.elementwise_op}" +#define GEMM_KEY_D_LAYOUT "{config.d_layout}" +""" + + def _multi_abd_types(self, config: KernelConfig) -> str: + """Generate multi-ABD type definitions (inside namespace to avoid conflicts). + + Multi-ABD uses tuples of A, B and D tensors (each group homogeneous in + dtype/layout here, matching the Tile Engine op) plus three separate + element-wise functions (A, B, CDE). The layouts mirror the TE builder's + 4-char ``rcrr`` convention: A=layout[0], B=layout[1], E(=C)=layout[2], + D=config.d_layout. + """ + if config.variant != GemmVariant.MULTI_ABD: + return "" + + a_layout_ck = self.tm.LAYOUT_TO_CK[self.layout[0]] + b_layout_ck = self.tm.LAYOUT_TO_CK[self.layout[1]] + e_layout_ck = self.tm.LAYOUT_TO_CK[self.layout[2]] + d_layout_ck = self.tm.LAYOUT_TO_CK[config.d_layout] + + a_types = ", ".join(["ADataType"] * config.num_a_tensors) + b_types = ", ".join(["BDataType"] * config.num_b_tensors) + d_types = ", ".join(["CDataType"] * config.num_d_tensors) + a_layouts = ", ".join([a_layout_ck] * config.num_a_tensors) + b_layouts = ", ".join([b_layout_ck] * config.num_b_tensors) + d_layouts = ", ".join([d_layout_ck] * config.num_d_tensors) + + return f""" +// Multi-ABD types (defined in namespace to avoid conflicts). +// EDataType is the output type (aliased to CDataType by the standard path). +using EDataType = CDataType; +using AsDataType = tuple<{a_types}>; +using BsDataType = tuple<{b_types}>; +using DsDataType = tuple<{d_types}>; +using AsLayout = tuple<{a_layouts}>; +using BsLayout = tuple<{b_layouts}>; +using ELayout = {e_layout_ck}; +using DsLayout = tuple<{d_layouts}>; +static constexpr index_t NumATensors = {config.num_a_tensors}; +static constexpr index_t NumBTensors = {config.num_b_tensors}; +static constexpr index_t NumDTensors = {config.num_d_tensors}; +using AElementWiseFn = element_wise::{config.a_elementwise_op}; +using BElementWiseFn = element_wise::{config.b_elementwise_op}; +using CDEElementWiseFn = element_wise::{config.cde_elementwise_op}; +using GemmMultiABDArgs = + GemmMultiABDHostArgs; +""" + + def _multi_abd_global_exports(self, config: KernelConfig, ns_name: str) -> str: + """Re-export the multi-ABD tensor counts to the global namespace. + + The gemm_multi_abd ctypes lib is registry-bypass: it force-includes this + header and constructs GemmMultiABDHostArgs at global scope. Those counts live inside the kernel's + namespace, so under CK_TILE_SINGLE_KERNEL_INCLUDE we surface them (and a + few convenience macros) globally. Empty for non-multi-abd variants. + """ + if config.variant != GemmVariant.MULTI_ABD: + return "" + return f""" +// Multi-ABD tensor counts (re-exported for the registry-bypass ctypes lib). +constexpr index_t NumATensors = {ns_name}::NumATensors; +constexpr index_t NumBTensors = {ns_name}::NumBTensors; +constexpr index_t NumDTensors = {ns_name}::NumDTensors; +#define GEMM_MULTI_ABD_NUM_A {config.num_a_tensors} +#define GEMM_MULTI_ABD_NUM_B {config.num_b_tensors} +#define GEMM_MULTI_ABD_NUM_D {config.num_d_tensors} """ def _selected_kernel_struct(self, config: KernelConfig, kernel_name: str) -> str: @@ -448,13 +644,21 @@ def _selected_kernel_struct(self, config: KernelConfig, kernel_name: str) -> str t = config.tile tr = config.trait output_dtype = self.tm.get_output_dtype(self.datatype) + acc_dtype = self.tm.get_acc_dtype(self.datatype) # Generate unique struct name and namespace from kernel name struct_name = f"Kernel_{kernel_name}" # Create valid C++ namespace name (replace invalid chars) ns_name = "ns_" + kernel_name.replace("-", "_") - multi_d_types = self._multi_d_types(config) + multi_d_types = self._multi_d_types(config) + self._multi_abd_types(config) + + # Old-TE (gemm_instance_builder.py) wires UsePersistentKernel from the swept + # 'persistent' flag only for universal/preshuffle/grouped/mx/batched — NOT multi_d, + # whose kernel path leaves it at the template default (false). Honoring it for multi_d + # spuriously flips AccumVGPR 224->384 and spills to scratch (~32% slower on small + # register-bound shapes), so force it off here to stay byte-identical to Old-TE. + use_persistent_kernel = tr.persistent and config.variant != GemmVariant.MULTI_D return f""" namespace {ns_name} {{ @@ -463,7 +667,7 @@ def _selected_kernel_struct(self, config: KernelConfig, kernel_name: str) -> str // Data types (inside namespace to avoid conflicts across different kernels) using ADataType = {self.tm.DTYPE_TO_CK[self.datatype]}; using BDataType = {self.tm.DTYPE_TO_CK[self.datatype]}; -using AccDataType = float; +using AccDataType = {self.tm.DTYPE_TO_CK[acc_dtype]}; using CDataType = {self.tm.DTYPE_TO_CK[output_dtype]}; // Layouts (inside namespace to avoid conflicts when mixing layouts like RCR + RRR) @@ -495,7 +699,7 @@ def _selected_kernel_struct(self, config: KernelConfig, kernel_name: str) -> str static constexpr bool kPadN = {str(tr.pad_n).lower()}; static constexpr bool kPadK = {str(tr.pad_k).lower()}; static constexpr bool TransposeC = false; - static constexpr bool UsePersistentKernel = {str(tr.persistent).lower()}; + static constexpr bool UsePersistentKernel = {str(use_persistent_kernel).lower()}; static constexpr bool DoubleSmemBuffer = {str(tr.pipeline == "compv4" or tr.pipeline == "preshufflev2").lower()}; static constexpr bool UseStructuredSparsity = false; static constexpr bool Preshuffle = {str(config.preshuffle).lower()}; @@ -518,9 +722,50 @@ def _selected_kernel_struct(self, config: KernelConfig, kernel_name: str) -> str constexpr const char* KERNEL_NAME = {ns_name}::KERNEL_NAME; using ADataType = {self.tm.DTYPE_TO_CK_QUALIFIED[self.datatype]}; using BDataType = {self.tm.DTYPE_TO_CK_QUALIFIED[self.datatype]}; -using CDataType = {self.tm.DTYPE_TO_CK_QUALIFIED[self.tm.get_output_dtype(self.datatype)]}; -using AccDataType = float; -#endif // CK_TILE_SINGLE_KERNEL_INCLUDE +using CDataType = {self.tm.DTYPE_TO_CK_QUALIFIED[output_dtype]}; +using AccDataType = {self.tm.DTYPE_TO_CK_QUALIFIED[acc_dtype]}; +{self._multi_abd_global_exports(config, ns_name)} +using ALayout = {ns_name}::ALayout; +using BLayout = {ns_name}::BLayout; +using CLayout = {ns_name}::CLayout; + +// KernelKey field descriptors for the force-included kernel. +// The ctypes library builds the registry KernelKey from these so the +// registered entry reflects this kernel's real traits (not a hard-coded +// fp16/rcr default). Enum-valued fields are emitted as the exact strings +// consumed by string_to_dtype/layout/pipeline/scheduler/epilogue in +// kernel_key.hpp; shape/flag fields are emitted as numeric/0-1 literals. +#define GEMM_KEY_DTYPE_A "{self.datatype}" +#define GEMM_KEY_DTYPE_B "{self.datatype}" +#define GEMM_KEY_DTYPE_C "{output_dtype}" +#define GEMM_KEY_DTYPE_ACC "{acc_dtype}" +#define GEMM_KEY_LAYOUT_A "{self.layout[0]}" +#define GEMM_KEY_LAYOUT_B "{self.layout[1]}" +#define GEMM_KEY_LAYOUT_C "{self.layout[2]}" +#define GEMM_KEY_PIPELINE "{tr.pipeline}" +#define GEMM_KEY_SCHEDULER "{tr.scheduler}" +#define GEMM_KEY_EPILOGUE "{tr.epilogue}" +#define GEMM_KEY_TILE_M {t.tile_m} +#define GEMM_KEY_TILE_N {t.tile_n} +#define GEMM_KEY_TILE_K {t.tile_k} +#define GEMM_KEY_WAVE_M {t.warp_m} +#define GEMM_KEY_WAVE_N {t.warp_n} +#define GEMM_KEY_WAVE_K {t.warp_k} +#define GEMM_KEY_WARP_TILE_M {t.warp_tile_m} +#define GEMM_KEY_WARP_TILE_N {t.warp_tile_n} +#define GEMM_KEY_WARP_TILE_K {t.warp_tile_k} +#define GEMM_KEY_BLOCK_SIZE {config.block_size} +#define GEMM_KEY_NUM_WAVE_GROUPS {config.num_wave_groups} +#define GEMM_KEY_PAD_M {int(tr.pad_m)} +#define GEMM_KEY_PAD_N {int(tr.pad_n)} +#define GEMM_KEY_PAD_K {int(tr.pad_k)} +#define GEMM_KEY_PERSISTENT {int(tr.persistent)} +#define GEMM_KEY_DOUBLE_BUFFER {int(tr.pipeline == "compv4" or tr.pipeline == "preshufflev2")} +#define GEMM_KEY_PRESHUFFLE {int(config.preshuffle)} +#define GEMM_KEY_TRANSPOSE_C 0 +#define GEMM_KEY_GROUPED 0 +#define GEMM_KEY_SPLIT_K 1 +{self._multi_d_single_include(config)}#endif // CK_TILE_SINGLE_KERNEL_INCLUDE """ def _tile_types(self, config: KernelConfig, ns_name: str) -> str: @@ -543,8 +788,14 @@ def _tile_types(self, config: KernelConfig, ns_name: str) -> str: def _launch_function(self, config: KernelConfig) -> str: """Generate launch function""" + if config.variant == GemmVariant.MULTI_ABD: + return self._launch_function_multi_abd(config) if config.variant == GemmVariant.MULTI_D: return self._launch_function_multi_d(config) + if config.variant == GemmVariant.GROUPED: + return self._launch_function_grouped(config) + if config.variant == GemmVariant.STREAM_K: + return self._launch_function_streamk(config) if config.preshuffle: return self._launch_function_preshuffle(config) return self._launch_function_standard(config) @@ -597,6 +848,69 @@ def _launch_function_standard(self, config: KernelConfig) -> str: return ave_time; }}""" + def _launch_function_grouped(self, config: KernelConfig) -> str: + """Generate launch function for grouped GEMM. + + Follows the dispatcher's workspace idiom (see grouped_conv stream-K launch in + unified_grouped_conv_codegen.py): signature is (args, stream); the device + workspace is allocated internally via DeviceMem rather than passed in. The + grouped kernel's per-group arg vector is built with MakeKargs, copied to the + workspace, and the device pointer + group count are passed to the kernel. + """ + persistent = config.trait.persistent + grid_expr = ( + "GemmKernel::MaxOccupancyGridSize(stream)" + if persistent + else "dim3(kargs.empty() ? 0 : kargs.back().block_end, 1, 1)" + ) + return f""" + static float launch(const std::vector>& gemm_descs, + const stream_config& stream) {{ + if(gemm_descs.empty()) return 0.0f; + + float ave_time{{0}}; + + constexpr auto scheduler = {self.tm.SCHEDULER_TO_CK[config.trait.scheduler]}; + + using UniversalGemmProblem = UniversalGemmPipelineProblem< + ADataType, BDataType, AccDataType, TileShape, + TileGemmUniversalTraits, + scheduler>; + + using GemmPipeline = {self.tm.PIPELINE_TO_CK[config.trait.pipeline]}; + {self._epilogue_code(config)} + + using GemmKernel = ck_tile::GroupedGemmKernel; + + auto kargs = GemmKernel::MakeKargs(gemm_descs); + if(!GemmKernel::IsSupportedArgument(kargs)) {{ + throw std::runtime_error("Arguments not supported for grouped gemm kernel"); + }} + + // Workspace allocated internally (dispatcher idiom, mirrors grouped_conv stream-K). + const std::size_t ws_size = kargs.size() * sizeof(ck_tile::GemmTransKernelArg<>); + ck_tile::DeviceMem workspace_dev(ws_size); + HIP_CHECK_ERROR(hipMemcpyWithStream(workspace_dev.GetDeviceBuffer(), + kargs.data(), + ws_size, + hipMemcpyHostToDevice, + stream.stream_id_)); + + const dim3 grids = {grid_expr}; + const dim3 blocks = GemmKernel::BlockSize(); + + constexpr int kBlockPerCu = {config.k_block_per_cu}; + ave_time = launch_kernel(stream, + make_kernel(GemmKernel{{}}, grids, blocks, 0, + cast_pointer_to_constant_address_space(workspace_dev.GetDeviceBuffer()), + kargs.size())); + + return ave_time; + }}""" + def _launch_function_preshuffle(self, config: KernelConfig) -> str: """Generate launch function for preshuffle GEMM (weight preshuffle variant) @@ -725,8 +1039,221 @@ def _launch_function_multi_d(self, config: KernelConfig) -> str: return launch(multi_d_args, stream); }}""" + def _launch_function_multi_abd(self, config: KernelConfig) -> str: + """Generate launch function for Multi-ABD GEMM. + + Mirrors the Tile Engine gemm_multi_abd instance builder's ``launch``: + tuple A/B/E layouts in the traits, tuple A/B dtypes plus the A and B + element-wise functions in the pipeline problem, and GemmKernelMultiABD + as the kernel. Multi-ABD supports only k_batch = 1, so it launches the + kernel directly (no hot-loop tail handler, matching Old-TE). + """ + return f""" + // Multi-ABD launch function - takes GemmMultiABDHostArgs with tuple A/B/D. + static float launch(const GemmMultiABDArgs& args, const stream_config& stream) {{ + float ave_time{{0}}; + + constexpr auto scheduler = {self.tm.SCHEDULER_TO_CK[config.trait.scheduler]}; + + // Traits use tuple layouts for multi-abd (AsLayout/BsLayout/ELayout). + using Traits = TileGemmUniversalTraits; + + using UniversalGemmProblem = UniversalGemmPipelineProblem< + AsDataType, BsDataType, AccDataType, TileShape, Traits, scheduler, + AElementWiseFn, BElementWiseFn>; + + using GemmPipeline = {self.tm.PIPELINE_TO_CK[config.trait.pipeline]}; + {self._epilogue_code(config)} + + using GemmKernel = ck_tile::GemmKernelMultiABD; + + auto kargs = GemmKernel::MakeKernelArgs(args); + + if (!GemmKernel::IsSupportedArgument(kargs)) {{ + throw std::runtime_error("Arguments not supported! Multi-ABD only supports k_batch = 1"); + }} + + const dim3 grids = GemmKernel::GridSize(args.M, args.N, args.k_batch); + const dim3 blocks = GemmKernel::BlockSize(); + + constexpr int kBlockPerCu = {config.k_block_per_cu}; + ave_time = launch_kernel(stream, + make_kernel(GemmKernel{{}}, grids, blocks, 0, kargs)); + + return ave_time; + }}""" + + def _launch_function_streamk(self, config: KernelConfig) -> str: + """Generate launch function for Stream-K GEMM (the dispatcher way). + + Stream-K is a single GEMM that splits the K dimension across CUs and + reduces partial results through a device workspace. Unlike Tile Engine + (which takes an external workspace pointer), the dispatcher allocates the + workspace INTERNALLY via DeviceMem inside launch(args, stream). + + The reduction strategy is taken from the config (atomic/linear/tree). + Atomic: partial tiles atomic-add into C, so C is zeroed before every + kernel invocation. Linear/Tree: partials accumulate through the device + workspace, which is zeroed instead. Both are handled by the preprocess + callback passed to launch_kernel_time_mask. + """ + reduction_ck = { + "atomic": "Atomic", + "linear": "Linear", + "tree": "Tree", + }[config.reduction_strategy] + # The Atomic strategy zeroes C with a row-major hipMemset2D (pitch = + # stride_E rows of N elems). A column-major C would be zeroed incorrectly + # and atomic accumulation would then corrupt results, so fail loudly at + # compile time rather than silently. Linear/Tree zero the workspace, not C, + # so they carry no such requirement. + c_rowmajor_assert = ( + """ + static_assert( + std::is_same_v, + ck_tile::tensor_layout::gemm::RowMajor>, + "Stream-K Atomic reduction requires a row-major C: the hipMemset2D C-reset " + "assumes row-major layout and would zero a column-major C incorrectly."); +""" + if config.reduction_strategy == "atomic" + else "" + ) + return f"""{c_rowmajor_assert} + // ---- Stream-K kernel type, hoisted to struct scope so the workspace API + // ---- (GetWorkSpaceSize + external-workspace launch) can reuse the same type. ---- + static constexpr auto SkScheduler = {self.tm.SCHEDULER_TO_CK[config.trait.scheduler]}; + static constexpr auto SkReductionStrategy = ck_tile::StreamKReductionStrategy::{reduction_ck}; + static constexpr int SkBlockPerCu = {config.k_block_per_cu}; + + using SkGemmUniversalTraits = TileGemmUniversalTraits; + using SkUniversalGemmProblem = UniversalGemmPipelineProblem< + ADataType, BDataType, AccDataType, TileShape, SkGemmUniversalTraits, SkScheduler>; + using SkGemmPipeline = {self.tm.PIPELINE_TO_CK[config.trait.pipeline]}; + {self._epilogue_code(config)} + using SkStreamKTilePartitioner = + ck_tile::StreamKTilePartitioner; + using StreamKGemmKernel = + ck_tile::StreamKKernel; + + // Device workspace (bytes) this kernel needs for `args`. 0 for Atomic; + // >0 for Linear/Tree. The Dispatcher uses this to size the buffer it owns. + static std::size_t GetWorkSpaceSize(const ck_tile::StreamKHostArgs& args) {{ + auto kargs = StreamKGemmKernel::MakeKernelArgs(args); + return StreamKGemmKernel::GetWorkSpaceSize(kargs); + }} + + // Whether the kernel can actually partition this problem (enough tiles across + // CUs). Lets the dispatcher's supports() reject too-small problems and fall + // back to a non-Stream-K kernel instead of throwing at launch. + static bool IsSupported(const ck_tile::StreamKHostArgs& args) {{ + return StreamKGemmKernel::IsSupportedArgument(StreamKGemmKernel::MakeKernelArgs(args)); + }} + + // Internal-workspace launch: allocates a fresh DeviceMem on every call. + // Kept unchanged for the bridge ctypes lib and the standalone 03 driver. + static float launch(const ck_tile::StreamKHostArgs& args, const stream_config& stream) {{ + auto kargs = StreamKGemmKernel::MakeKernelArgs(args); + const auto ws_size = StreamKGemmKernel::GetWorkSpaceSize(kargs); + ck_tile::DeviceMem workspace_dev(ws_size); + workspace_dev.SetZero(); + StreamKGemmKernel::SetWorkSpacePointer(kargs, workspace_dev.GetDeviceBuffer()); + + if (!StreamKGemmKernel::IsSupportedArgument(kargs)) {{ + throw std::runtime_error("Arguments not supported for stream-k kernel!"); + }} + + const dim3 grids = StreamKGemmKernel::GridSize(kargs.tile_partitioner); + const dim3 blocks = StreamKGemmKernel::BlockSize(); + + // Atomic reduction accumulates into C, so reset buffers before each run. + auto reset_data_buffers = [&]() {{ + if constexpr (SkReductionStrategy == ck_tile::StreamKReductionStrategy::Atomic) {{ + // Stride-aware: CLayout is row-major with stride_E elems/row, so a + // padded C is zeroed correctly (not just the contiguous M*N case). + if(hipMemset2DAsync(args.e_ptr, + args.stride_E * sizeof(CDataType), + 0, + args.N * sizeof(CDataType), + args.M, + stream.stream_id_) != hipSuccess) {{ + throw std::runtime_error( + "stream-k: hipMemset2DAsync failed to reset C between iterations"); + }} + }} else {{ + workspace_dev.SetZero(); + }} + }}; + std::function preprocess = reset_data_buffers; + + float ave_time = launch_kernel_time_mask(stream, preprocess, + make_kernel(StreamKGemmKernel{{}}, grids, blocks, 0, kargs)); + return ave_time; + }} + + // External-workspace launch (PR-D): the Dispatcher owns and reuses the + // reduction buffer and passes it in. `workspace` may be null for Atomic + // (size 0). The per-iteration reset stays here because it needs CDataType + // and the reduction strategy, which the dtype-erased Dispatcher lacks. + static float launch(const ck_tile::StreamKHostArgs& args, const stream_config& stream, + void* workspace) {{ + auto kargs = StreamKGemmKernel::MakeKernelArgs(args); + const auto ws_size = StreamKGemmKernel::GetWorkSpaceSize(kargs); + if (workspace != nullptr) {{ + StreamKGemmKernel::SetWorkSpacePointer(kargs, workspace); + }} + + if (!StreamKGemmKernel::IsSupportedArgument(kargs)) {{ + throw std::runtime_error("Arguments not supported for stream-k kernel!"); + }} + + const dim3 grids = StreamKGemmKernel::GridSize(kargs.tile_partitioner); + const dim3 blocks = StreamKGemmKernel::BlockSize(); + + auto reset_data_buffers = [&]() {{ + if constexpr (SkReductionStrategy == ck_tile::StreamKReductionStrategy::Atomic) {{ + // Stride-aware: CLayout is row-major with stride_E elems/row, so a + // padded C is zeroed correctly (not just the contiguous M*N case). + if(hipMemset2DAsync(args.e_ptr, + args.stride_E * sizeof(CDataType), + 0, + args.N * sizeof(CDataType), + args.M, + stream.stream_id_) != hipSuccess) {{ + throw std::runtime_error( + "stream-k: hipMemset2DAsync failed to reset C between iterations"); + }} + }} else {{ + if(hipMemsetAsync(workspace, 0, ws_size, stream.stream_id_) != hipSuccess) {{ + throw std::runtime_error( + "stream-k: hipMemsetAsync failed to reset reduction workspace"); + }} + }} + }}; + std::function preprocess = reset_data_buffers; + + float ave_time = launch_kernel_time_mask(stream, preprocess, + make_kernel(StreamKGemmKernel{{}}, grids, blocks, 0, kargs)); + return ave_time; + }}""" + def _epilogue_code(self, config: KernelConfig) -> str: """Generate epilogue code""" + if config.variant == GemmVariant.MULTI_ABD: + # Multi-ABD epilogue: tuple A/B/D dtypes and D layouts, EDataType as + # output, and the CDE element-wise function. Matches the TE builder's + # CShuffleEpilogueProblem for gemm_multi_abd. + return """ + using EpilogueProblem = CShuffleEpilogueProblem< + AsDataType, BsDataType, DsDataType, AccDataType, EDataType, + DsLayout, ELayout, CDEElementWiseFn, + TilePartitioner::MPerBlock, TilePartitioner::NPerBlock, + WarpPerBlock_M, WarpPerBlock_N, WarpTileM, WarpTileN, WarpTileK, + TransposeC>; + using GemmEpilogue = CShuffleEpilogue;""" if config.variant == GemmVariant.MULTI_D: return """ using EpilogueProblem = CShuffleEpilogueProblem< @@ -774,14 +1301,52 @@ def generate( """Generate dispatcher wrapper""" kernel_name = KernelNaming.generate(config, self.datatype, self.layout) output_dtype = self.tm.get_output_dtype(self.datatype) + acc_dtype = self.tm.get_acc_dtype(self.datatype) rel_path = kernel_path.relative_to(output_dir) + # Stream-K kernels need the Stream-K backend (StreamKHostArgs launch) and + # the SK key fields, so the registry can tell atomic/linear/tree apart and + # the right launch path compiles. All other variants use the regular backend. + is_streamk = config.variant == GemmVariant.STREAM_K + backend_inc = ( + "generated_tile_backend_streamk.hpp" + if is_streamk + else "generated_kernel_backend.hpp" + ) + + sk_fields = "" + if is_streamk: + rs = {"atomic": "Atomic", "linear": "Linear", "tree": "Tree"}[ + config.reduction_strategy + ] + ws = str(config.reduction_strategy != "atomic").lower() + sk_fields = f""" + key.algorithm.pad_m = {str(config.trait.pad_m).lower()}; + key.algorithm.pad_n = {str(config.trait.pad_n).lower()}; + key.algorithm.pad_k = {str(config.trait.pad_k).lower()}; + key.algorithm.streamk = true; + key.algorithm.reduction_strategy = ::ck_tile::dispatcher::ReductionStrategy::{rs}; + key.algorithm.workspace = {ws};""" + + if is_streamk: + ret_stmt = ( + "return backends::create_generated_streamk_kernel" + f'(key, "{kernel_name}");' + ) + else: + ret_stmt = ( + "return std::make_shared>" + f'(key, "{kernel_name}");' + ) + return f"""// SPDX-License-Identifier: MIT // Auto-generated dispatcher wrapper #pragma once #include "ck_tile/dispatcher.hpp" -#include "ck_tile/dispatcher/backends/generated_kernel_backend.hpp" +#include "ck_tile/dispatcher/backends/{backend_inc}" #include "{rel_path}" namespace ck_tile {{ @@ -808,7 +1373,7 @@ def generate( key.signature.dtype_a = {self.tm.DTYPE_TO_DISPATCHER[self.datatype]}; key.signature.dtype_b = {self.tm.DTYPE_TO_DISPATCHER[self.datatype]}; key.signature.dtype_c = {self.tm.DTYPE_TO_DISPATCHER[output_dtype]}; - key.signature.dtype_acc = DataType::FP32; + key.signature.dtype_acc = {self.tm.DTYPE_TO_DISPATCHER[acc_dtype]}; key.signature.layout_a = {self.tm.LAYOUT_TO_DISPATCHER[self.layout[0]]}; key.signature.layout_b = {self.tm.LAYOUT_TO_DISPATCHER[self.layout[1]]}; key.signature.layout_c = {self.tm.LAYOUT_TO_DISPATCHER[self.layout[2]]}; @@ -832,11 +1397,11 @@ def generate( key.algorithm.persistent = {str(config.trait.persistent).lower()}; key.algorithm.preshuffle = {str(config.preshuffle).lower()}; key.algorithm.transpose_c = false; - key.algorithm.num_wave_groups = {config.num_wave_groups}; - + key.algorithm.num_wave_groups = {config.num_wave_groups};{sk_fields} + key.gfx_arch = gfx_arch; - - return std::make_shared>(key, "{kernel_name}"); + + {ret_stmt} }} }}}}}} @@ -941,6 +1506,20 @@ def _load_config(self, config_file: Optional[Path]) -> Dict: "elementwise_ops": ["MultiDAdd", "MultiDMultiply"], "num_d_tensors": [1, 2], }, + "multi_abd_config": { + # Match the Tile Engine gemm_multi_abd instance builder defaults: + # 2 A tensors, 2 B tensors, 2 D tensors, all PassThrough ops. + "num_a_tensors": 2, + "num_b_tensors": 2, + "num_d_tensors": 2, + "a_elementwise_op": "PassThrough", + "b_elementwise_op": "PassThrough", + "cde_elementwise_op": "PassThrough", + }, + "streamk_config": { + # Each reduction strategy compiles to a separate kernel binary. + "reduction_strategy": ["atomic", "linear", "tree"], + }, } def generate_all(self, parallel: bool = True) -> Dict: @@ -1014,11 +1593,36 @@ def _get_preselected_configs(self) -> List[KernelConfig]: log.error(f"Invalid preselected set: {e}") return [] + @staticmethod + def _cshuffle_repeat_ok(tile: TileConfig) -> bool: + """CShuffle-store correctness gate. + + The CShuffle epilogue stores the accumulator back through LDS in + power-of-two MRepeat/NRepeat chunks, so a tile whose per-wave repeat + count -- tile / (warp * warp_tile) -- is not a power of two is + mis-stored and yields numerically WRONG results at runtime. The kernel + still compiles (the epilogue's static_asserts only check divisibility, + which such tiles satisfy), so it must be filtered in codegen. Observed + on MI350 for tile_m=192 (MRepeat = 192 / (2*32) = 3): verified incorrect + on BOTH the bridge and Tile Engine at every shape, including shapes + divisible by 192. Power-of-two tiles (64/128/256) are unaffected. + + This is CShuffle-specific: the "default" (DefaultGemm2DEpilogue) path + stores directly (not through the LDS repack) and is numerically correct + for non-pow2 repeats -- verified on gfx942 at tile_m=192/MRepeat=3 + (max_rel ~5e-4 across shapes divisible by 192, while the same tile under + CShuffle returns garbage, max_rel ~1.3). Only call this for kernels + whose resolved epilogue is "cshuffle". + """ + m_repeat = tile.tile_m // (tile.warp_m * tile.warp_tile_m) + n_repeat = tile.tile_n // (tile.warp_n * tile.warp_tile_n) + return _is_power_of_two(m_repeat) and _is_power_of_two(n_repeat) + def _get_configs_for_variant(self, variant: GemmVariant) -> List[KernelConfig]: """Get all configurations for a variant Args: - variant: GEMM variant (STANDARD, PRESHUFFLE, MULTI_D) + variant: GEMM variant (STANDARD, PRESHUFFLE, MULTI_D, GROUPED) Returns: List of valid kernel configurations for the variant @@ -1030,14 +1634,44 @@ def _get_configs_for_variant(self, variant: GemmVariant) -> List[KernelConfig]: trait_configs = self._get_trait_configs() for tile, trait in itertools.product(tile_configs, trait_configs): - # Perform variant-specific architecture validation + # Perform variant-specific architecture validation against the + # trait's ACTUAL pipeline/scheduler (not a hard-coded compv4). if self.arch_filter and HAS_ARCH_FILTER: - if not self._is_tile_arch_valid(tile, variant): + if not self._is_tile_arch_valid( + tile, + variant, + pipeline=trait.pipeline, + scheduler=trait.scheduler, + ): continue if variant == GemmVariant.STANDARD: + # CShuffle-store correctness gate: skip non-pow2 repeat tiles + # only for the cshuffle epilogue (see _cshuffle_repeat_ok). The + # "default" epilogue is correct with non-pow2 repeats, so it is + # NOT gated here. + if trait.epilogue == "cshuffle" and not self._cshuffle_repeat_ok(tile): + continue configs.append(KernelConfig(tile=tile, trait=trait, variant=variant)) + elif variant == GemmVariant.STREAM_K: + # Stream-K reuses the standard trait space but requires the cshuffle + # epilogue (the only epilogue the stream-K kernel supports). Each + # reduction strategy (atomic/linear/tree) is a distinct compiled + # kernel, so we expand one config per requested strategy. + if trait.epilogue == "cshuffle": + streamk_cfg = self.config.get("streamk_config", {}) + strategies = streamk_cfg.get("reduction_strategy", ["atomic"]) + for reduction_strategy in strategies: + configs.append( + KernelConfig( + tile=tile, + trait=trait, + variant=variant, + reduction_strategy=reduction_strategy, + ) + ) + elif variant == GemmVariant.PRESHUFFLE: # Preshuffle needs specific pipeline (preshufflev2) and scheduler (default) # Skip configs that don't use preshuffle-compatible traits @@ -1052,7 +1686,13 @@ def _get_configs_for_variant(self, variant: GemmVariant) -> List[KernelConfig]: ) # Only generate one preshuffle config per tile (not per trait) # since preshuffle has fixed pipeline/scheduler - if trait.pipeline == "compv3" and trait.scheduler == "intrawave": + # Preshuffle always uses the cshuffle epilogue, so the + # CShuffle-store pow2 repeat gate always applies here. + if ( + trait.pipeline == "compv3" + and trait.scheduler == "intrawave" + and self._cshuffle_repeat_ok(tile) + ): configs.append( KernelConfig( tile=tile, @@ -1063,6 +1703,10 @@ def _get_configs_for_variant(self, variant: GemmVariant) -> List[KernelConfig]: ) elif variant == GemmVariant.MULTI_D: + # CShuffle-store correctness gate: applies only when the + # (swept) epilogue is cshuffle; the default epilogue is exempt. + if trait.epilogue == "cshuffle" and not self._cshuffle_repeat_ok(tile): + continue multi_d = self.config.get("multi_d_config", {}) for ew_op, num_d in itertools.product( multi_d.get("elementwise_ops", ["MultiDAdd"]), @@ -1079,6 +1723,39 @@ def _get_configs_for_variant(self, variant: GemmVariant) -> List[KernelConfig]: ) ) + elif variant == GemmVariant.MULTI_ABD: + # Multi-ABD always uses the CShuffle epilogue (it fuses the D + # tensors + CDE elementwise through LDS), so the CShuffle-store + # power-of-two repeat correctness gate always applies. + if not self._cshuffle_repeat_ok(tile): + continue + multi_abd = self.config.get("multi_abd_config", {}) + num_a = multi_abd.get("num_a_tensors", 2) + num_b = multi_abd.get("num_b_tensors", 2) + num_d = multi_abd.get("num_d_tensors", 2) + a_ew = multi_abd.get("a_elementwise_op", "PassThrough") + b_ew = multi_abd.get("b_elementwise_op", "PassThrough") + cde_ew = multi_abd.get("cde_elementwise_op", "PassThrough") + configs.append( + KernelConfig( + tile=tile, + trait=trait, + variant=variant, + num_a_tensors=num_a, + num_b_tensors=num_b, + num_d_tensors=num_d, + a_elementwise_op=a_ew, + b_elementwise_op=b_ew, + cde_elementwise_op=cde_ew, + d_layout=self.d_layout, + ) + ) + + elif variant == GemmVariant.GROUPED: + # Grouped GEMM uses the same tile/trait configs as STANDARD — + # the only difference is the kernel type (GroupedGemmKernel vs GemmKernel) + configs.append(KernelConfig(tile=tile, trait=trait, variant=variant)) + return configs def _get_tile_configs(self) -> List[TileConfig]: @@ -1105,9 +1782,28 @@ def _get_tile_configs(self) -> List[TileConfig]: rejected_count += 1 continue - # Architecture-specific validation + # NOTE: the CShuffle-store pow2 MRepeat/NRepeat correctness gate is + # NOT applied here. It is epilogue-specific (only the CShuffle + # epilogue mis-stores non-pow2 repeats; the "default" epilogue is + # correct), so it is applied per (tile, trait) in + # _get_configs_for_variant once the epilogue is known. See + # _cshuffle_repeat_ok. + + # Architecture-specific validation. This is a pre-filter run before + # tiles are paired with traits, so keep a tile if it is legal under + # ANY configured pipeline/scheduler; the precise per-trait check + # happens later in _get_configs_for_variant. Filtering here with a + # single hard-coded pipeline (compv4) wrongly dropped tiles that are + # legal under mem/compv3. if self.arch_filter and HAS_ARCH_FILTER: - if not self._is_tile_arch_valid(tile): + trait_cfg = self.config.get("trait_config", {}) + pipelines = trait_cfg.get("pipeline") or ["compv4"] + schedulers = trait_cfg.get("scheduler") or ["intrawave"] + if not any( + self._is_tile_arch_valid(tile, pipeline=pl, scheduler=sc) + for pl in pipelines + for sc in schedulers + ): rejected_count += 1 continue @@ -1119,13 +1815,23 @@ def _get_tile_configs(self) -> List[TileConfig]: return configs def _is_tile_arch_valid( - self, tile: TileConfig, variant: GemmVariant = None + self, + tile: TileConfig, + variant: GemmVariant = None, + pipeline: str = None, + scheduler: str = None, ) -> bool: """Check if tile configuration is valid for target architecture Args: tile: Tile configuration to validate variant: GEMM variant (affects operator-specific constraints) + pipeline: Trait pipeline to validate against. Pass the config's + actual pipeline -- omitting it falls back to ``compv4``, whose + MFMA constraints are stricter than ``mem``/``compv3`` and would + wrongly reject tiles that are legal under those pipelines. + scheduler: Trait scheduler to validate against (defaults to + ``intrawave`` for the same reason). """ if not self.arch_filter or not HAS_ARCH_FILTER: return True @@ -1146,14 +1852,22 @@ def _is_tile_arch_valid( # Map GEMM variant to operator type for validation operator = None - pipeline = "compv4" # Default - scheduler = "intrawave" # Default + if pipeline is None: + pipeline = "compv4" # Default (representative compute pipeline) + if scheduler is None: + scheduler = "intrawave" # Default if OperatorType is not None and variant is not None: variant_to_operator = { GemmVariant.STANDARD: OperatorType.GEMM, GemmVariant.PRESHUFFLE: OperatorType.GEMM_PRESHUFFLE, GemmVariant.MULTI_D: OperatorType.GEMM_MULTI_D, + # Multi-ABD shares Multi-D's XDL/tile constraints (same + # UniversalGemm pipeline + CShuffle epilogue), so validate it + # against the GEMM_MULTI_D operator rules. + GemmVariant.MULTI_ABD: OperatorType.GEMM_MULTI_D, + GemmVariant.GROUPED: OperatorType.GEMM_GROUPED, + GemmVariant.STREAM_K: OperatorType.GEMM_STREAMK, } operator = variant_to_operator.get(variant, OperatorType.GEMM) @@ -1403,7 +2117,14 @@ def main(): parser.add_argument( "--variants", nargs="+", - choices=["standard", "preshuffle", "multi_d"], + choices=[ + "standard", + "preshuffle", + "multi_d", + "stream_k", + "multi_abd", + "grouped", + ], default=["standard"], help="Variants to generate", ) diff --git a/dispatcher/codegen/unified_grouped_conv_codegen.py b/dispatcher/codegen/unified_grouped_conv_codegen.py index 7f6a4d416b0..8ddea2d8b40 100644 --- a/dispatcher/codegen/unified_grouped_conv_codegen.py +++ b/dispatcher/codegen/unified_grouped_conv_codegen.py @@ -16,7 +16,7 @@ """ import argparse -import json +import importlib import logging from pathlib import Path from typing import List, Optional, Tuple, Union @@ -42,32 +42,20 @@ ArchFilter = None OperatorType = None -# Import tile configurations and shared validation rules from grouped_config_rules -# (single source of truth) -try: - from grouped_config_rules import ( - COMMON_TILES, - TILE_TO_WAVE, - TILE_TO_WARP, - VARIANT_PIPELINES, - BWD_WEIGHT_TILES, - COMPV4_COMPATIBLE_TILES, - # Shared validation functions - check_vectors, - check_warp_coverage, - check_bwd_data_vec_coverage, - is_valid_pipeline_for_variant, - is_streamk_valid_for_variant, - ) - HAS_TILE_CONFIGS = True -except ImportError: - HAS_TILE_CONFIGS = False - COMMON_TILES = [] - TILE_TO_WAVE = {} - TILE_TO_WARP = {} - VARIANT_PIPELINES = {} - BWD_WEIGHT_TILES = [] - COMPV4_COMPATIBLE_TILES = [] +# Shared per-config validation helpers used by GroupedConvKernelConfig below. +# The full set of rule helpers (tiles, waves, vecs, pipelines, ...) is consumed +# inside each rule set's get_configs() entry point, not here. +from grouped_conv.grouped_config_rules_full import ( + check_vectors, + is_valid_pipeline_for_variant, + is_streamk_valid_for_variant, +) +from grouped_conv.grouped_config_rules_default import ( + check_wmma_instance, + check_wmma_native_warp_tile, + get_warp_size, + check_tile_coverage, +) # ============================================================================ @@ -163,7 +151,7 @@ def deduce_block_per_cu(pipeline: str, double_smem_buffer: bool) -> int: # Pipelines that mandate double LDS (no user choice) _ALWAYS_DOUBLE = {"compv4", "comp_async"} # Pipelines that mandate single LDS (no user choice) - _ALWAYS_SINGLE = {"compv1", "compv2", "basic_v1", "basic_v2", "basic_async_v1"} + _ALWAYS_SINGLE = {"compv1", "compv2", "basic_v1", "basic_v2", "basic_async_v1", "wavelet"} if pipeline in _ALWAYS_DOUBLE: return 1 @@ -204,6 +192,10 @@ class GroupedConvKernelConfig: # Double buffering double_smem_buffer: bool = False + # Optional dtype tag — when set, this config is only generated for this dtype. + # Used by get_default_configs() when wave/warp pairs are dtype-specific. + datatype: Optional[str] = None + def __post_init__(self): if self.vector_sizes is not None: self.vector_size_a, self.vector_size_b, self.vector_size_c = ( @@ -259,6 +251,7 @@ def name(self, datatype: str) -> str: GroupedConvVariant.FORWARD: "fwd", GroupedConvVariant.BACKWARD_DATA: "bwd_data", GroupedConvVariant.BACKWARD_WEIGHT: "bwd_weight", + GroupedConvVariant.FORWARD_DEPTHWISE: "fwd", }[self.variant] # Core identity: variant, dtype, layout, dims @@ -325,7 +318,7 @@ def name(self, datatype: str) -> str: def is_valid_for_arch(self, arch: Optional[str] = None) -> bool: """Check if configuration is valid for target architecture. - Uses shared validation rules from grouped_config_rules.py. + Uses shared validation rules from grouped_config_rules_default.py. """ target_arch = arch if arch is not None else self.arch @@ -353,34 +346,6 @@ def is_valid_for_arch(self, arch: Optional[str] = None) -> bool: ) return False - # Reject tile dims that exceed single-warp vector load coverage - t = self.tile - if not check_warp_coverage( - t.tile_m, t.tile_n, t.tile_k, - self.vector_size_a, self.vector_size_b, - variant=variant_str, - ): - log.warning( - f"Rejecting config: tile exceeds warp coverage " - f"(tile={t.tile_m}x{t.tile_n}x{t.tile_k}, " - f"vec_a={self.vector_size_a}, vec_b={self.vector_size_b})" - ) - return False - - # Bwd_data only: vector width must not exceed elements per thread - if self.variant == GroupedConvVariant.BACKWARD_DATA: - if not check_bwd_data_vec_coverage( - t.tile_m, t.tile_n, t.tile_k, - t.warp_m, t.warp_n, t.warp_k, - self.vector_size_a, self.vector_size_b, - ): - log.warning( - f"Rejecting bwd_data config: vec exceeds tile coverage " - f"(tile={t.tile_m}x{t.tile_n}x{t.tile_k}, " - f"vec_a={self.vector_size_a}, vec_b={self.vector_size_b})" - ) - return False - # Check warp configuration (from arch_specs) try: from arch_specs_generated import WARP_SUPPORTED_COMBINATIONS @@ -388,12 +353,41 @@ def is_valid_for_arch(self, arch: Optional[str] = None) -> bool: supported = WARP_SUPPORTED_COMBINATIONS.get(target_arch) if supported is None: return False # Unknown architecture - warp_cfg = [t.warp_m, t.warp_n, t.warp_k] + warp_cfg = [self.tile.warp_m, self.tile.warp_n, self.tile.warp_k] if warp_cfg not in supported: return False except ImportError: pass # Allow if arch_specs not available + warp_size = get_warp_size(target_arch) + t = self.tile + + # WMMA-specific constraints for warp_size=32 targets (gfx11/gfx12) + if not check_wmma_instance( + warp_size=warp_size, + k_per_block=t.tile_k, + k_warp=t.warp_k, + k_per_xdl=t.warp_tile_k, + m_per_xdl=t.warp_tile_m, + dtype=self.datatype if self.datatype is not None else "float", + ): + return False + + block_size = warp_size * t.warp_k * t.warp_m * t.warp_n + if not check_tile_coverage( + tile_m=t.tile_m, tile_n=t.tile_n, tile_k=t.tile_k, + vec_a = self.vector_size_a, vec_b = self.vector_size_b, pipeline_version=tr.pipeline, + block_size=block_size, + ): + return False + + # Native warp-tile constraint: stream-K unsupported on warp_size=32 + if not check_wmma_native_warp_tile( + warp_size=warp_size, + streamk_enabled=tr.streamk_config.streamk_enabled, + ): + return False + return True @@ -470,6 +464,7 @@ class GroupedConvTypeMappings: "compv6": "GemmPipeline::COMPUTE_V6", "comp_async": "GemmPipeline::COMPUTE_ASYNC", "basic_async_v1": "GemmPipeline::BASIC_ASYNC_V1", + "wavelet": "GemmPipeline::WAVELET", } SCHEDULER_TO_CK = { @@ -691,7 +686,16 @@ def _kernel_instance( # whose TailHandler takes (run_func, has_hot_loop) and invokes # run_func(bool_constant<...>) -- 1 lambda arg. Other pipelines pass # (run_func, has_hot_loop, tail_number) and invoke 2-arg run_func. - if tr.pipeline in ("compv1", "basic_v1", "basic_async_v1"): + if tr.pipeline == "wavelet": + # The wavelet pipeline has no Base*/TailHandler. Its operator() + # consumes num_loop at runtime, so there is no compile-time hot-loop + # / tail dispatch -- launch the kernel once directly. (The Run lambda + # ignores has_hot_loop_/tail_number_ for the conv kernel.) + tail_handler_call = "Run(has_hot_loop, tail_num);" + run_lambda_signature = ( + "[&](const auto has_hot_loop_, const auto tail_number_)" + ) + elif tr.pipeline in ("compv1", "basic_v1", "basic_async_v1"): tail_handler_call = "BaseGemmPipeline::TailHandler(Run, has_hot_loop);" run_lambda_signature = "[&](const auto has_hot_loop_)" else: @@ -859,6 +863,9 @@ def _kernel_instance( # (from conv_configs.hpp PipelineTypeTraits -- basic_v1/mem/compv3) # CompV4/V5/V6/comp_async/basic_async_v1 use their own default policies. _CONV_POLICY_PIPELINES = {"basic_v1", "basic_v2", "compv1", "compv2", "mem", "compv3"} + # Number of additional load waves for the Wavelet pipeline + # (matches TilePipelineType in conv_tile_tuning_params.hpp) + _WAVELET_NUM_LOAD_WAVES = 4 _SPECIALIZATION_TO_CK = { "default": "ConvolutionSpecialization::Default", @@ -886,6 +893,7 @@ def _get_pipeline(self, pipeline: str) -> str: "compv6": "GemmPipelineAgBgCrCompV6", "comp_async": "GemmPipelineAgBgCrCompAsync", "basic_async_v1": "GemmPipelineAGmemBGmemCRegAsyncV1", + "wavelet": "GemmPipelineAgBgCrWavelet", } return pipelines.get(pipeline, "GemmPipelineAgBgCrCompV3") @@ -896,6 +904,8 @@ def _get_pipeline_template_args(self, pipeline: str, problem_type: str) -> str: as a second template argument for conv-specific LDS banking. """ base = self._get_pipeline(pipeline) + if pipeline == "wavelet": + return f"{base}<{problem_type}, GroupedConvUniversalPipelineAgBgCrPolicy, {self._WAVELET_NUM_LOAD_WAVES}>" if pipeline in self._CONV_POLICY_PIPELINES: return f"{base}<{problem_type}, GroupedConvUniversalPipelineAgBgCrPolicy>" return f"{base}<{problem_type}>" @@ -918,6 +928,9 @@ def _get_base_pipeline(self, pipeline: str) -> str: "compv6": "BaseGemmPipelineAgBgCrCompV6", "comp_async": "BaseGemmPipelineAgBgCrCompAsync", "basic_async_v1": "BaseGemmPipelineAGmemBGmemCRegV1", + # The wavelet pipeline has no separate Base class; it exposes the + # BlockHasHotloop / GetBlockLoopTailNum statics directly. + "wavelet": "GemmPipelineAgBgCrWavelet", } return pipelines.get(pipeline, "BaseGemmPipelineAgBgCrCompV3") @@ -1669,6 +1682,7 @@ class GroupedConvDispatcherWrapperGenerator: "compv6": "Pipeline::CompV6", "preshufflev1": "Pipeline::PreShuffleV1", "preshufflev2": "Pipeline::PreShuffleV2", + "wavelet": "Pipeline::Wavelet", } SCHEDULER_TO_DISPATCHER = { @@ -1731,7 +1745,7 @@ def generate( host_args_type = "GroupedConvBwdWeightHostArgs" conv_type_str = "bwd_weight" - layout = config.layout if is_depthwise else "nhwgc" + layout = config.layout # Algorithm key fields differ between implicit GEMM and depthwise algorithms if is_depthwise: @@ -1803,298 +1817,61 @@ def generate( """ -# ============================================================================ -# Configuration Parser -# ============================================================================ - - -def load_depthwise_configs_from_json( - data: dict, - arch: str = "gfx942", - instance_id: Optional[int] = None, -) -> List[DepthwiseConvKernelConfig]: - """Load depthwise convolution configs from parsed JSON data. - - Args: - data: Parsed JSON config data - arch: Target GPU architecture - instance_id: If specified, load only the instance with this ID - - Returns: - List of DepthwiseConvKernelConfig objects - """ - ndim_spatial = data["ndim_spatial"] - layout = data["layout"] - datatype = data["datatype"] - - instances = data["instances"] - if instance_id is not None: - instances = [inst for inst in instances if inst["id"] == instance_id] - if not instances: - raise ValueError(f"Instance ID {instance_id} not found in depthwise config") - - configs = [] - for inst in instances: - config = DepthwiseConvKernelConfig( - tile_h=inst["tile_h"], - tile_w=inst["tile_w"], - filt=inst["filt"], - str_h=inst["str_h"], - str_w=inst["str_w"], - pad_h=inst["pad_h"], - pad_w=inst["pad_w"], - nbatch=inst["nbatch"], - sub_h=inst["sub_h"], - sub_w=inst["sub_w"], - in_vec=inst["in_vec"], - out_vec=inst["out_vec"], - ndim_spatial=ndim_spatial, - arch=arch, - layout=layout, - datatype=datatype, - ) - configs.append(config) - - log.info( - f"Loaded {len(configs)} depthwise configs " - f"(layout={layout}, dtype={datatype})" - ) - return configs - - -def load_configs_from_json( - config_path: Path, - arch: str = "gfx942", - instance_id: Optional[int] = None, -) -> List[Union[GroupedConvKernelConfig, DepthwiseConvKernelConfig]]: - """Load kernel configurations from a JSON config file. - - Args: - config_path: Path to JSON config file - arch: Target GPU architecture - instance_id: If specified, load only the instance with this ID - - Returns: - List of GroupedConvKernelConfig objects - """ - with open(config_path, "r") as f: - data = json.load(f) - - variant_map = { - "forward": GroupedConvVariant.FORWARD, - "fwd": GroupedConvVariant.FORWARD, - "forward_depthwise": GroupedConvVariant.FORWARD_DEPTHWISE, - "bwd_data": GroupedConvVariant.BACKWARD_DATA, - "bwd_weight": GroupedConvVariant.BACKWARD_WEIGHT, - } - variant = variant_map.get(data["variant"]) - if variant is None: - raise ValueError(f"Unknown variant: {data['variant']}") - - if variant == GroupedConvVariant.FORWARD_DEPTHWISE: - return load_depthwise_configs_from_json(data, arch, instance_id) - - ndim_spatial = data["ndim_spatial"] - layout = data["layout"] - datatype = data["datatype"] - - instances = data["instances"] - if instance_id is not None: - instances = [inst for inst in instances if inst["id"] == instance_id] - if not instances: - raise ValueError(f"Instance ID {instance_id} not found in {config_path}") - - configs = [] - for inst in instances: - # Map specialization to pipeline constraints - # Specializations like filter1x1_stride1_pad0 don't change the pipeline config - # but are tracked in the trait for kernel naming and runtime checks - - trait = GroupedConvTraitConfig( - pipeline=inst["pipeline"], - scheduler=inst["scheduler"], - epilogue=inst["epilogue"], - pad_m=True, - pad_n=True, - pad_k=True, - double_smem_buffer=inst.get("double_smem_buffer", False), - num_groups_to_merge=inst.get("num_groups_to_merge", 1), - split_image=inst.get("split_image", False), - explicit_gemm=inst.get("explicit_gemm", False), - two_stage=inst.get("two_stage", False), - specialization=inst.get("specialization", "default"), - streamk_config=StreamKConfig( - streamk_enabled=inst.get("streamk_enabled", False), - strategy=StreamKReductionStrategy(inst.get("streamk_reduction_strategy", "TREE")), - streamk_persistent=inst.get("streamk_persistent", False) - ) if inst.get("streamk_enabled", False) else StreamKConfig() - ) - - # compv2/basic_v2 (GemmPipelineAGmemBGmemCRegV2) is not compatible with - # CK Tile's GroupedConvolutionBackwardWeightKernel. The builder maps - # PipelineVersion::V2 to GemmPipelineAgBgCrMem (i.e. "mem"), not to - # GemmPipelineAGmemBGmemCRegV2. Skip if any config somehow has compv2. - if variant == GroupedConvVariant.BACKWARD_WEIGHT and trait.pipeline in ("compv2", "basic_v2"): - log.info(f"Skipping instance {inst['id']}: compv2/basic_v2 pipeline not compatible with CK Tile bwd_weight") - continue - - config = GroupedConvKernelConfig( - tile=TileConfig( - tile_m=inst["tile_m"], - tile_n=inst["tile_n"], - tile_k=inst["tile_k"], - warp_m=inst["warp_m"], - warp_n=inst["warp_n"], - warp_k=inst["warp_k"], - warp_tile_m=inst["warp_tile_m"], - warp_tile_n=inst["warp_tile_n"], - warp_tile_k=inst["warp_tile_k"], - ), - trait=trait, - variant=variant, - ndim_spatial=ndim_spatial, - arch=arch, - layout=layout, - vector_size_a=inst["vector_size_a"], - vector_size_b=inst["vector_size_b"], - vector_size_c=inst["vector_size_c"], - num_wave_groups=inst.get("num_wave_groups", 1), - ) - configs.append(config) - - log.info( - f"Loaded {len(configs)} configs from {config_path} " - f"(variant={data['variant']}, layout={layout}, dtype={datatype})" - ) - return configs +# Each rule set maps to a (module, entry-point) pair with the uniform +# get_configs(arch, variants, ndims, datatypes) signature; get_default_configs +# imports the module and calls the named function, so no rule-set-specific logic +# lives in the codegen. Builder-derived sets (profiler/tests) and subset sets +# (tiny) reuse a shared module's entry points rather than thin wrapper modules. +_RULE_SET_MODULES = { + "default": ("grouped_conv.grouped_config_rules_default", "get_configs"), + "full": ("grouped_conv.grouped_config_rules_full", "get_configs"), + "full-tests": ("grouped_conv.grouped_config_rules_full_tests", "get_configs"), + "profiler": ("grouped_conv.grouped_config_rules_builder", "get_configs_profiler"), + "tests": ("grouped_conv.grouped_config_rules_builder", "get_configs_tests"), + "tiny": ("grouped_conv.grouped_config_rules_full_tests", "get_tiny_configs"), +} def get_default_configs( arch: str = "gfx942", variants: Optional[List[GroupedConvVariant]] = None, ndims: Optional[List[int]] = None, -) -> List[GroupedConvKernelConfig]: + datatypes: Optional[List[str]] = None, + rule_set: str = "profiler", +) -> List[Union[GroupedConvKernelConfig, DepthwiseConvKernelConfig]]: """Get default grouped convolution configurations for target architecture. - Uses tile configurations from grouped_conv_instance_builder.py as single source of truth. - """ - configs = [] + Delegates to the selected rule set's uniform ``get_configs`` entry point. + Args: + arch: Target GPU architecture (e.g., "gfx942", "gfx950"). + variants: Conv variants to generate. Defaults to [FORWARD]. + ndims: Spatial dimensions to generate (2 or 3). Defaults to [2]. + datatypes: Data type strings (e.g., ["fp16", "bf16", "fp32"]). + rule_set: "profiler"/"tests" (CK Builder profiler/tests instance sets + generated in memory from the .conf configs, the build sets), + "full" (full rule-derived per-(variant,ndim,datatype) set), + "full-tests" (~20% stratified subset of "full"), "tiny" + (minimal >=10-config subset of "full-tests"), or "default" + (original heuristic rules). + """ if variants is None: variants = [GroupedConvVariant.FORWARD] if ndims is None: ndims = [2] - - # Import tile configs from instance builder (single source of truth) - if not HAS_TILE_CONFIGS or not COMMON_TILES: - log.warning("grouped_config_rules not available, using fallback tile configs") - # Fallback to minimal set if grouped_config_rules unavailable - fwd_bwd_data_tiles = [ - (128, 128, 32, 2, 2, 32, 32, 16), - (64, 64, 32, 1, 4, 16, 16, 16), - (16, 64, 64, 1, 4, 16, 16, 32), - ] - bwd_weight_tiles = [(16, 64, 64, 1, 4, 16, 16, 32)] - else: - # Build tile list from COMMON_TILES with wave/warp mappings - fwd_bwd_data_tiles = [] - for tile_m, tile_n, tile_k in COMMON_TILES: - tile_key = (tile_m, tile_n, tile_k) - if tile_key in TILE_TO_WAVE and tile_key in TILE_TO_WARP: - wave_m, wave_n, wave_k = TILE_TO_WAVE[tile_key] - warp_m, warp_n, warp_k = TILE_TO_WARP[tile_key] - fwd_bwd_data_tiles.append( - (tile_m, tile_n, tile_k, wave_m, wave_n, warp_m, warp_n, warp_k) - ) - - # Backward weight: use BWD_WEIGHT_TILES from config rules - bwd_weight_tiles = [] - for tile_m, tile_n, tile_k in BWD_WEIGHT_TILES: - tile_key = (tile_m, tile_n, tile_k) - if tile_key in TILE_TO_WAVE and tile_key in TILE_TO_WARP: - wave_m, wave_n, wave_k = TILE_TO_WAVE[tile_key] - warp_m, warp_n, warp_k = TILE_TO_WARP[tile_key] - bwd_weight_tiles.append( - (tile_m, tile_n, tile_k, wave_m, wave_n, warp_m, warp_n, warp_k) - ) - - for variant in variants: - # Select tile configs based on variant - if variant == GroupedConvVariant.BACKWARD_WEIGHT: - tile_configs = bwd_weight_tiles - # Backward weight supports compv3 and mem pipelines - # (compv4/compv5 have transpose_tile2d issues) - pipelines = [("compv3", "cshuffle"), ("mem", "default")] - # Also generate two-stage variants (fp32 workspace + elementwise convert) - two_stage_flags = [False, True] - elif variant == GroupedConvVariant.BACKWARD_DATA: - tile_configs = fwd_bwd_data_tiles - # Backward data supports compv3 and mem pipelines - # (compv4/compv5 have get_length issues in bwd_data kernel) - pipelines = [("compv3", "cshuffle"), ("mem", "default")] - two_stage_flags = [False] - else: - tile_configs = fwd_bwd_data_tiles - # Only forward grouped convolution supports both compv3 and compv4 - pipelines = [("compv3", "cshuffle"), ("compv4", "cshuffle")] - two_stage_flags = [False] - for ndim in ndims: - for pipeline, epilogue in pipelines: - for ( - tile_m, - tile_n, - tile_k, - warp_m, - warp_n, - warp_tile_m, - warp_tile_n, - warp_tile_k, - ) in tile_configs: - # Skip tiles incompatible with compv4 - if pipeline == "compv4" and HAS_TILE_CONFIGS: - tile_key = (tile_m, tile_n, tile_k) - if tile_key not in COMPV4_COMPATIBLE_TILES: - continue # Skip this tile for compv4 - - for two_stage in two_stage_flags: - adj_tile_k = tile_k * 2 if pipeline == "compv4" else tile_k - - trait = GroupedConvTraitConfig( - pipeline=pipeline, - scheduler="intrawave", - epilogue=epilogue, - double_smem_buffer=(pipeline == "compv4"), - pad_m=True, - pad_n=True, - pad_k=True, - two_stage=two_stage, - ) - - if not trait.is_valid(): - continue - - config = GroupedConvKernelConfig( - tile=TileConfig( - tile_m=tile_m, - tile_n=tile_n, - tile_k=adj_tile_k, - warp_m=warp_m, - warp_n=warp_n, - warp_k=1, - warp_tile_m=warp_tile_m, - warp_tile_n=warp_tile_n, - warp_tile_k=warp_tile_k, - ), - trait=trait, - variant=variant, - ndim_spatial=ndim, - arch=arch, - ) - - if config.is_valid_for_arch(): - configs.append(config) - - return configs + if datatypes is None: + datatypes = ["fp16"] + + entry = _RULE_SET_MODULES.get(rule_set) + if entry is None: + raise ValueError( + f"Unknown rule_set: {rule_set!r} " + f"(expected one of {sorted(_RULE_SET_MODULES)})" + ) + module_name, func_name = entry + rules_module = importlib.import_module(module_name) + get_configs = getattr(rules_module, func_name) + return get_configs(arch, variants, ndims, datatypes) def get_arch_filter(): @@ -2166,7 +1943,7 @@ def __init__( except ValueError as e: log.warning(f"Could not create arch filter: {e}") - def _get_configs(self) -> List[GroupedConvKernelConfig]: + def _get_configs(self) -> List[GroupedConvKernelConfig | DepthwiseConvKernelConfig]: """Get configurations for this codegen's datatype and ndim_spatial.""" return get_default_configs( arch=self.gpu_target, @@ -2176,6 +1953,7 @@ def _get_configs(self) -> List[GroupedConvKernelConfig]: GroupedConvVariant.BACKWARD_WEIGHT, ], ndims=[self.ndim_spatial], + datatypes=[self.datatype], ) def _get_operator_type( @@ -2241,12 +2019,12 @@ def generate_kernel( # Generate kernel header content = kernel_gen.generate(config) - filepath.write_text(content) + filepath.write_text(content, encoding="utf-8") self.generated_files.append(filepath) wrapper_content = wrapper_gen.generate(config, filepath, self.output_dir) wrapper_path = self.wrapper_dir / f"dispatcher_wrapper_{kernel_name}.hpp" - wrapper_path.write_text(wrapper_content) + wrapper_path.write_text(wrapper_content, encoding="utf-8") self.generated_wrappers.append(wrapper_path) # Generate .cpp compilation unit for per-kernel parallel builds @@ -2262,7 +2040,7 @@ def generate_kernel( volatile bool _{kernel_name.replace("-", "_")}_loaded = true; }} }} """ - cpp_filepath.write_text(cpp_content) + cpp_filepath.write_text(cpp_content, encoding="utf-8") return filepath, wrapper_path @@ -2304,17 +2082,23 @@ def generate_all( for datatype in datatypes: for config in configs: if isinstance(config, DepthwiseConvKernelConfig): - # Depthwise configs skip arch filter validation (not applicable) + # Depthwise configs carry their own dtype — only emit for match + if config.datatype != datatype: + continue valid_tasks.append((config, datatype, GroupedConvVariant.FORWARD_DEPTHWISE)) - elif self.is_config_valid(config, datatype): - valid_tasks.append((config, datatype, config.variant)) - else: - rejected_count += 1 - log.debug( - f"Rejected config for {self.gpu_target}: " - f"{config.tile.tile_m}x{config.tile.tile_n}x{config.tile.tile_k} " - f"variant={config.variant.value}" - ) + elif isinstance(config, GroupedConvKernelConfig): + # GEMM configs may carry a dtype tag — skip mismatches + if config.datatype and config.datatype != datatype: + continue + if self.is_config_valid(config, datatype): + valid_tasks.append((config, datatype, config.variant)) + else: + rejected_count += 1 + log.debug( + f"Rejected config for {self.gpu_target}: " + f"{config.tile.tile_m}x{config.tile.tile_n}x{config.tile.tile_k} " + f"variant={config.variant.value}" + ) if rejected_count > 0: log.info( @@ -2421,7 +2205,7 @@ def _generate_include_all_headers(self): // Default launcher alias (uses first kernel) {launcher_alias} """ - header_path.write_text(content) + header_path.write_text(content, encoding="utf-8") if kernel_headers: log.info(f"Generated: {header_name} ({len(kernel_headers)} kernels)") @@ -2517,7 +2301,7 @@ def _generate_registration_header( }} // namespace ck_tile """ reg_path = self.wrapper_dir / "register_all_grouped_conv_kernels.hpp" - reg_path.write_text(content) + reg_path.write_text(content, encoding="utf-8") log.info(f"Generated registration header: {reg_path}") @@ -2542,7 +2326,7 @@ def main(): "-d", type=str, nargs="+", - default=["fp16"], + default=["fp16", "bf16", "fp32"], choices=["fp16", "bf16", "fp32"], help="Data types to generate", ) @@ -2551,7 +2335,7 @@ def main(): "-v", type=str, nargs="+", - default=["forward"], + default=["forward", "bwd_data", "bwd_weight"], choices=["forward", "bwd_data", "bwd_weight"], help="Grouped convolution variants", ) @@ -2560,7 +2344,7 @@ def main(): "-n", type=int, nargs="+", - default=[2], + default=[2, 3], choices=[1, 2, 3], help="Spatial dimensions", ) @@ -2569,7 +2353,7 @@ def main(): "-a", type=str, default="gfx942", - choices=["gfx90a", "gfx942", "gfx950", "gfx1201"], + choices=["gfx90a", "gfx942", "gfx950", "gfx1201", "gfx1250"], help="Target GPU architecture", ) parser.add_argument("--verbose", action="store_true", help="Verbose output") @@ -2578,21 +2362,13 @@ def main(): action="store_true", help="List configurations without generating", ) - - # JSON config file - parser.add_argument( - "--config-file", - type=Path, - default=None, - help="Path to JSON config file. " - "Overrides --variant, --ndim, and individual tile/pipeline args.", - ) parser.add_argument( - "--instance-id", - type=int, - default=None, - help="Generate only the instance with this ID from the config file. " - "Requires --config-file.", + "--rule-set", + "-r", + type=str, + default="default", + choices=["default", "full", "full-tests", "profiler", "tests", "tiny"], + help="Rule-set used in the instance generation", ) # Individual kernel configuration (when not using predefined configs) @@ -2617,6 +2393,7 @@ def main(): "compv5", "compv6", "comp_async", + "wavelet", ], help="Pipeline type", ) @@ -2693,21 +2470,8 @@ def main(): } requested_variants = [variant_map[v] for v in args.variant] - # Validate --instance-id requires --config-file - if args.instance_id is not None and args.config_file is None: - parser.error("--instance-id requires --config-file") - - # Check if user specified a JSON config file - if args.config_file is not None: - filtered_configs = load_configs_from_json( - args.config_file, arch=args.arch, instance_id=args.instance_id - ) - # Extract datatype from JSON config for code generation - with open(args.config_file, "r") as f: - config_data = json.load(f) - args.datatype = [config_data["datatype"]] - elif args.tile_m is not None or args.tile_n is not None or args.pipeline is not None: - # Build custom config from CLI arguments + # Build custom config from CLI arguments + if args.tile_m is not None or args.tile_n is not None or args.pipeline is not None: tile = TileConfig( tile_m=args.tile_m or 128, tile_n=args.tile_n or 128, @@ -2750,24 +2514,26 @@ def main(): streamk_persistent=args.streamk_persistent, ) if args.streamk_enabled else StreamKConfig() ) - config = GroupedConvKernelConfig( - tile=tile, - trait=trait, - variant=requested_variants[0] - if requested_variants - else GroupedConvVariant.FORWARD, - ndim_spatial=args.ndim[0] if args.ndim else 2, - arch=args.arch, - vector_size_a=args.vector_a, - vector_size_b=args.vector_b, - vector_size_c=args.vector_c, - num_wave_groups=args.num_wave_groups, - ) - filtered_configs = [config] + + filtered_configs = [] + for var in requested_variants: + config = GroupedConvKernelConfig( + tile=tile, + trait=trait, + variant=var, + ndim_spatial=args.ndim[0] if args.ndim else 2, + arch=args.arch, + vector_size_a=args.vector_a, + vector_size_b=args.vector_b, + vector_size_c=args.vector_c, + num_wave_groups=args.num_wave_groups, + ) + filtered_configs.append(config) else: # Get predefined configurations for target arch with requested variants and ndims filtered_configs = get_default_configs( - arch=args.arch, variants=requested_variants, ndims=args.ndim + arch=args.arch, variants=requested_variants, ndims=args.ndim, datatypes=args.datatype, + rule_set=args.rule_set, ) if args.list_configs: @@ -2802,8 +2568,7 @@ def main(): # Generate (disable arch filter when using pre-validated JSON configs) codegen = UnifiedGroupedConvCodegen( output_dir=args.output, - gpu_target=args.arch, - enable_arch_filter=(args.config_file is None), + gpu_target=args.arch ) results = codegen.generate_all( configs=filtered_configs, datatypes=args.datatype, parallel=True diff --git a/dispatcher/codegen/unified_grouped_gemm_bquant_codegen.py b/dispatcher/codegen/unified_grouped_gemm_bquant_codegen.py new file mode 100644 index 00000000000..bc8a783fab3 --- /dev/null +++ b/dispatcher/codegen/unified_grouped_gemm_bquant_codegen.py @@ -0,0 +1,663 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +GroupedGemm BQuant Code Generator + +Generates one .hpp per kernel config for the dispatcher's ctypes path. +Each header defines a SelectedKernel struct with a static launch() method +taking QuantGemmHostArgs — compiled per-kernel via force-include: + + hipcc -include -DCK_TILE_SINGLE_KERNEL_INCLUDE grouped_gemm_bquant_ctypes_lib.cpp + +Initial scope: fp8 and bf8 dtype variants, non-preshuffle, compv3 pipeline, +rcr layout, configurable QuantGroupShape. + +Naming convention (byte-exact with BQuantKernelConfig.name in grouped_gemm_bquant_utils.py): + grouped_gemm_bquant_{dtype_a}_{layout}_{pipeline}_{epilogue}_{scheduler}_ + {TileM}x{TileN}x{TileK}_{WarpM}x{WarpN}x{WarpK}_{WtM}x{WtN}x{WtK}_ + qg{gM}x{gN}x{gK}[_preshuffleb][_preshufflebq] + +Reference: + example/ck_tile/38_block_scale_gemm/gemm_bquant_quantgrouped_fp8.cpp + example/ck_tile/38_block_scale_gemm/run_gemm_quant_example.inc + example/ck_tile/38_block_scale_gemm/gemm_utils.hpp (GemmConfigQuantDecode) +""" + +import argparse +import itertools +import json +import logging +from dataclasses import dataclass, field +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +from codegen_common import make_bquant_kernel_name, bquant_effective_epilogue + +logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") +log = logging.getLogger(__name__) + + +# ============================================================================= +# Dtype variant definitions +# Each entry: (dtype_key, ADataType, BDataType, CDataType, QDataType) +# Matches example/ck_tile/38_block_scale_gemm/gemm_bquant_quantgrouped_*.cpp +# ============================================================================= + +BQUANT_VARIANTS: Dict[str, Dict[str, str]] = { + "fp8": { + "dtype_a": "fp8", + "dtype_b": "fp8", + "dtype_c": "half", + "dtype_q": "float", + "ck_a": "ck_tile::fp8_t", + "ck_b": "ck_tile::fp8_t", + "ck_c": "ck_tile::half_t", + "ck_q": "float", + "ck_acc": "float", + }, + "bf8": { + "dtype_a": "bf8", + "dtype_b": "bf8", + "dtype_c": "half", + "dtype_q": "float", + "ck_a": "ck_tile::bf8_t", + "ck_b": "ck_tile::bf8_t", + "ck_c": "ck_tile::half_t", + "ck_q": "float", + "ck_acc": "float", + }, + "fp8i4": { + "dtype_a": "fp8", + "dtype_b": "pk_int4", + "dtype_c": "half", + "dtype_q": "fp8", + "ck_a": "ck_tile::fp8_t", + "ck_b": "ck_tile::pk_int4_t", + "ck_c": "ck_tile::half_t", + "ck_q": "ck_tile::fp8_t", + "ck_acc": "float", + }, + "bf8i4": { + "dtype_a": "bf8", + "dtype_b": "pk_int4", + "dtype_c": "half", + "dtype_q": "bf8", + "ck_a": "ck_tile::bf8_t", + "ck_b": "ck_tile::pk_int4_t", + "ck_c": "ck_tile::half_t", + "ck_q": "ck_tile::bf8_t", + "ck_acc": "float", + }, + # MX microscale variants — Q-type is e8m0 (block scale), pipeline = microscale + "mx_bf16bf16": { + "dtype_a": "bf16", + "dtype_b": "bf16", + "dtype_c": "bf16", + "dtype_q": "e8m0", + "ck_a": "ck_tile::bf16_t", + "ck_b": "ck_tile::bf16_t", + "ck_c": "ck_tile::bf16_t", + "ck_q": "ck_tile::e8m0_t", + "ck_acc": "float", + }, + "mx_bf16bf8": { + "dtype_a": "bf16", + "dtype_b": "bf8", + "dtype_c": "bf16", + "dtype_q": "e8m0", + "ck_a": "ck_tile::bf16_t", + "ck_b": "ck_tile::bf8_t", + "ck_c": "ck_tile::bf16_t", + "ck_q": "ck_tile::e8m0_t", + "ck_acc": "float", + }, + "mx_bf16fp4": { + "dtype_a": "bf16", + "dtype_b": "pk_fp4", + "dtype_c": "bf16", + "dtype_q": "e8m0", + "ck_a": "ck_tile::bf16_t", + "ck_b": "ck_tile::pk_fp4_t", + "ck_c": "ck_tile::bf16_t", + "ck_q": "ck_tile::e8m0_t", + "ck_acc": "float", + }, +} + +# Layout strings supported: only rcr for initial implementation +# (RowMajor A, ColMajor B, RowMajor C) — standard GEMM layout for quant kernels +BQUANT_LAYOUT_TO_CK = { + "r": "ck_tile::tensor_layout::gemm::RowMajor", + "c": "ck_tile::tensor_layout::gemm::ColumnMajor", +} + +# Pipeline map for BQuant kernels. +# "preshuffleb" -> WPQuantBPipelineAgBgCrV2 (preshuffle_b=true variants) +# "microscale" -> MicroscaleGemmPipelineAgBgCrCompV3 (MX e8m0 scale variants) +BQUANT_PIPELINE_MAP = { + "compv3": "ck_tile::BQuantGemmPipelineAgBgCrCompV3", + "preshuffleb": "ck_tile::WPQuantBPipelineAgBgCrV2", + "microscale": "ck_tile::MicroscaleGemmPipelineAgBgCrCompV3", +} + +BQUANT_BASE_PIPELINE_MAP = { + "compv3": "ck_tile::BaseGemmPipelineAgBgCrCompV3", + "preshuffleb": "ck_tile::BaseWeightPreshufflePipelineAGmemBGmemCRegV2", + # MX BQuant (QDataType=e8m0, PreshuffleB=false) falls into the else branch in + # run_gemm_quant_example.inc — same base as preshuffleb. + "microscale": "ck_tile::BaseWeightPreshufflePipelineAGmemBGmemCRegV2", +} + +BQUANT_SCHEDULER_TO_CK = { + "intrawave": "ck_tile::GemmPipelineScheduler::Intrawave", + "interwave": "ck_tile::GemmPipelineScheduler::Interwave", +} + + +# ============================================================================= +# Configuration dataclasses +# ============================================================================= + + +@dataclass +class BQuantTileConfig: + tile_m: int + tile_n: int + tile_k: int + warp_m: int + warp_n: int + warp_k: int + warp_tile_m: int + warp_tile_n: int + warp_tile_k: int + + def is_valid(self) -> bool: + if self.tile_m <= 0 or self.tile_n <= 0 or self.tile_k <= 0: + return False + return ( + self.tile_m % (self.warp_m * self.warp_tile_m) == 0 + and self.tile_n % (self.warp_n * self.warp_tile_n) == 0 + and self.tile_k % (self.warp_k * self.warp_tile_k) == 0 + ) + + +@dataclass +class BQuantKernelSpec: + """Complete specification for one BQuant kernel.""" + + variant_key: str # "fp8" or "bf8" + layout: str # "rcr" + pipeline: str # "compv3" + epilogue: str # "cshuffle" + scheduler: str # "intrawave" + tile: BQuantTileConfig + quant_group_m: int = 1 + quant_group_n: int = 1 + quant_group_k: int = 128 + preshuffle_b: bool = False + preshuffle_bquant: bool = False + double_smem_buffer: bool = False + pad_m: bool = False + pad_n: bool = False + pad_k: bool = True + block_size: int = 256 + k_block_per_cu: int = 1 + + @property + def name(self) -> str: + t = self.tile + return make_bquant_kernel_name( + variant_key=self.variant_key, + layout=self.layout, + pipeline=self.pipeline, + epilogue=self.epilogue, + scheduler=self.scheduler, + tile_m=t.tile_m, tile_n=t.tile_n, tile_k=t.tile_k, + warp_m=t.warp_m, warp_n=t.warp_n, warp_k=t.warp_k, + warp_tile_m=t.warp_tile_m, warp_tile_n=t.warp_tile_n, warp_tile_k=t.warp_tile_k, + quant_group_m=self.quant_group_m, + quant_group_n=self.quant_group_n, + quant_group_k=self.quant_group_k, + preshuffle_b=self.preshuffle_b, + preshuffle_bquant=self.preshuffle_bquant, + ) + + +# ============================================================================= +# Header generator +# ============================================================================= + + +class BQuantKernelHeaderGenerator: + """Generates a .hpp kernel specialization header for one BQuantKernelSpec.""" + + def generate(self, spec: BQuantKernelSpec) -> str: + variant = BQUANT_VARIANTS[spec.variant_key] + t = spec.tile + ns = "ns_" + spec.name + struct = "Kernel_" + spec.name + + ck_a = variant["ck_a"] + ck_b = variant["ck_b"] + ck_c = variant["ck_c"] + ck_q = variant["ck_q"] + ck_acc = variant["ck_acc"] + + layout_a_ck = BQUANT_LAYOUT_TO_CK[spec.layout[0]] + layout_b_ck = BQUANT_LAYOUT_TO_CK[spec.layout[1]] + layout_c_ck = BQUANT_LAYOUT_TO_CK[spec.layout[2]] + # BQ is always RowMajor: scales are stored [ceil(K/gK), ceil(N/gN)] + layout_bq_ck = BQUANT_LAYOUT_TO_CK["r"] + # AQ layout placeholder (unused for BQuant-only, same as A layout) + layout_aq_ck = layout_a_ck + + pipeline_ck = BQUANT_PIPELINE_MAP[spec.pipeline] + base_pipeline_ck = BQUANT_BASE_PIPELINE_MAP[spec.pipeline] + scheduler_ck = BQUANT_SCHEDULER_TO_CK[spec.scheduler] + + pad_m = str(spec.pad_m).lower() + pad_n = str(spec.pad_n).lower() + pad_k = str(spec.pad_k).lower() + preshuffle_b = str(spec.preshuffle_b).lower() + preshuffle_bquant = str(spec.preshuffle_bquant).lower() + double_smem_buffer = str(spec.double_smem_buffer).lower() + + # Determine which epilogue the kernel will use, mirroring run_gemm_quant_example.inc. + # Delegates to bquant_effective_epilogue (same logic used by make_bquant_kernel_name) + # so the generated C++ and the kernel name always agree. + use_permute_n_epilogue = ( + bquant_effective_epilogue(t.tile_n, t.warp_n, t.warp_tile_n, spec.quant_group_n) + == "permute_n" + ) + + # Build the epilogue block outside the f-string to keep it readable. + # PermuteNEpilogueProblem takes two extra trailing args (false, 1) vs CShuffleEpilogueProblem. + if use_permute_n_epilogue: + epilogue_block = f"""\ + using GemmEpilogue = ck_tile::PermuteNEpilogue< + ck_tile::PermuteNEpilogueProblem< + typename PipelineProblem::AComputeDataType, + typename PipelineProblem::BComputeDataType, + ck_tile::tuple<>, + AccDataType, + CDataType, + ck_tile::tuple<>, + {ns}::CLayout, + ck_tile::element_wise::PassThrough, + TilePartitioner::MPerBlock, + TilePartitioner::NPerBlock, + WarpM, WarpN, + WarpTileM, WarpTileN, WarpTileK, + TransposeC, + false, + 1>>;""" + else: + epilogue_block = f"""\ + using GemmEpilogue = ck_tile::CShuffleEpilogue< + ck_tile::CShuffleEpilogueProblem< + typename PipelineProblem::AComputeDataType, + typename PipelineProblem::BComputeDataType, + ck_tile::tuple<>, + AccDataType, + CDataType, + ck_tile::tuple<>, + {ns}::CLayout, + ck_tile::element_wise::PassThrough, + TilePartitioner::MPerBlock, + TilePartitioner::NPerBlock, + WarpM, WarpN, + WarpTileM, WarpTileN, WarpTileK, + TransposeC>>;""" + + return f"""\ +// SPDX-License-Identifier: MIT +// Auto-generated BQuantGrouped GEMM kernel header. +// DO NOT EDIT — regenerate via unified_grouped_gemm_bquant_codegen.py +#pragma once + +#include "ck_tile/core.hpp" +#include "ck_tile/host/kernel_launch.hpp" +#include "ck_tile/ops/gemm_quant.hpp" +#include "ck_tile/ops/epilogue.hpp" + +namespace {ns} {{ + +constexpr const char* KERNEL_NAME = "{spec.name}"; + +using ADataType = {ck_a}; +using BDataType = {ck_b}; +using CDataType = {ck_c}; +using QDataType = {ck_q}; +using AccDataType = {ck_acc}; + +using ALayout = {layout_a_ck}; +using BLayout = {layout_b_ck}; +using CLayout = {layout_c_ck}; +using AQLayout = {layout_aq_ck}; +using BQLayout = {layout_bq_ck}; + +// Single QuantGroupSize alias — same type used for both AQ and BQ slots in the +// pipeline template; AQ is disabled via aq_ptr=nullptr at runtime for BQuant-only. +using QuantGroupSize = ck_tile::QuantGroupShape>; + +struct {struct} {{ + using ADataType = {ns}::ADataType; + using BDataType = {ns}::BDataType; + using CDataType = {ns}::CDataType; + using QDataType = {ns}::QDataType; + using AccDataType = {ns}::AccDataType; + + static constexpr ck_tile::index_t TileM = {t.tile_m}; + static constexpr ck_tile::index_t TileN = {t.tile_n}; + static constexpr ck_tile::index_t TileK = {t.tile_k}; + static constexpr ck_tile::index_t WarpM = {t.warp_m}; + static constexpr ck_tile::index_t WarpN = {t.warp_n}; + static constexpr ck_tile::index_t WarpK = {t.warp_k}; + static constexpr ck_tile::index_t WarpTileM = {t.warp_tile_m}; + static constexpr ck_tile::index_t WarpTileN = {t.warp_tile_n}; + static constexpr ck_tile::index_t WarpTileK = {t.warp_tile_k}; + static constexpr ck_tile::index_t BlockSize = {spec.block_size}; + static constexpr int kBlockPerCu = {spec.k_block_per_cu}; + static constexpr ck_tile::index_t GroupSizeK = {spec.quant_group_k}; + + static constexpr bool kPadM = {pad_m}; + static constexpr bool kPadN = {pad_n}; + static constexpr bool kPadK = {pad_k}; + static constexpr bool APreshuffleQuant = false; + static constexpr bool BPreshuffleQuant = {preshuffle_bquant}; + static constexpr bool PreshuffleB = {preshuffle_b}; + static constexpr bool TransposeC = false; + static constexpr bool DoubleSmemBuffer = {double_smem_buffer}; + + using TileShape = ck_tile::TileGemmShape< + ck_tile::sequence, + ck_tile::sequence, + ck_tile::sequence>; + + using TilePartitioner = ck_tile::GemmTile1DPartitioner; + + using GemmTraits = ck_tile::TileGemmQuantTraits< + kPadM, kPadN, kPadK, + APreshuffleQuant, BPreshuffleQuant, PreshuffleB, + {ns}::ALayout, {ns}::BLayout, {ns}::CLayout, + ck_tile::QuantType::BQuantGrouped, + {ns}::AQLayout, {ns}::BQLayout, + TransposeC, DoubleSmemBuffer>; + + using GemmPipelineProblemBase = ck_tile::GemmPipelineProblemBase< + ADataType, BDataType, AccDataType, TileShape, GemmTraits>; + + using BaseGemmPipeline = {base_pipeline_ck}; + + static float launch(const ck_tile::QuantGemmHostArgs& args, + const ck_tile::stream_config& s) + {{ + // hot-loop / tail dispatch — mirrors run_gemm_quant_example.inc + const ck_tile::index_t K_split = + (args.k_batch == 1) + ? ck_tile::integer_least_multiple(args.K, TileK) + : ck_tile::get_splitk_batch_k_read(args.K, args.k_batch, TileK); + + const ck_tile::index_t num_loop = TilePartitioner::GetLoopNum(K_split); + const bool has_hot_loop = BaseGemmPipeline::BlockHasHotloop(num_loop); + const ck_tile::TailNumber tail_num = BaseGemmPipeline::GetBlockLoopTailNum(num_loop); + + const auto Run = [&](auto has_hot_loop_, auto tail_number_) {{ + using PipelineProblem = ck_tile::GemmBQuantPipelineProblem< + ADataType, + BDataType, + QDataType, + AccDataType, + TileShape, + GemmTraits, + QuantGroupSize, + ADataType, // ComputeDataType + {scheduler_ck}, + has_hot_loop_.value, + tail_number_.value>; + + using GemmPipeline = {pipeline_ck}; + +{epilogue_block} + + using Kernel = ck_tile::QuantGemmKernel< + TilePartitioner, GemmPipeline, GemmEpilogue, + ck_tile::QuantType::BQuantGrouped>; + + auto kargs = Kernel::MakeKernelArgs(args); + if(!Kernel::IsSupportedArgument(kargs)) + return -1.0f; + + const dim3 grids = Kernel::GridSize(args.M, args.N, args.k_batch); + const dim3 blocks = Kernel::BlockSize(); + return ck_tile::launch_kernel( + s, ck_tile::make_kernel(Kernel{{}}, grids, blocks, 0, kargs)); + }}; + + return BaseGemmPipeline::TailHandler(Run, has_hot_loop, tail_num); + }} +}}; + +using SelectedKernel = {struct}; + +}} // namespace {ns} + +#ifdef CK_TILE_SINGLE_KERNEL_INCLUDE +using SelectedKernel = {ns}::{struct}; +constexpr const char* KERNEL_NAME = {ns}::KERNEL_NAME; +using ADataType = {ck_a}; +using BDataType = {ck_b}; +using CDataType = {ck_c}; +using QDataType = {ck_q}; +using AccDataType = {ck_acc}; +using QuantGroupSize = {ns}::QuantGroupSize; +constexpr ck_tile::index_t GroupSizeK = {ns}::{struct}::GroupSizeK; +#endif // CK_TILE_SINGLE_KERNEL_INCLUDE +""" + + +# ============================================================================= +# Config sweep +# ============================================================================= + + +def _default_config() -> dict: + """Default sweep config matching GemmConfigQuantDecode tile defaults.""" + return { + "variant_keys": ["fp8", "bf8"], + "layouts": ["rcr"], + "pipeline": "compv3", + "epilogue": "cshuffle", + "scheduler": "intrawave", + "tile_configs": [ + # GemmConfigQuantDecode: M=16, N=64, K=256/sizeof(fp8_t)=256 + # WarpTileK=128: get_k_warp_tile() on gfx950 = 128 + {"tile_m": 16, "tile_n": 64, "tile_k": 256, + "warp_m": 1, "warp_n": 4, "warp_k": 1, + "warp_tile_m": 16, "warp_tile_n": 16, "warp_tile_k": 128}, + ], + "quant_groups": [ + {"quant_group_m": 1, "quant_group_n": 1, "quant_group_k": 128}, + ], + "pad_m": False, + "pad_n": False, + "pad_k": True, + "block_size": 256, + "k_block_per_cu": 1, + "double_smem_buffer": False, + "preshuffle_b": False, + "preshuffle_bquant": False, + } + + +def _build_specs(config: dict) -> List[BQuantKernelSpec]: + specs = [] + pipeline = config.get("pipeline", "compv3") + epilogue = config.get("epilogue", "cshuffle") + scheduler = config.get("scheduler", "intrawave") + pad_m = config.get("pad_m", False) + pad_n = config.get("pad_n", False) + pad_k = config.get("pad_k", True) + block_size = config.get("block_size", 256) + k_block_per_cu = config.get("k_block_per_cu", 1) + double_smem_buffer = config.get("double_smem_buffer", False) + preshuffle_b = config.get("preshuffle_b", False) + preshuffle_bquant = config.get("preshuffle_bquant", False) + + for variant_key, layout, tile_dict, qg in itertools.product( + config.get("variant_keys", ["fp8"]), + config.get("layouts", ["rcr"]), + config.get("tile_configs", []), + config.get("quant_groups", [{"quant_group_m": 1, "quant_group_n": 1, "quant_group_k": 128}]), + ): + if variant_key not in BQUANT_VARIANTS: + log.warning("Unknown variant_key %s — skipping", variant_key) + continue + if pipeline not in BQUANT_PIPELINE_MAP: + log.warning("Unsupported pipeline %s — skipping", pipeline) + continue + + tile = BQuantTileConfig( + tile_m=tile_dict["tile_m"], + tile_n=tile_dict["tile_n"], + tile_k=tile_dict["tile_k"], + warp_m=tile_dict["warp_m"], + warp_n=tile_dict["warp_n"], + warp_k=tile_dict["warp_k"], + warp_tile_m=tile_dict["warp_tile_m"], + warp_tile_n=tile_dict["warp_tile_n"], + warp_tile_k=tile_dict["warp_tile_k"], + ) + if not tile.is_valid(): + log.debug("Invalid tile config %s — skipping", tile) + continue + + specs.append(BQuantKernelSpec( + variant_key=variant_key, + layout=layout, + pipeline=pipeline, + epilogue=epilogue, + scheduler=scheduler, + tile=tile, + quant_group_m=qg.get("quant_group_m", 1), + quant_group_n=qg.get("quant_group_n", 1), + quant_group_k=qg.get("quant_group_k", 128), + preshuffle_b=preshuffle_b, + preshuffle_bquant=preshuffle_bquant, + double_smem_buffer=double_smem_buffer, + pad_m=pad_m, + pad_n=pad_n, + pad_k=pad_k, + block_size=block_size, + k_block_per_cu=k_block_per_cu, + )) + + return specs + + +# ============================================================================= +# Generation entry point +# ============================================================================= + + +def generate_kernels( + output_dir: Path, + config: Optional[dict] = None, + parallel: bool = True, +) -> List[Path]: + """Generate all BQuant kernel headers into output_dir. + + Returns list of generated .hpp paths. + """ + output_dir.mkdir(parents=True, exist_ok=True) + cfg = config or _default_config() + specs = _build_specs(cfg) + + if not specs: + log.warning("No kernel specs produced from config — check variant_keys and tile_configs") + return [] + + log.info("Generating %d BQuant kernel headers into %s", len(specs), output_dir) + + gen = BQuantKernelHeaderGenerator() + generated: List[Path] = [] + + def _generate_one(spec: BQuantKernelSpec) -> Path: + header = gen.generate(spec) + out_path = output_dir / f"{spec.name}.hpp" + out_path.write_text(header) + log.info(" wrote %s", out_path.name) + return out_path + + if parallel and len(specs) > 1: + import concurrent.futures + with concurrent.futures.ThreadPoolExecutor() as ex: + futures = {ex.submit(_generate_one, s): s for s in specs} + for fut in concurrent.futures.as_completed(futures): + try: + generated.append(fut.result()) + except Exception as e: + log.error("Failed generating %s: %s", futures[fut].name, e) + else: + for spec in specs: + try: + generated.append(_generate_one(spec)) + except Exception as e: + log.error("Failed generating %s: %s", spec.name, e) + + log.info("Generated %d / %d headers", len(generated), len(specs)) + return generated + + +# ============================================================================= +# CLI +# ============================================================================= + + +def main() -> int: + parser = argparse.ArgumentParser( + description="BQuantGrouped GEMM kernel header generator" + ) + parser.add_argument("--output-dir", type=Path, required=True, + help="Directory to write generated .hpp files") + parser.add_argument("--config", type=Path, + help="JSON config file (defaults to built-in sweep)") + parser.add_argument("--config-json", type=str, + help="Inline JSON config string") + parser.add_argument("--no-parallel", action="store_true", + help="Disable parallel generation") + parser.add_argument("--list-names", action="store_true", + help="Print kernel names that would be generated and exit") + args = parser.parse_args() + + cfg: Optional[dict] = None + if args.config_json: + try: + cfg = json.loads(args.config_json) + except json.JSONDecodeError as e: + log.error("Invalid --config-json: %s", e) + return 1 + elif args.config: + with open(args.config) as f: + cfg = json.load(f) + + if args.list_names: + specs = _build_specs(cfg or _default_config()) + for s in specs: + print(s.name) + return 0 + + paths = generate_kernels( + output_dir=args.output_dir, + config=cfg, + parallel=not args.no_parallel, + ) + return 0 if paths else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/dispatcher/codegen/unified_mx_gemm_codegen.py b/dispatcher/codegen/unified_mx_gemm_codegen.py new file mode 100644 index 00000000000..c05882d5153 --- /dev/null +++ b/dispatcher/codegen/unified_mx_gemm_codegen.py @@ -0,0 +1,282 @@ +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +MX GEMM code generator (TileEngine -> Dispatcher bridge). + +Emits ONE self-contained .hpp per concrete kernel config for the dispatcher's +ctypes path. To guarantee byte-identical kernels with Old-TE (the parity +contract), this generator does NOT re-implement the C++ header assembly -- it +directly reuses the Old-TE builder: + + tile_engine/ops/gemm/mx_gemm/mx_gemm_instance_builder.py + -> MxGemmKernelBuilder._generate_kernel_instance(tile_config, trait_combo) + +The generated instance defines, at GLOBAL scope, a ``SelectedKernel`` struct with +a static ``launch(const MxGemmHostArgs&, const ck_tile::stream_config&)``, the +``KERNEL_NAME`` string, and the ADataType/BDataType/CDataType/AccDataType/ +ScaleType/MxGemmHostArgs/ALayout/BLayout/CLayout aliases the ctypes lib expects. + +Each header is compiled per-kernel via force-include: + + hipcc -include -DCK_TILE_SINGLE_KERNEL_INCLUDE mx_gemm_ctypes_lib.cpp + +mx_gemm is microscaling GEMM (fp4/fp8 A*B, per-32-K e8m0 block scales), gfx950 +only. The single valid trait combo is comp_async + cshuffle + intrawave, with a +fixed 16x16x128 warp tile. +""" + +import argparse +import contextlib +import json +import logging +import sys +import tempfile +from pathlib import Path +from typing import Iterator, Optional, Tuple + +logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") +log = logging.getLogger(__name__) + + +# ============================================================================= +# Robust import of the Old-TE builder (independent of CWD). +# dispatcher/codegen/ -> ../../tile_engine/ops/gemm/mx_gemm +# ============================================================================= + +_THIS_DIR = Path(__file__).resolve().parent +_GEMM_DIR = (_THIS_DIR / ".." / ".." / "tile_engine" / "ops" / "gemm").resolve() +_MX_GEMM_DIR = _GEMM_DIR / "mx_gemm" + +for _p in (str(_GEMM_DIR), str(_MX_GEMM_DIR)): + if _p not in sys.path: + sys.path.insert(0, _p) + + +def _load_mx_builder(): + """Import MxGemmKernelBuilder from the Old-TE ops tree.""" + import importlib.util + + mx_path = _MX_GEMM_DIR / "mx_gemm_instance_builder.py" + spec = importlib.util.spec_from_file_location( + "mx_gemm_instance_builder", str(mx_path) + ) + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module.MxGemmKernelBuilder + + +# ============================================================================= +# Config validation (restrict to the single valid mx_gemm combo) +# ============================================================================= + +KERNEL_NAME_PREFIX = "mx_gemm" + +VALID_DATATYPES = {"fp4", "fp8"} +VALID_LAYOUT = "rcr" +VALID_PIPELINE = "comp_async" +VALID_EPILOGUE = "cshuffle" +VALID_SCHEDULER = "intrawave" +FIXED_WARP_TILE = (16, 16, 128) + +_REQUIRED_TILE_KEYS = ( + "tile_m", + "tile_n", + "tile_k", + "warp_m", + "warp_n", + "warp_k", + "warp_tile_m", + "warp_tile_n", + "warp_tile_k", +) + + +def _validate(cfg: dict) -> None: + datatype = cfg.get("datatype") + if datatype not in VALID_DATATYPES: + raise ValueError( + f"datatype must be one of {sorted(VALID_DATATYPES)}, got {datatype!r}" + ) + + layout = cfg.get("layout") + if layout != VALID_LAYOUT: + raise ValueError(f"layout must be {VALID_LAYOUT!r}, got {layout!r}") + + pipeline = cfg.get("pipeline", VALID_PIPELINE) + if pipeline != VALID_PIPELINE: + raise ValueError( + f"pipeline must be {VALID_PIPELINE!r} for mx_gemm, got {pipeline!r}" + ) + + epilogue = cfg.get("epilogue", VALID_EPILOGUE) + if epilogue != VALID_EPILOGUE: + raise ValueError( + f"epilogue must be {VALID_EPILOGUE!r} for mx_gemm, got {epilogue!r}" + ) + + scheduler = cfg.get("scheduler", VALID_SCHEDULER) + if scheduler != VALID_SCHEDULER: + raise ValueError( + f"scheduler must be {VALID_SCHEDULER!r} for mx_gemm, got {scheduler!r}" + ) + + tc = cfg.get("tile_config") + if not isinstance(tc, dict): + raise ValueError("config must contain a 'tile_config' object") + missing = [k for k in _REQUIRED_TILE_KEYS if k not in tc] + if missing: + raise ValueError(f"tile_config missing keys: {missing}") + + warp_tile = (tc["warp_tile_m"], tc["warp_tile_n"], tc["warp_tile_k"]) + if tuple(warp_tile) != FIXED_WARP_TILE: + raise ValueError( + f"mx_gemm warp tile is fixed at {FIXED_WARP_TILE}, got {tuple(warp_tile)}" + ) + + +def _tile_config_from_cfg(cfg: dict) -> dict: + tc = cfg["tile_config"] + return {k: int(tc[k]) for k in _REQUIRED_TILE_KEYS} + + +def _trait_combo_from_cfg(cfg: dict) -> Tuple: + """7-tuple: (pipeline, epilogue, scheduler, pad_m, pad_n, pad_k, persistent).""" + return ( + cfg.get("pipeline", VALID_PIPELINE), + cfg.get("epilogue", VALID_EPILOGUE), + cfg.get("scheduler", VALID_SCHEDULER), + bool(cfg.get("pad_m", False)), + bool(cfg.get("pad_n", False)), + bool(cfg.get("pad_k", False)), + bool(cfg.get("persistent", False)), + ) + + +# ============================================================================= +# Builder driver +# ============================================================================= + +_AUTOGEN_BANNER = """\ +// Auto-generated MX GEMM kernel instance -- DO NOT EDIT. +// Regenerate via dispatcher/codegen/unified_mx_gemm_codegen.py +// This header is force-included into the ctypes translation unit: +// hipcc -include -DCK_TILE_SINGLE_KERNEL_INCLUDE mx_gemm_ctypes_lib.cpp +// It defines at global scope: SelectedKernel, KERNEL_NAME, ADataType/BDataType/ +// CDataType/AccDataType/ScaleType, MxGemmHostArgs, and ALayout/BLayout/CLayout. +""" + + +@contextlib.contextmanager +def _make_builder(cfg: dict) -> Iterator["object"]: + """Yield an MxGemmKernelBuilder bound to a self-cleaning temp working dir. + + The Old-TE __init__ loads config_json only when it is an existing FILE path, + and _generate_kernel_instance reads config.get("k_block_per_cu"). So we write + a minimal config file (carrying k_block_per_cu) and hand its path to the + builder. The builder's own side-effect .hpp lands in the working dir (ignored). + + This is a context manager (not a plain factory) because it owns a temp dir: + kernel_name()/generate_kernel() are shelled frequently (e.g. --list-name), so + a leaked mkdtemp() per call would pile up mx_gemm_codegen_* dirs under /tmp. + The builder is only used inside the `with` block, so cleanup on exit is safe. + """ + MxGemmKernelBuilder = _load_mx_builder() + + with tempfile.TemporaryDirectory(prefix="mx_gemm_codegen_") as work_dir_str: + work_dir = Path(work_dir_str) + tmp_cfg = {"k_block_per_cu": int(cfg.get("k_block_per_cu", 1))} + cfg_path = work_dir / "mx_gemm_codegen_config.json" + cfg_path.write_text(json.dumps(tmp_cfg)) + + gpu_target = cfg.get("gpu_target") + if not gpu_target: + raise ValueError( + "mx_gemm codegen requires an explicit 'gpu_target' in the config; " + "do not default to a specific GPU architecture." + ) + yield MxGemmKernelBuilder( + KERNEL_NAME_PREFIX, + work_dir, + gpu_target, + cfg["datatype"], + cfg["layout"], + config_json=str(cfg_path), + ) + + +def _fix_includes(code: str) -> str: + """Drop the Old-TE builder's stale ``ck_tile/ops/gemm_mx.hpp`` umbrella include. + + That umbrella does not exist on develop; the mx kernel + comp_async pipeline + are already pulled in by ``ck_tile/ops/gemm.hpp`` (also emitted in the same + header), and the host-side preshuffle helper by ``ck_tile/host.hpp`` in the + ctypes TU. Removing the stale line keeps the generated header self-contained. + """ + out_lines = [] + for line in code.splitlines(keepends=True): + if '#include "ck_tile/ops/gemm_mx.hpp"' in line: + continue + out_lines.append(line) + return "".join(out_lines) + + +def _generate(cfg: dict) -> Tuple[str, str]: + """Return (kernel_name, instance_code) for the given concrete config.""" + _validate(cfg) + tile_config = _tile_config_from_cfg(cfg) + trait_combo = _trait_combo_from_cfg(cfg) + with _make_builder(cfg) as builder: + name, code = builder._generate_kernel_instance(tile_config, trait_combo) + return name, _fix_includes(code) + + +def kernel_name(cfg: dict) -> str: + """Compute the kernel name without generating/writing code.""" + _validate(cfg) + tile_config = _tile_config_from_cfg(cfg) + trait_combo = _trait_combo_from_cfg(cfg) + with _make_builder(cfg) as builder: + return builder._format_kernel_name(trait_combo, tile_config) + + +def generate_kernel(output_dir: Path, cfg: dict) -> Optional[Path]: + output_dir.mkdir(parents=True, exist_ok=True) + name, code = _generate(cfg) + out = output_dir / f"{name}.hpp" + out.write_text(_AUTOGEN_BANNER + code) + log.info("wrote %s", out.name) + return out + + +def main() -> int: + ap = argparse.ArgumentParser(description="MX GEMM kernel header generator") + ap.add_argument("--output-dir", type=Path) + ap.add_argument("--config", type=Path, help="path to a config JSON file") + ap.add_argument("--config-json", type=str, help="inline config JSON string") + ap.add_argument( + "--list-name", + action="store_true", + help="print the kernel name only; write no file", + ) + args = ap.parse_args() + + if args.config_json: + cfg = json.loads(args.config_json) + elif args.config: + cfg = json.loads(Path(args.config).read_text()) + else: + ap.error("one of --config-json or --config is required") + + if args.list_name: + print(kernel_name(cfg)) + return 0 + + if not args.output_dir: + ap.error("--output-dir is required unless --list-name is given") + + return 0 if generate_kernel(args.output_dir, cfg) else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/dispatcher/examples/gemm/cpp/02_grouped_gemm_driver.cpp b/dispatcher/examples/gemm/cpp/02_grouped_gemm_driver.cpp new file mode 100644 index 00000000000..6f8b20216e1 --- /dev/null +++ b/dispatcher/examples/gemm/cpp/02_grouped_gemm_driver.cpp @@ -0,0 +1,192 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +/** + * Minimal standalone grouped-GEMM driver (dispatcher way). + * + * Grouped GEMM cannot ride the standard dispatcher.run(A,B,C,problem) path: + * that backend hardcodes a single GemmHostArgs. Instead, this driver includes a + * single generated grouped kernel header (CK_TILE_SINGLE_KERNEL_INCLUDE) and + * calls SelectedKernel::launch(descs, stream) directly with a vector of + * descriptors -- the same 2-arg signature the dispatcher generates (workspace is + * allocated INSIDE launch()). It builds per-group tensors, runs, and verifies + * each group against ck_tile::reference_gemm. + * + * Build (single-kernel include style): + * hipcc -std=c++17 --offload-arch=gfx942 \ + * -DCK_TILE_SINGLE_KERNEL_INCLUDE \ + * -I /include -I \ + * -include /_grouped.hpp \ + * 02_grouped_gemm_driver.cpp -o grouped_gemm_driver + */ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "ck_tile/core.hpp" +#include "ck_tile/host.hpp" +#include "ck_tile/ops/gemm.hpp" + +// The generated grouped kernel header is injected on the command line with +// -include and -DCK_TILE_SINGLE_KERNEL_INCLUDE. It exports into the global +// namespace: SelectedKernel, ADataType, BDataType, CDataType, AccDataType, +// ALayout, BLayout, CLayout, and KERNEL_NAME. + +template +static constexpr inline auto is_row_major(Layout) +{ + return ck_tile::bool_constant< + std::is_same_v, ck_tile::tensor_layout::gemm::RowMajor>>{}; +} + +static std::vector parse_csv_ints(const std::string& s) +{ + std::vector out; + std::string cur; + for(char c : s) + { + if(c == ',') + { + if(!cur.empty()) + { + out.push_back(std::stoi(cur)); + cur.clear(); + } + } + else + cur.push_back(c); + } + if(!cur.empty()) + out.push_back(std::stoi(cur)); + return out; +} + +static std::string get_opt(int argc, char** argv, const std::string& key, const std::string& def) +{ + for(int i = 1; i < argc - 1; ++i) + if(key == argv[i]) + return argv[i + 1]; + return def; +} + +int main(int argc, char** argv) +{ + const int group_count = std::stoi(get_opt(argc, argv, "--groups", "8")); + const int kbatch = std::stoi(get_opt(argc, argv, "--kbatch", "1")); + const int warmup = std::stoi(get_opt(argc, argv, "--warmup", "10")); + const int repeat = std::stoi(get_opt(argc, argv, "--repeat", "50")); + const bool validate = get_opt(argc, argv, "--validate", "1") != "0"; + + std::vector Ms = parse_csv_ints(get_opt(argc, argv, "--Ms", "")); + std::vector Ns = parse_csv_ints(get_opt(argc, argv, "--Ns", "")); + std::vector Ks = parse_csv_ints(get_opt(argc, argv, "--Ks", "")); + + const int dm = std::stoi(get_opt(argc, argv, "--m", "256")); + const int dn = std::stoi(get_opt(argc, argv, "--n", "256")); + const int dk = std::stoi(get_opt(argc, argv, "--k", "512")); + + auto sz = static_cast(group_count); + if(Ms.size() != sz || Ns.size() != sz || Ks.size() != sz) + { + Ms.assign(group_count, dm); + Ns.assign(group_count, dn); + Ks.assign(group_count, dk); + } + + std::cout << "Kernel: " << KERNEL_NAME << "\n"; + std::cout << "groups=" << group_count << " kbatch=" << kbatch << "\n"; + + std::vector> a_host, b_host; + std::vector> c_host; + std::vector> a_dev, b_dev, c_dev; + std::vector sA(group_count), sB(group_count), sC(group_count); + + std::vector> descs; + descs.reserve(group_count); + + for(int i = 0; i < group_count; ++i) + { + const ck_tile::index_t M = Ms[i], N = Ns[i], K = Ks[i]; + sA[i] = ck_tile::get_default_stride(M, K, 0, is_row_major(ALayout{})); + sB[i] = ck_tile::get_default_stride(K, N, 0, is_row_major(BLayout{})); + sC[i] = ck_tile::get_default_stride(M, N, 0, is_row_major(CLayout{})); + + a_host.push_back(ck_tile::HostTensor( + ck_tile::host_tensor_descriptor(M, K, sA[i], is_row_major(ALayout{})))); + b_host.push_back(ck_tile::HostTensor( + ck_tile::host_tensor_descriptor(K, N, sB[i], is_row_major(BLayout{})))); + c_host.push_back(ck_tile::HostTensor( + ck_tile::host_tensor_descriptor(M, N, sC[i], is_row_major(CLayout{})))); + + ck_tile::FillUniformDistribution{-1.f, 1.f}(a_host[i]); + ck_tile::FillUniformDistribution{-1.f, 1.f}(b_host[i]); + c_host[i].SetZero(); + + a_dev.push_back(std::make_unique(a_host[i])); + b_dev.push_back(std::make_unique(b_host[i])); + c_dev.push_back(std::make_unique(c_host[i])); + c_dev[i]->SetZero(); + + descs.push_back(ck_tile::GroupedGemmHostArgs<>{a_dev[i]->GetDeviceBuffer(), + b_dev[i]->GetDeviceBuffer(), + {}, + c_dev[i]->GetDeviceBuffer(), + kbatch, + M, + N, + K, + sA[i], + sB[i], + {}, + sC[i]}); + } + + const ck_tile::stream_config s{nullptr, true, /*log=*/0, warmup, repeat}; + float ave_time = SelectedKernel::launch(descs, s); + + std::size_t flop = 0, bytes = 0; + for(int i = 0; i < group_count; ++i) + { + flop += std::size_t(2) * Ms[i] * Ns[i] * Ks[i]; + bytes += sizeof(ADataType) * Ms[i] * Ks[i] + sizeof(BDataType) * Ks[i] * Ns[i] + + sizeof(CDataType) * Ms[i] * Ns[i]; + } + const float tflops = static_cast(flop) / 1.E9 / ave_time; + const float gbps = static_cast(bytes) / 1.E6 / ave_time; + std::cout << "Perf: " << std::setw(10) << ave_time << " ms, " << tflops << " TFlops, " << gbps + << " GB/s\n"; + + for(int i = 0; i < group_count; ++i) + c_dev[i]->FromDevice(c_host[i].data()); + + bool pass = true; + if(validate) + { + for(int i = 0; i < group_count; ++i) + { + ck_tile::HostTensor ref( + ck_tile::host_tensor_descriptor(Ms[i], Ns[i], sC[i], is_row_major(CLayout{}))); + ref.SetZero(); + ck_tile::reference_gemm( + a_host[i], b_host[i], ref); + const float maxv = *std::max_element(ref.mData.begin(), ref.mData.end()); + const auto rtol = ck_tile::get_relative_threshold( + ck_tile::integer_divide_ceil(Ks[i], kbatch)); + const auto atol = ck_tile::get_absolute_threshold( + maxv / kbatch, ck_tile::integer_divide_ceil(Ks[i], kbatch)); + bool ok = + ck_tile::check_err(c_host[i], ref, "group[" + std::to_string(i) + "]", rtol, atol); + pass &= ok; + } + std::cout << "Verification: " << (pass ? "PASS" : "FAIL") << "\n"; + } + + return pass ? 0 : 1; +} diff --git a/dispatcher/examples/gemm/cpp/03_streamk_gemm_driver.cpp b/dispatcher/examples/gemm/cpp/03_streamk_gemm_driver.cpp new file mode 100644 index 00000000000..f8c032ca4d5 --- /dev/null +++ b/dispatcher/examples/gemm/cpp/03_streamk_gemm_driver.cpp @@ -0,0 +1,148 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +/** + * Minimal standalone stream-K GEMM driver (dispatcher way). + * + * Stream-K is a SINGLE GEMM that splits the K dimension across CUs and reduces + * the partial results through a device workspace. Like grouped GEMM it cannot + * ride the standard dispatcher.run(A,B,C,problem) path, so this driver includes + * a single generated stream-K kernel header (CK_TILE_SINGLE_KERNEL_INCLUDE) and + * calls SelectedKernel::launch(args, stream) directly with a single + * StreamKHostArgs -- the same 2-arg signature the dispatcher generates (the + * workspace is allocated INSIDE launch() via DeviceMem). It builds one A/B/C + * tensor, runs, and verifies against ck_tile::reference_gemm. + * + * Build (single-kernel include style): + * hipcc -std=c++17 --offload-arch=gfx942 -O3 \ + * -DCK_TILE_SINGLE_KERNEL_INCLUDE \ + * -I /include -I \ + * -include /_streamk.hpp \ + * 03_streamk_gemm_driver.cpp -o streamk_gemm_driver + */ + +#include + +#include +#include +#include +#include +#include + +#include "ck_tile/core.hpp" +#include "ck_tile/host.hpp" +#include "ck_tile/ops/gemm.hpp" + +#include "streamk_driver_common.hpp" + +// The generated stream-K kernel header is injected on the command line with +// -include and -DCK_TILE_SINGLE_KERNEL_INCLUDE. It exports into the global +// namespace: SelectedKernel, ADataType, BDataType, CDataType, AccDataType, +// ALayout, BLayout, CLayout, and KERNEL_NAME. + +int main(int argc, char** argv) +{ + const ck_tile::index_t M = std::stoll(get_opt(argc, argv, "--m", "3840")); + const ck_tile::index_t N = std::stoll(get_opt(argc, argv, "--n", "4096")); + const ck_tile::index_t K = std::stoll(get_opt(argc, argv, "--k", "2048")); + int warmup = std::stoi(get_opt(argc, argv, "--warmup", "50")); + int repeat = std::stoi(get_opt(argc, argv, "--repeat", "100")); + const bool validate = get_opt(argc, argv, "--validate", "1") != "0"; + + // Apple-to-apple with tile_engine: time the kernel with the SAME methodology the + // tile_engine benchmark uses (gemm_streamk_profiler.hpp) -- gpu timer and a + // cold-cache measurement that flushes the cache and rotates input buffers each + // iteration. tile_engine defaults: timer=true, flush_cache=true, rotating_count=1000. + // Without these the driver measured a warm-cache best case and over-reported TFlops, + // which is the entire source of the dispatcher-vs-TE "performance gap". + const bool gpu_timer = get_opt(argc, argv, "--timer", "1") != "0"; + bool flush_cache = get_opt(argc, argv, "--flush_cache", "1") != "0"; + int rotating_count = std::stoi(get_opt(argc, argv, "--rotating_count", "1000")); + + // Verification reads C back and compares against the reference for the known A/B. + // Rotating buffers and multi-repeat rotate/accumulate the output, so the C left on + // the device would not correspond to the reference inputs. tile_engine handles this + // with repeat_once_if_verify(); we mirror it -- a validating run times a single cold + // shot. Run a separate --validate 0 pass to collect apple-to-apple perf numbers. + if(validate) + { + warmup = 0; + repeat = 1; + flush_cache = false; + rotating_count = 1; + } + + std::cout << "Kernel: " << KERNEL_NAME << "\n"; + std::cout << "M=" << M << " N=" << N << " K=" << K << "\n"; + + const ck_tile::index_t sA = ck_tile::get_default_stride(M, K, 0, is_row_major(ALayout{})); + const ck_tile::index_t sB = ck_tile::get_default_stride(K, N, 0, is_row_major(BLayout{})); + const ck_tile::index_t sC = ck_tile::get_default_stride(M, N, 0, is_row_major(CLayout{})); + + ck_tile::HostTensor a_host( + ck_tile::host_tensor_descriptor(M, K, sA, is_row_major(ALayout{}))); + ck_tile::HostTensor b_host( + ck_tile::host_tensor_descriptor(K, N, sB, is_row_major(BLayout{}))); + ck_tile::HostTensor c_host( + ck_tile::host_tensor_descriptor(M, N, sC, is_row_major(CLayout{}))); + + ck_tile::FillUniformDistribution{-1.f, 1.f}(a_host); + ck_tile::FillUniformDistribution{-1.f, 1.f}(b_host); + c_host.SetZero(); + + ck_tile::DeviceMem a_dev(a_host); + ck_tile::DeviceMem b_dev(b_host); + ck_tile::DeviceMem c_dev(c_host); + c_dev.SetZero(); + + ck_tile::StreamKHostArgs args{a_dev.GetDeviceBuffer(), + b_dev.GetDeviceBuffer(), + c_dev.GetDeviceBuffer(), + M, + N, + K, + sA, + sB, + sC}; + + const ck_tile::stream_config s{ + nullptr, true, /*log=*/0, warmup, repeat, gpu_timer, flush_cache, rotating_count}; + float ave_time = SelectedKernel::launch(args, s); + + const std::size_t flop = std::size_t(2) * M * N * K; + const std::size_t bytes = + sizeof(ADataType) * M * K + sizeof(BDataType) * K * N + sizeof(CDataType) * M * N; + const float tflops = static_cast(flop) / 1.E9 / ave_time; + const float gbps = static_cast(bytes) / 1.E6 / ave_time; + std::cout << "Perf: " << std::setw(10) << ave_time << " ms, " << tflops << " TFlops, " << gbps + << " GB/s\n"; + + c_dev.FromDevice(c_host.data()); + + bool pass = true; + if(validate) + { + ck_tile::HostTensor ref( + ck_tile::host_tensor_descriptor(M, N, sC, is_row_major(CLayout{}))); + ref.SetZero(); + ck_tile::reference_gemm(a_host, b_host, ref); + const float maxv = *std::max_element(ref.mData.begin(), ref.mData.end()); + + // num_wgs_per_tile is the number of workgroups reducing into a single + // output tile (Stream-K has no fixed split-k), taken from the kernel's + // own tile partitioner so the driver and tile_engine agree on the split + // factor. streamk_tolerance() then widens the verify tolerance for the + // split-K accumulation error (see streamk_driver_common.hpp). + using ComputeType = + std::conditional_t; + auto kargs = SelectedKernel::StreamKGemmKernel::MakeKernelArgs(args); + const ck_tile::index_t num_wgs_per_tile = + std::max(1, kargs.tile_partitioner.estimate_num_wgs_per_tile()); + const auto tol = + streamk_tolerance(K, num_wgs_per_tile, maxv); + pass = ck_tile::check_err(c_host, ref, "streamk", tol.rtol, tol.atol); + std::cout << "Verification: " << (pass ? "PASS" : "FAIL") << "\n"; + } + + return pass ? 0 : 1; +} diff --git a/dispatcher/examples/gemm/cpp/04_streamk_registry_driver.cpp b/dispatcher/examples/gemm/cpp/04_streamk_registry_driver.cpp new file mode 100644 index 00000000000..5cd56d46bca --- /dev/null +++ b/dispatcher/examples/gemm/cpp/04_streamk_registry_driver.cpp @@ -0,0 +1,251 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +/** + * Stream-K GEMM driver through the Registry + Dispatcher (deep-core path). + * + * Unlike 03_streamk_gemm_driver.cpp (which calls SelectedKernel::launch() + * DIRECTLY, bypassing the dispatcher), this driver proves the full deep-core + * path that PR-A..PR-C built: + * + * Registry::register_kernel(GeneratedStreamKKernelInstance) + * -> Dispatcher::run(Problem.stream_k(Atomic)) + * -> Dispatcher::select_first_fit -> SK instance.supports() + * -> GeneratedStreamKKernelInstance::run -> SelectedKernel::launch() + * + * It registers ONE generated Stream-K kernel (force-included via + * -include / -DCK_TILE_SINGLE_KERNEL_INCLUDE), selects it through the registry + * by Problem::reduction_strategy, runs it, and verifies vs reference_gemm. + * + * Build (single-kernel include style): + * hipcc -std=c++17 --offload-arch=gfx942 -O3 \ + * -DCK_TILE_SINGLE_KERNEL_INCLUDE \ + * -I /include -I /dispatcher/include -I \ + * -include /_streamk.hpp \ + * 04_streamk_registry_driver.cpp -o streamk_registry_driver + */ + +#include + +#include +#include +#include +#include +#include + +#include "ck_tile/core.hpp" +#include "ck_tile/host.hpp" +#include "ck_tile/ops/gemm.hpp" + +#include "ck_tile/dispatcher/dispatcher.hpp" +#include "ck_tile/dispatcher/registry.hpp" +#include "ck_tile/dispatcher/backends/generated_tile_backend_streamk.hpp" + +#include "streamk_driver_common.hpp" + +// The generated stream-K kernel header is injected on the command line with +// -include and -DCK_TILE_SINGLE_KERNEL_INCLUDE. It exports into the global +// namespace: SelectedKernel, ADataType, BDataType, CDataType, AccDataType, +// ALayout, BLayout, CLayout, and KERNEL_NAME. + +#ifndef GFX_ARCH +#define GFX_ARCH "gfx942" +#endif + +using namespace ck_tile::dispatcher; +using namespace ck_tile::dispatcher::backends; +using Priority = ck_tile::dispatcher::Registry::Priority; + +// CLI parsing, layout/dtype tags, and the Stream-K verification tolerance are +// shared with the standalone 03 driver via streamk_driver_common.hpp +// (is_row_major, get_opt, dtype_enum_of, layout_tag_of, streamk_tolerance). + +// Build the KernelKey for the force-included Stream-K kernel. Only the Stream-K +// axis (streamk + reduction_strategy) governs selection; the remaining fields +// are populated for a faithful encode_identifier()/registry entry. +static KernelKey make_streamk_key(ReductionStrategy strategy) +{ + KernelKey key; + key.signature.dtype_a = dtype_enum_of(); + key.signature.dtype_b = dtype_enum_of(); + key.signature.dtype_c = dtype_enum_of(); + key.signature.dtype_acc = dtype_enum_of(); + key.signature.layout_a = layout_tag_of(); + key.signature.layout_b = layout_tag_of(); + key.signature.layout_c = layout_tag_of(); + key.signature.transpose_a = false; + key.signature.transpose_b = false; + key.signature.grouped = false; + // Stream-K performs its own K-dimension partitioning through the tile + // partitioner, so classic split-k is always 1 here. A value > 1 would + // describe a two-level K split the Stream-K kernel does not implement. + key.signature.split_k = 1; + key.signature.elementwise_op = "PassThrough"; + key.signature.num_d_tensors = 0; + key.signature.structured_sparsity = false; + + // Derive algorithm metadata from the generated kernel's own static traits so + // the registry identifier describes the kernel that was actually built, + // instead of assuming one tile/wave config. (Selection keys only on the + // Stream-K axis below, but a faithful identifier matters for logging and any + // future key-based lookup.) + key.algorithm.tile_shape = { + SelectedKernel::TileM, SelectedKernel::TileN, SelectedKernel::TileK}; + key.algorithm.warp_tile_shape = {static_cast(SelectedKernel::WarpTileM), + static_cast(SelectedKernel::WarpTileN), + static_cast(SelectedKernel::WarpTileK)}; + key.algorithm.wave_shape = {static_cast(SelectedKernel::WarpPerBlock_M), + static_cast(SelectedKernel::WarpPerBlock_N), + static_cast(SelectedKernel::WarpPerBlock_K)}; + // Pipeline (CompV3) and scheduler (Intrawave) are baked into the generated + // kernel's type, not exposed as standalone enum values, and are not part of + // the Stream-K selection axis -- they stay at the codegen defaults. + key.algorithm.pipeline = Pipeline::CompV3; + key.algorithm.scheduler = Scheduler::Intrawave; + key.algorithm.epilogue = Epilogue::CShuffle; + key.algorithm.block_size = SelectedKernel::BlockSize; + key.algorithm.double_buffer = SelectedKernel::DoubleSmemBuffer; + key.algorithm.persistent = SelectedKernel::UsePersistentKernel; + key.algorithm.preshuffle = SelectedKernel::Preshuffle; + key.algorithm.transpose_c = SelectedKernel::TransposeC; + key.algorithm.num_wave_groups = SelectedKernel::NumWaveGroups; + key.algorithm.pad_m = SelectedKernel::kPadM; + key.algorithm.pad_n = SelectedKernel::kPadN; + key.algorithm.pad_k = SelectedKernel::kPadK; + + // The Stream-K selection axis (the whole point of this path). + key.algorithm.streamk = true; + key.algorithm.reduction_strategy = strategy; + key.algorithm.workspace = (strategy != ReductionStrategy::Atomic); + + key.gfx_arch = GFX_ARCH; + return key; +} + +static ReductionStrategy parse_strategy(const std::string& s) +{ + if(s == "linear") + return ReductionStrategy::Linear; + if(s == "tree") + return ReductionStrategy::Tree; + return ReductionStrategy::Atomic; +} + +int main(int argc, char** argv) +{ + const ck_tile::index_t M = std::stoll(get_opt(argc, argv, "--m", "3840")); + const ck_tile::index_t N = std::stoll(get_opt(argc, argv, "--n", "4096")); + const ck_tile::index_t K = std::stoll(get_opt(argc, argv, "--k", "2048")); + const bool validate = get_opt(argc, argv, "--validate", "1") != "0"; + const ReductionStrategy strategy = parse_strategy(get_opt(argc, argv, "--strategy", "atomic")); + + std::cout << "Kernel: " << KERNEL_NAME << "\n"; + std::cout << "M=" << M << " N=" << N << " K=" << K << " strategy=" << to_string(strategy) + << "\n"; + + // --- Register the kernel into the global registry --------------------------- + KernelKey key = make_streamk_key(strategy); + auto kernel = create_generated_streamk_kernel(key, KERNEL_NAME); + Registry::instance().clear(); + Registry::instance().register_kernel(kernel, Priority::High); + std::cout << "Registered kernels: " << Registry::instance().size() + << " identifier=" << key.encode_identifier() << "\n"; + + // --- Build the problem requesting THIS Stream-K strategy -------------------- + Problem problem(M, N, K); + problem.streamk = true; + problem.reduction_strategy = strategy; + + Dispatcher dispatcher; + auto selected = dispatcher.select_kernel(problem); + if(!selected) + { + std::cout << "Dispatcher selected NO kernel for the Stream-K problem -> FAIL\n"; + return 1; + } + std::cout << "Dispatcher selected: " << selected->get_name() << "\n"; + + // --- Tensors (rcr) --------------------------------------------------------- + const ck_tile::index_t sA = ck_tile::get_default_stride(M, K, 0, is_row_major(ALayout{})); + const ck_tile::index_t sB = ck_tile::get_default_stride(K, N, 0, is_row_major(BLayout{})); + const ck_tile::index_t sC = ck_tile::get_default_stride(M, N, 0, is_row_major(CLayout{})); + + ck_tile::HostTensor a_host( + ck_tile::host_tensor_descriptor(M, K, sA, is_row_major(ALayout{}))); + ck_tile::HostTensor b_host( + ck_tile::host_tensor_descriptor(K, N, sB, is_row_major(BLayout{}))); + ck_tile::HostTensor c_host( + ck_tile::host_tensor_descriptor(M, N, sC, is_row_major(CLayout{}))); + + ck_tile::FillUniformDistribution{-1.f, 1.f}(a_host); + ck_tile::FillUniformDistribution{-1.f, 1.f}(b_host); + c_host.SetZero(); + + ck_tile::DeviceMem a_dev(a_host); + ck_tile::DeviceMem b_dev(b_host); + ck_tile::DeviceMem c_dev(c_host); + c_dev.SetZero(); + + // --- Run through the dispatcher (registry -> Dispatcher::run -> SK backend) - + float ave_time = 0.f; + try + { + ave_time = dispatcher.run( + a_dev.GetDeviceBuffer(), b_dev.GetDeviceBuffer(), c_dev.GetDeviceBuffer(), problem); + } + catch(const std::exception& e) + { + std::cout << "Dispatcher::run threw: " << e.what() << " -> FAIL\n"; + return 1; + } + + const std::size_t flop = std::size_t(2) * M * N * K; + const std::size_t bytes = + sizeof(ADataType) * M * K + sizeof(BDataType) * K * N + sizeof(CDataType) * M * N; + const float tflops = static_cast(flop) / 1.E9 / ave_time; + const float gbps = static_cast(bytes) / 1.E6 / ave_time; + std::cout << "Perf: " << std::setw(10) << ave_time << " ms, " << tflops << " TFlops, " << gbps + << " GB/s\n"; + + c_dev.FromDevice(c_host.data()); + + bool pass = true; + if(validate) + { + ck_tile::HostTensor ref( + ck_tile::host_tensor_descriptor(M, N, sC, is_row_major(CLayout{}))); + ref.SetZero(); + ck_tile::reference_gemm(a_host, b_host, ref); + const float maxv = *std::max_element(ref.mData.begin(), ref.mData.end()); + + // num_wgs_per_tile is the number of workgroups reducing into a single + // output tile (Stream-K has no fixed split-k), taken from the kernel's + // own tile partitioner so this driver and tile_engine agree on the split + // factor. streamk_tolerance() then widens the verify tolerance for the + // split-K accumulation error (see streamk_driver_common.hpp). + ck_tile::StreamKHostArgs sk_args{a_dev.GetDeviceBuffer(), + b_dev.GetDeviceBuffer(), + c_dev.GetDeviceBuffer(), + M, + N, + K, + sA, + sB, + sC}; + using ComputeType = + std::conditional_t; + auto kargs = SelectedKernel::StreamKGemmKernel::MakeKernelArgs(sk_args); + const ck_tile::index_t num_wgs_per_tile = + std::max(1, kargs.tile_partitioner.estimate_num_wgs_per_tile()); + const auto tol = + streamk_tolerance(K, num_wgs_per_tile, maxv); + pass = ck_tile::check_err(c_host, ref, "streamk_registry", tol.rtol, tol.atol); + std::cout << "Verification: " << (pass ? "PASS" : "FAIL") << "\n"; + } + + return pass ? 0 : 1; +} diff --git a/dispatcher/examples/gemm/cpp/README.md b/dispatcher/examples/gemm/cpp/README.md index 79d60d11989..6b84443ea41 100644 --- a/dispatcher/examples/gemm/cpp/README.md +++ b/dispatcher/examples/gemm/cpp/README.md @@ -37,6 +37,7 @@ cd examples | [04_heuristics.cpp](04_heuristics.cpp) | Heuristic-based kernel selection | | [05_json_export.cpp](05_json_export.cpp) | Registry JSON export for external tools | | [06_multi_registry.cpp](06_multi_registry.cpp) | Multiple registries with named kernel sets | +| [02_grouped_gemm_driver.cpp](02_grouped_gemm_driver.cpp) | Standalone grouped (batched) GEMM driver: builds per-group descriptors, launches `GroupedGemmKernel`, verifies each group | ## Example Details @@ -113,6 +114,31 @@ Consolidated example combining performance benchmarking with correctness validat - GPU reference validation using `ck_tile::reference_gemm_gpu` - Configurable tolerances +### 02_grouped_gemm_driver.cpp - Grouped (Batched) GEMM +Standalone driver for the `grouped` codegen variant. One generated grouped kernel header is +injected on the command line (`-include _grouped.hpp -DCK_TILE_SINGLE_KERNEL_INCLUDE`); +the driver reads the kernel's `ADataType/BDataType/CDataType/ALayout/BLayout/CLayout` so it +works for any datatype/layout the kernel was generated for (no hardcoded `fp16`/`rcr`). + +```bash +# Build against one generated grouped kernel +hipcc -std=c++17 --offload-arch=gfx942 -O3 -DCK_TILE_SINGLE_KERNEL_INCLUDE \ + -I ../../../include -I ../../../../include \ + -I generated_kernels \ + -include gemm_fp16_rcr_compv3_..._grouped.hpp \ + 02_grouped_gemm_driver.cpp -o gemm_02_grouped + +# Run: 8 groups, verify each group against the CPU reference +./gemm_02_grouped --groups 8 --Ms 3840 --Ns 4096 --Ks 2048 \ + --warmup 50 --repeat 100 --validate 1 +``` + +**Features:** +- Builds a vector of per-group `GroupedGemmHostArgs` descriptors (per-group M/N/K) +- Layout-driven leading dimensions via `get_default_stride(is_row_major(Layout))` +- Per-group correctness check using `ck_tile::reference_gemm` +- Reports per-group PASS/FAIL plus aggregate TFLOPS + ### 04_heuristics.cpp - Heuristic Selection Demonstrates custom kernel selection based on problem characteristics: diff --git a/dispatcher/examples/gemm/cpp/streamk_driver_common.hpp b/dispatcher/examples/gemm/cpp/streamk_driver_common.hpp new file mode 100644 index 00000000000..e30784619ea --- /dev/null +++ b/dispatcher/examples/gemm/cpp/streamk_driver_common.hpp @@ -0,0 +1,101 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +#pragma once + +/** + * Shared helpers for the Stream-K GEMM example drivers (03 standalone and 04 + * registry). Kept in one place so the two drivers do not duplicate CLI parsing, + * layout/dtype tags, and the Stream-K verification tolerance. + */ + +#include +#include +#include + +#include "ck_tile/core.hpp" +#include "ck_tile/host.hpp" +#include "ck_tile/ops/gemm.hpp" + +#include "ck_tile/dispatcher/kernel_key.hpp" + +template +constexpr auto is_row_major(Layout) +{ + return ck_tile::bool_constant< + std::is_same_v, ck_tile::tensor_layout::gemm::RowMajor>>{}; +} + +inline std::string get_opt(int argc, char** argv, const std::string& key, const std::string& def) +{ + for(int i = 1; i < argc - 1; ++i) + if(key == argv[i]) + return argv[i + 1]; + return def; +} + +// Map a ck_tile element type to the dispatcher's DataType enum so the registry +// key reflects the kernel that was actually generated (fp16/bf16/fp8/bf8/...), +// instead of assuming fp16. Keeps the registry identifier and selection correct +// across every datatype the codegen emits. +template +constexpr ck_tile::dispatcher::DataType dtype_enum_of() +{ + using U = ck_tile::remove_cvref_t; + if constexpr(std::is_same_v) + return ck_tile::dispatcher::DataType::FP16; + else if constexpr(std::is_same_v) + return ck_tile::dispatcher::DataType::BF16; + else if constexpr(std::is_same_v) + return ck_tile::dispatcher::DataType::FP8; + else if constexpr(std::is_same_v) + return ck_tile::dispatcher::DataType::BF8; + else if constexpr(std::is_same_v) + return ck_tile::dispatcher::DataType::INT8; + else if constexpr(std::is_same_v) + return ck_tile::dispatcher::DataType::FP32; + else + return ck_tile::dispatcher::DataType::UNKNOWN; +} + +template +constexpr ck_tile::dispatcher::LayoutTag layout_tag_of() +{ + return std::is_same_v, ck_tile::tensor_layout::gemm::RowMajor> + ? ck_tile::dispatcher::LayoutTag::RowMajor + : ck_tile::dispatcher::LayoutTag::ColMajor; +} + +struct StreamKTolerance +{ + double rtol; + double atol; +}; + +// Stream-K verification tolerance. Stream-K splits K across CUs and reduces the +// partials; atomic reduction accumulates them directly into low-precision C, so +// the tolerance must account for the split-K accumulation error -- exactly as +// tile_engine's calculate_rtol_atol does. The plain single-pass +// get_relative/absolute_threshold(K) under-estimates the error and would +// spuriously FAIL correct atomic results on small-M/N, large-K shapes. +// +// `num_wgs_per_tile` is the number of workgroups reducing into a single output +// tile (Stream-K has no fixed split-k), taken from the kernel's own tile +// partitioner so the driver and tile_engine agree on the split factor. +template +inline StreamKTolerance +streamk_tolerance(ck_tile::index_t K, ck_tile::index_t num_wgs_per_tile, float maxv) +{ + const ck_tile::index_t k_per_split = ck_tile::integer_divide_ceil(K, num_wgs_per_tile); + // single-pass (per-split) tolerance + const double rtol_base = + ck_tile::get_relative_threshold(k_per_split); + const double atol_base = ck_tile::get_absolute_threshold( + maxv / num_wgs_per_tile, k_per_split); + // error contributed by reducing num_wgs_per_tile partials in low-precision C + const double rtol_split_k = + ck_tile::get_relative_threshold(num_wgs_per_tile); + const double atol_split_k = + ck_tile::get_absolute_threshold(maxv, num_wgs_per_tile); + return {std::max(rtol_base, rtol_split_k), std::max(atol_base, atol_split_k)}; +} diff --git a/dispatcher/examples/gemm/python/13_grouped_gemm_bquant.py b/dispatcher/examples/gemm/python/13_grouped_gemm_bquant.py new file mode 100644 index 00000000000..2fe1449e9f7 --- /dev/null +++ b/dispatcher/examples/gemm/python/13_grouped_gemm_bquant.py @@ -0,0 +1,242 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +Example 13 — GroupedGemm BQuant via the Dispatcher + +Demonstrates the full three-layer path: + 1. Codegen — unified_grouped_gemm_bquant_codegen.py → .hpp + 2. Compile — hipcc → .so + 3. Run — BQuantGpuGemmRunner → C = A @ dequant(B, BQ) + +Verifies the GPU result against a NumPy fp32 reference. + +Requirements: + - gfx950 GPU (MI350X) + - hipcc in PATH + - CK include path discoverable relative to this repo + +Usage: + python3 13_grouped_gemm_bquant.py # fp8, 1x1x128 groups, M=16 N=64 K=256 + python3 13_grouped_gemm_bquant.py --dtype bf8 + python3 13_grouped_gemm_bquant.py --dtype fp8 --M 32 --N 128 --K 512 --quant-group-k 128 + python3 13_grouped_gemm_bquant.py --no-verify # skip CPU reference check +""" + +import argparse +import logging +import math +import sys +import tempfile +from pathlib import Path + +import numpy as np + +# Add dispatcher/python to path +sys.path.insert(0, str(Path(__file__).resolve().parents[3] / "python")) + +from grouped_gemm_bquant_utils import ( + BQuantKernelConfig, + BQuantGemmProblem, + BQuantGpuGemmRunner, + setup_multiple_bquant_dispatchers, + default_fp8_config, + default_bf8_config, +) + +logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") +log = logging.getLogger(__name__) + + +# ============================================================================= +# NumPy reference: C = A @ dequant(B, BQ) +# ============================================================================= + + +def _float32_to_fp8(arr: np.ndarray, dtype: str) -> np.ndarray: + """Encode float32 values as fp8 bytes (uint8 view of the fp8 bit pattern). + + dtype: "fp8" -> float8_e4m3fn, "bf8" -> float8_e5m2. + Falls back to clamping the float32 values to [-2.0, 2.0] and storing as + uint8 when ml_dtypes is not installed; the bit patterns are not true fp8 in + that case but the buffer has the correct element size (1 byte/element). + """ + try: + import ml_dtypes + ml_t = ml_dtypes.float8_e4m3fn if dtype == "fp8" else ml_dtypes.float8_e5m2 + return arr.astype(ml_t).view(np.uint8) + except ImportError: + # Fallback: clamp to a small range so values fit in fp8, store as uint8. + # The bit patterns are not genuine fp8, but the buffer size is correct. + clamped = np.clip(arr, -2.0, 2.0) + return (clamped * 64).astype(np.int8).view(np.uint8) + + +def _fp8_to_float32(arr: np.ndarray, dtype: str) -> np.ndarray: + """Decode fp8 bytes (uint8 view) back to float32. + + dtype: "fp8" -> float8_e4m3fn, "bf8" -> float8_e5m2. + Must be called on the same array produced by _float32_to_fp8 to get the + values the kernel actually computes on. + """ + try: + import ml_dtypes + ml_t = ml_dtypes.float8_e4m3fn if dtype == "fp8" else ml_dtypes.float8_e5m2 + return arr.view(ml_t).astype(np.float32) + except ImportError: + return arr.view(np.int8).astype(np.float32) / 64.0 + + +def reference_bquant_gemm( + A: np.ndarray, + B: np.ndarray, + BQ: np.ndarray, + problem: BQuantGemmProblem, +) -> np.ndarray: + """ + CPU fp32 reference for C = A @ dequant(B, BQ). + + A [M, K] float32 — must be decoded from the same fp8 bytes sent to the GPU + B [K, N] float32 — must be decoded from the same fp8 bytes sent to the GPU + BQ [QK_B, QN_B] float32 scale factors + + Dequant: B[k, n] *= BQ[k // gK, n // gN] + """ + M, N, K = problem.M, problem.N, problem.K + gK = problem.quant_group_k + gN = problem.quant_group_n + + A_f32 = A.astype(np.float32) + B_f32 = B.astype(np.float32) + + # Apply per-block scales to B + B_dequant = B_f32.copy() + for qi in range(problem.QK_B): + for qj in range(problem.QN_B): + k_start = qi * gK + k_end = min(k_start + gK, K) + n_start = qj * gN + n_end = min(n_start + gN, N) + scale = float(BQ[qi, qj]) + B_dequant[k_start:k_end, n_start:n_end] *= scale + + C_ref = A_f32 @ B_dequant + return C_ref.astype(np.float16) + + +# ============================================================================= +# Main +# ============================================================================= + + +def main(): + parser = argparse.ArgumentParser(description="GroupedGemm BQuant dispatcher example") + parser.add_argument("--dtype", choices=["fp8", "bf8"], default="fp8") + parser.add_argument("--M", type=int, default=16) + parser.add_argument("--N", type=int, default=64) + parser.add_argument("--K", type=int, default=256) + parser.add_argument("--quant-group-k", type=int, default=128) + parser.add_argument("--quant-group-n", type=int, default=1) + parser.add_argument("--no-verify", action="store_true") + parser.add_argument("--output-dir", type=Path, default=None) + parser.add_argument("--gfx-arch", type=str, default="gfx950") + args = parser.parse_args() + + M, N, K = args.M, args.N, args.K + gK = args.quant_group_k + gN = args.quant_group_n + + # ------------------------------------------------------------------------- + # 1. Build kernel config + # ------------------------------------------------------------------------- + if args.dtype == "fp8": + config = default_fp8_config(quant_group_k=gK, quant_group_n=gN, gfx_arch=args.gfx_arch) + else: + config = default_bf8_config(quant_group_k=gK, quant_group_n=gN, gfx_arch=args.gfx_arch) + + log.info("Kernel: %s", config.name) + + # ------------------------------------------------------------------------- + # 2. Codegen + compile + # ------------------------------------------------------------------------- + out_dir = args.output_dir or Path(tempfile.mkdtemp(prefix="bquant_ex13_")) + log.info("Output dir: %s", out_dir) + + so_paths = setup_multiple_bquant_dispatchers( + configs=[config], + output_dir=out_dir, + gfx_arch=args.gfx_arch, + ) + + if not so_paths or so_paths[0] is None: + log.error("Kernel build failed — see errors above") + return 1 + + so_path = so_paths[0] + log.info("Built: %s", so_path) + + # ------------------------------------------------------------------------- + # 3. Generate inputs + # ------------------------------------------------------------------------- + rng = np.random.default_rng(42) + QK_B = math.ceil(K / gK) + QN_B = math.ceil(N / gN) + + # Generate float32 values in the fp8 representable range, then encode as + # real fp8 bytes (1 byte/element) so the C layer receives the correct size. + A_f32 = rng.uniform(-2.0, 2.0, (M, K)).astype(np.float32) + B_f32 = rng.uniform(-2.0, 2.0, (K, N)).astype(np.float32) + BQ_f32 = rng.uniform(0.5, 2.0, (QK_B, QN_B)).astype(np.float32) + + # Encode as fp8 bytes (uint8 view). _float32_to_fp8 uses ml_dtypes when + # available for accurate fp8 bit patterns, with a fallback otherwise. + A_raw = _float32_to_fp8(A_f32, args.dtype) # shape (M, K), 1 byte/element + B_raw = _float32_to_fp8(B_f32, args.dtype) # shape (K, N), 1 byte/element + + # Decode back to float32 so the CPU reference sees the same values the + # kernel will compute on (fp8 encoding introduces rounding). + A_dec = _fp8_to_float32(A_raw, args.dtype) + B_dec = _fp8_to_float32(B_raw, args.dtype) + + # ------------------------------------------------------------------------- + # 4. Run on GPU + # ------------------------------------------------------------------------- + problem = BQuantGemmProblem(M=M, N=N, K=K, + quant_group_m=1, + quant_group_n=gN, + quant_group_k=gK) + + runner = BQuantGpuGemmRunner(so_path) + log.info("Running kernel: %s", runner.kernel_name) + + result = runner.run(A=A_raw, B=B_raw, BQ=BQ_f32, problem=problem) + log.info("Kernel time: %.3f ms", result.time_ms) + + # ------------------------------------------------------------------------- + # 5. Verify + # ------------------------------------------------------------------------- + if not args.no_verify: + # Reference uses decoded fp8 values — the same bit patterns the kernel sees. + C_ref = reference_bquant_gemm(A_dec, B_dec, BQ_f32, problem) + C_gpu = result.C + + max_rel = float(np.max(np.abs(C_gpu.astype(np.float32) - C_ref.astype(np.float32))) + / (np.max(np.abs(C_ref.astype(np.float32))) + 1e-6)) + + tolerance = 0.05 # fp8 ~1e-2 to 5e-2 + if max_rel <= tolerance: + log.info("PASSED (max_rel=%.4f, tol=%.4f)", max_rel, tolerance) + else: + log.error("FAILED (max_rel=%.4f > tol=%.4f)", max_rel, tolerance) + return 1 + else: + log.info("Verification skipped (--no-verify)") + + log.info("Example 13 complete.") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/dispatcher/examples/gemm/python/tile_engine_dispatcher_bridge.py b/dispatcher/examples/gemm/python/tile_engine_dispatcher_bridge.py new file mode 100644 index 00000000000..715c11ea30f --- /dev/null +++ b/dispatcher/examples/gemm/python/tile_engine_dispatcher_bridge.py @@ -0,0 +1,279 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +Example 12: Tile Engine -> Dispatcher bridge (gallery) + +Unlike examples 01-11 (which drive the Dispatcher's native ctypes Registry), +this example exercises the *Tile Engine -> Dispatcher bridge* in +``dispatcher/python/gemm_utils.py``. The bridge is the path the Tile Engine +itself uses: one common ``GemmKernelConfig`` feeds codegen, force-include +compile, and a flat extern "C" ABI, and ``GpuGemmRunner`` runs the resulting +.so against a NumPy reference. + +It is a small gallery of three demos that together cover the surface the bridge +gained over its original fp16/rcr-only slice: + + matrix every (dtype, layout) pair the universal GEMM supports -- fp16 and + bf16 across the four row/col A/B combinations (row-major C only). + shapes why padding matters: a padded kernel accepts an awkward, non-tile- + aligned problem (M, N not divisible by the tile) while the equivalent + no-pad kernel rejects it -- the same selection rule the Tile Engine + sees when it sweeps pad on/off. + sweep the "search space" idea: one fixed signature, several *algorithms* + (tile / wave / pipeline), built and ranked by measured TFLOPS -- a + miniature of what the Tile Engine driver does at scale. + +(Kernel *variants* such as Stream-K and grouped GEMM ride the same bridge but +live on separate branches; this example stays within the regular GEMM stack.) + +Usage: + python3 tile_engine_dispatcher_bridge.py # runs all three demos + python3 tile_engine_dispatcher_bridge.py --demo matrix + python3 tile_engine_dispatcher_bridge.py --demo shapes + python3 tile_engine_dispatcher_bridge.py --demo sweep + python3 tile_engine_dispatcher_bridge.py --size 1024 --rtol 2e-2 --arch gfx950 +""" + +import sys +import argparse +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent / "python")) +import numpy as np # noqa: E402 + +from gemm_utils import ( # noqa: E402 + GemmKernelConfig, + GemmProblem, + GpuGemmRunner, + setup_multiple_gemm_dispatchers, +) +from ctypes_utils import detect_gpu_arch # noqa: E402 + +# A single algorithm known to compile and run on gfx942. Only the Signature +# (dtype + layout) varies in the matrix demo; the Algorithm is held fixed so the +# demo isolates the bridge's dtype/layout generality. +_ALGO = dict( + tile_m=64, tile_n=64, tile_k=64, + wave_m=4, wave_n=1, wave_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + pipeline="compv3", scheduler="intrawave", epilogue="cshuffle", + pad_m=False, pad_n=False, pad_k=False, +) + +# (dtype, layout) pairs. Column-major C (e.g. rcc) is rejected at build by the +# universal GEMM, so every case keeps row-major C -- which leaves exactly four +# A/B combinations (rcr/rrr/ccr/crr). Both dtypes cover all four. +_CASES = [ + ("fp16", "rcr"), ("fp16", "rrr"), ("fp16", "ccr"), ("fp16", "crr"), + ("bf16", "rcr"), ("bf16", "rrr"), ("bf16", "ccr"), ("bf16", "crr"), +] + +_LAYOUT_WORD = {"r": "row", "c": "col"} + + +def _emulate(x: np.ndarray, dtype: str) -> np.ndarray: + """Round fp32 inputs to the kernel's storage dtype so the CPU reference + matches what the GPU actually multiplies.""" + if dtype == "bf16": + u32 = np.ascontiguousarray(x, dtype=np.float32).view(np.uint32) + rounded = (u32 + ((u32 >> 16) & 1) + np.uint32(0x7FFF)) >> 16 + return (rounded.astype(np.uint32) << 16).view(np.float32) + return x.astype(np.float16).astype(np.float32) + + +def _max_rel(out: np.ndarray, ref: np.ndarray) -> float: + # Global relative error (normalize by the largest reference magnitude): + # per-element ratios explode on the near-zero entries that K-length + # accumulation of zero-mean data produces, so they are not meaningful. + denom = float(np.max(np.abs(ref))) + 1e-12 + return float(np.max(np.abs(out - ref))) / denom + + +def _config(dtype: str, layout: str, arch: str, **algo) -> GemmKernelConfig: + la, lb, lc = layout + return GemmKernelConfig( + dtype_a=dtype, dtype_b=dtype, dtype_c=dtype, + layout_a=_LAYOUT_WORD[la], layout_b=_LAYOUT_WORD[lb], layout_c=_LAYOUT_WORD[lc], + gfx_arch=arch, **(algo or _ALGO), + ) + + +def _reference(A, B, dtype): + # Emulate both input quantization (A,B stored as dtype) and the output store + # (GPU writes C back as dtype_c), so round on both ends before comparing. + return _emulate(_emulate(A, dtype) @ _emulate(B, dtype), dtype) + + +# --------------------------------------------------------------------------- +# Demo 1: dtype x layout matrix +# --------------------------------------------------------------------------- +def demo_matrix(size, rtol, arch): + print(f"\n[matrix] dtype x layout, M=N=K={size}, rtol={rtol:g}") + problem = GemmProblem(M=size, N=size, K=size) + configs = [_config(dt, lay, arch) for dt, lay in _CASES] + so_paths = setup_multiple_gemm_dispatchers(configs, verbose=False) + + rng = np.random.default_rng(42) + A = (rng.standard_normal((problem.M, problem.K)) * 0.1).astype(np.float32) + B = (rng.standard_normal((problem.K, problem.N)) * 0.1).astype(np.float32) + + n_pass = 0 + for (dtype, layout), so in zip(_CASES, so_paths): + tag = f"{dtype}/{layout}" + if so is None: + print(f" {tag:10s} BUILD FAILED") + continue + result = GpuGemmRunner(lib_path=so).run(A, B, problem) + if not result.success: + print(f" {tag:10s} RUN FAILED (status {result.status})") + continue + mr = _max_rel(result.output, _reference(A, B, dtype)) + ok = mr <= rtol + n_pass += ok + print(f" {tag:10s} tflops={result.tflops:7.1f} max_rel={mr:.2e} " + f"{'PASS' if ok else 'FAIL'}") + print(f" -> {n_pass}/{len(_CASES)} passed") + return n_pass, len(_CASES) + + +# --------------------------------------------------------------------------- +# Demo 2: padding vs an awkward (non-tile-aligned) shape +# --------------------------------------------------------------------------- +def demo_shapes(rtol, arch): + print("\n[shapes] padding lets a kernel accept a non-tile-aligned problem") + # 128-tile kernels; awkward M, N do not divide 128 (K stays divisible by 8 + # for the fp16 vectorized reduction load). + algo_pad = dict( + tile_m=128, tile_n=128, tile_k=32, wave_m=2, wave_n=2, wave_k=1, + warp_tile_m=32, warp_tile_n=32, warp_tile_k=16, + pipeline="compv4", scheduler="intrawave", epilogue="cshuffle", + pad_m=True, pad_n=True, pad_k=True, + ) + algo_nopad = dict(algo_pad, pad_m=False, pad_n=False, pad_k=False) + + cfg_pad = _config("fp16", "rcr", arch, **algo_pad) + cfg_nopad = _config("fp16", "rcr", arch, **algo_nopad) + so_pad, so_nopad = setup_multiple_gemm_dispatchers([cfg_pad, cfg_nopad], verbose=False) + + M, N, K = 257, 129, 512 # awkward: 257, 129 not divisible by 128 + problem = GemmProblem(M=M, N=N, K=K) + rng = np.random.default_rng(7) + A = (rng.standard_normal((M, K)) * 0.1).astype(np.float32) + B = (rng.standard_normal((K, N)) * 0.1).astype(np.float32) + ref = _reference(A, B, "fp16") + + print(f" awkward problem M={M} N={N} K={K} (M,N not divisible by tile 128)") + n_pass = 0 + expectations = [("padded", so_pad, True), ("no-pad", so_nopad, False)] + for label, so, should_pass in expectations: + if so is None: + print(f" {label:8s} BUILD FAILED") + continue + result = GpuGemmRunner(lib_path=so).run(A, B, problem) + if result.success: + mr = _max_rel(result.output, ref) + accepted = mr <= rtol + outcome = f"ACCEPTED tflops={result.tflops:7.1f} max_rel={mr:.2e}" + else: + accepted = False + # status -2 == select_kernel found no kernel whose tiling fits. + outcome = f"REJECTED (status {result.status})" + # "Correct" = the no-pad kernel rejects and the padded one accepts. + correct = accepted == should_pass + n_pass += correct + print(f" {label:8s} {outcome:42s} {'as expected' if correct else 'UNEXPECTED'}") + print(f" -> {n_pass}/2 behaved as expected (padded accepts, no-pad rejects)") + return n_pass, 2 + + +# --------------------------------------------------------------------------- +# Demo 3: algorithm sweep over one fixed signature +# --------------------------------------------------------------------------- +def demo_sweep(size, rtol, arch): + print(f"\n[sweep] fixed fp16/rcr signature, several algorithms, M=N=K={size}") + # A handful of distinct algorithms (the Tile Engine sweeps thousands of + # these). Each is a different tile / wave / pipeline point in the search + # space; padding is on so any size is accepted. + algos = [ + dict(tile_m=128, tile_n=128, tile_k=32, wave_m=2, wave_n=2, wave_k=1, + warp_tile_m=32, warp_tile_n=32, warp_tile_k=16, pipeline="compv4"), + dict(tile_m=256, tile_n=128, tile_k=32, wave_m=2, wave_n=2, wave_k=1, + warp_tile_m=32, warp_tile_n=32, warp_tile_k=16, pipeline="compv4"), + dict(tile_m=128, tile_n=128, tile_k=64, wave_m=2, wave_n=2, wave_k=1, + warp_tile_m=32, warp_tile_n=32, warp_tile_k=16, pipeline="compv3"), + dict(tile_m=64, tile_n=64, tile_k=64, wave_m=4, wave_n=1, wave_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, pipeline="compv3"), + ] + common = dict(scheduler="intrawave", epilogue="cshuffle", + pad_m=True, pad_n=True, pad_k=True) + configs = [_config("fp16", "rcr", arch, **dict(a, **common)) for a in algos] + so_paths = setup_multiple_gemm_dispatchers(configs, verbose=False) + + problem = GemmProblem(M=size, N=size, K=size) + rng = np.random.default_rng(123) + A = (rng.standard_normal((size, size)) * 0.1).astype(np.float32) + B = (rng.standard_normal((size, size)) * 0.1).astype(np.float32) + ref = _reference(A, B, "fp16") + + rows = [] + for cfg, so in zip(configs, so_paths): + label = f"{cfg.tile_m}x{cfg.tile_n}x{cfg.tile_k}/{cfg.pipeline}" + if so is None: + rows.append((label, None, None)) + continue + result = GpuGemmRunner(lib_path=so).run(A, B, problem) + if not result.success: + rows.append((label, None, None)) + continue + rows.append((label, result.tflops, _max_rel(result.output, ref))) + + ranked = sorted((r for r in rows if r[1] is not None), + key=lambda r: r[1], reverse=True) + print(f" {'rank':>4} {'algorithm':<24} {'tflops':>9} {'max_rel':>10}") + for i, (label, tflops, mr) in enumerate(ranked, 1): + print(f" {i:>4} {label:<24} {tflops:>9.1f} {mr:>10.2e}") + for label, tflops, _ in rows: + if tflops is None: + print(f" {'-':>4} {label:<24} {'BUILD/RUN FAILED':>20}") + if ranked: + print(f" -> fastest: {ranked[0][0]} at {ranked[0][1]:.1f} TFLOPS") + n_ok = sum(1 for _, _, mr in ranked if mr <= rtol) + return n_ok, len(configs) + + +def main() -> int: + parser = argparse.ArgumentParser( + description="Tile Engine -> Dispatcher bridge example (gallery)", + formatter_class=argparse.RawDescriptionHelpFormatter, + ) + parser.add_argument("--demo", choices=["matrix", "shapes", "sweep", "all"], + default="all", help="which demo to run (default: all)") + parser.add_argument("--size", type=int, default=512, help="M=N=K (default 512)") + parser.add_argument("--rtol", type=float, default=2e-2, + help="relative tolerance (default 2e-2)") + parser.add_argument("--arch", default=detect_gpu_arch(), + help="GPU target arch (default: auto-detected via rocminfo)") + args = parser.parse_args() + + demos = ["matrix", "shapes", "sweep"] if args.demo == "all" else [args.demo] + total_pass = 0 + total = 0 + for d in demos: + if d == "matrix": + p, t = demo_matrix(args.size, args.rtol, args.arch) + elif d == "shapes": + p, t = demo_shapes(args.rtol, args.arch) + else: + p, t = demo_sweep(args.size, args.rtol, args.arch) + total_pass += p + total += t + + print(f"\n{total_pass}/{total} checks passed across {len(demos)} demo(s)") + return 0 if total_pass == total else 1 + + +if __name__ == "__main__": + sys.exit(main()) \ No newline at end of file diff --git a/dispatcher/examples/grouped_conv/python/01_basic_grouped_conv.py b/dispatcher/examples/grouped_conv/python/01_basic_grouped_conv.py index 6e6db5f15d5..ab548d60bed 100644 --- a/dispatcher/examples/grouped_conv/python/01_basic_grouped_conv.py +++ b/dispatcher/examples/grouped_conv/python/01_basic_grouped_conv.py @@ -92,7 +92,7 @@ def main(): # ========================================================================= print("\n--- Step 1: Kernel Configuration Patterns ---") - # Tile constraint (TileGemmShape, see grouped_config_rules.COMMON_TILES): + # Tile constraint (TileGemmShape, see grouped_config_rules_default.get_tiles_for_variant): # tile_m == wave_m * warp_tile_m AND LDS fits the pipeline limit # (compv4 limit = 32768 B, default = 65536 B) diff --git a/dispatcher/heuristics/GROUPED_CONV_HEURISTIC_REPORT.md b/dispatcher/heuristics/GROUPED_CONV_HEURISTIC_REPORT.md new file mode 100644 index 00000000000..bea8da86737 --- /dev/null +++ b/dispatcher/heuristics/GROUPED_CONV_HEURISTIC_REPORT.md @@ -0,0 +1,429 @@ +# Grouped Convolution Dispatcher Heuristic Support Report + +**Target Architecture:** AMD Instinct MI355X (gfx950) +**Data Type:** bf16 (bfloat16) +**Date:** May 5, 2026 +**Report Version:** 1.0 + +--- + +## Executive Summary + +The grouped convolution dispatcher uses a **machine learning-based heuristic** powered by LightGBM gradient-boosting models to predict kernel performance and select optimal kernels at runtime. The current best model achieves **92.5% mean efficiency** and **27.9% top-1 accuracy** on holdout validation sets, representing a significant improvement over hand-crafted heuristics. + +--- + +## 1. Heuristic System Overview + +### 1.1 What is the Heuristic? + +The heuristic is a **data-driven ML model** that predicts TFLOPS (performance) for each candidate kernel given a specific convolution problem. The system: + +- **Type:** LightGBM Regressor (Gradient Boosted Decision Trees) +- **Target:** TFLOPS prediction in log-space (`log1p` transform) +- **Training Method:** GroupKFold cross-validation (5 folds) +- **Feature Count:** 97 features (current suffix-aware model) +- **Model Evolution:** + - **v1:** 83 features (2D-only, pre-suffix) - Legacy + - **v2:** 91 features (2D+3D, pre-suffix) - Baseline + - **v3:** **97 features (2D+3D, suffix-aware)** - **Current best** + +### 1.2 Model Performance (Forward 2D+3D Holdout) + +| Model | Features | Mean Efficiency | Top-1 Accuracy | Top-5 Accuracy | +|--------------------------------------------|----------|-----------------|----------------|----------------| +| Pre-suffix (aliased kernels) | 91 | 88.0% | ~5-10% | ~30% | +| **Suffix-aware (current)** | **97** | **92.5%** | **27.9%** | **70.6%** | + +**Cross-Validation Metrics (5-fold):** +- **Mean RMSE:** 0.254 (log-space) +- **Mean R²:** 0.955 +- **P10 Efficiency:** 82.6% (10th percentile - worst-case shapes) +- **Training Data:** 77,656 kernel-problem pairs, 170 unique problem shapes + +--- + +## 2. How the Dispatcher Uses the Heuristic + +### 2.1 Prediction Workflow + +``` +Problem (N,C,K,G,Hi,Wi,Y,X,...) + ↓ +Feature Engine (97 features) + ↓ +Predictor.rank_kernels() for all candidates + ↓ +Select kernel with highest predicted TFLOPS + ↓ +JIT compile (if not cached) + ↓ +Execute on GPU +``` + +### 2.2 Implementation Details + +**Predictor Class** (`predict.py`): +- Lazy-loads trained LightGBM models from disk +- Supports auto-decompression of `.lgbm.gz` files +- **Version-aware feature filtering:** Old models (83/91 features) work with new feature engine (97 features) via column index mapping +- Batch prediction via vectorized `extract_batch()` for performance + +**Key Methods:** +- `predict_tflops(problem, kernel_config)` → Single prediction +- `rank_kernels(problem, kernel_configs)` → Rank all candidates +- `select_best(problem, kernel_configs)` → Return top kernel name + +**Example Usage** (from `09_ml_heuristic.py`): +```python +predictor = Predictor("models/grouped_conv_forward_2d3d_suffix_bf16_gfx950", + feature_engine=GroupedConvFeatureEngine()) +ranked = predictor.rank_kernels(problem, kernel_pool) +best_kernel = ranked[0][0] # (kernel_name, predicted_tflops) +``` + +### 2.3 Kernel Pool + +The dispatcher searches over **30-kernel candidate pools** per variant: + +- **Forward:** 30 kernels (compv3/4/5 × 10 tile configs × suffix variants) +- **Backward:** 20 kernels (compv3/mem × 10 tile configs × suffix variants) + +**Pipeline Variants (Single Source of Truth):** +Defined in `dispatcher/codegen/grouped_config_rules.py::PIPELINE_VARIANTS` (30 combinations): + +| Pipeline | Wave Modes | Suffix Flags | Count | +|-------------|---------------------|---------------------|-------| +| basic_v1 | intra/inter | ∅, dsb, si, dsb_si | 8 | +| compv3 | intrawave | ∅, dsb, si, dsb_si | 4 | +| compv4 | intrawave | dsb, dsb_si only | 2 | +| compv5 | intrawave | ∅, dsb, si, dsb_si | 4 | +| compv6 | intrawave | ∅, dsb, si, dsb_si | 4 | +| mem | intra/inter | ∅, dsb, si, dsb_si | 8 | + +**Total:** 30 valid (pipeline, wave_mode, has_dsb, has_si) tuples + +--- + +## 3. Feature Engineering + +### 3.1 Feature Categories (97 Total) + +The feature engine (`feature_engine_grouped_conv.py`) generates 97 features organized into 6 categories: + +#### **Problem Features (38):** +Capture the convolution shape and parameters: +- **Basic dimensions:** N, C, K, G, Hi, Wi, Di (3D), Y, X, Z (3D) +- **Output dimensions:** Ho, Wo, Do (computed from stride/padding) +- **Strides & Padding:** stride_h/w/d, pad_h/w/d, dilation_h/w/d +- **Log-scale features:** log2_N, log2_C, log2_K, log2_G, log2_Hi, log2_Wi, log2_spatial, log2_filter, log2_output +- **Derived:** arithmetic_intensity, filter_area, is_1x1_conv, is_3x3_conv, channels_per_group, aspect_ratio_hw, aspect_ratio_filter +- **3D indicator:** is_3d (1.0 if Di>1 or Z>1, else 0.0) +- **Group-specific:** log2_channels_per_group, log2_output_channels_per_group, is_depthwise, group_density, is_small_group, channels_product_per_group, batch_group_product, is_small_batch_grouped + +#### **Kernel Features (21):** +Tile configuration and pipeline: +- **Tile dimensions:** block_size, gemm_m_per_block, gemm_n_per_block +- **Pipeline:** Categorical feature (compv3/4/5/6, basic_v1, mem, etc.) +- **Derived:** num_warps, tile_volume, tile_mn, lds_usage_estimate, lds_usage_ratio, block_tile_ratio_m/n, block_efficiency +- **Pipeline flags:** is_compv3, is_compv4, is_compv5, is_basic, is_compv6, is_mem +- **Suffix flags (6 new):** + - `is_intrawave` (1.0 if wave_mode == "intrawave", 0.0 if "interwave") + - `has_dsb` (1.0 if double smem buffer suffix present) + - `has_si` (1.0 if store-immediate suffix present) + +#### **Interaction Features (18):** +Problem-kernel interactions via GEMM mapping: +- **GEMM dimensions:** + - GEMM_M = N × output_volume (N × Do × Ho × Wo for 3D, N × Ho × Wo for 2D) + - GEMM_N = K + - GEMM_K = (C/G) × filter_volume (Z × Y × X for 3D, Y × X for 2D) +- **Tiling metrics:** num_tiles_m/n/k, total_output_tiles, tile_eff_m/n/k, overall_tile_efficiency, cu_utilization +- **Ratio features:** ratio_gemm_m/n/k_to_tile_m/n/k, problem_smaller_than_tile_m/n/k + +#### **Hardware Features (12):** +GPU characteristics (read from data with gfx950 defaults): +- hw_num_cus (256), hw_simds_per_cu (4), hw_total_simds (1024) +- hw_shader_engines (32), hw_max_clock_mhz (2400), hw_max_waves_per_cu (32) +- hw_wavefront_size (64), hw_lds_capacity (65536), hw_l1/2/3_cache_kb, hw_num_xcd (8) + +### 3.2 Critical Features for 2D vs 3D + +**2D Convolution (Di=1, Z=1):** +- All base features (N, C, K, G, Hi, Wi, Y, X, stride_h/w, pad_h/w, Ho, Wo) +- is_3d = 0.0 +- Di, Z, Do, stride_d, pad_d, dilation_d default to 1/0 +- log2_spatial = log2(Hi × Wi), log2_filter = log2(Y × X), log2_output = log2(Ho × Wo) + +**3D Convolution (Di>1 or Z>1):** +- **Critical:** `is_3d = 1.0` acts as a gate for model to activate 3D logic +- Di, Z, Do, stride_d, pad_d, dilation_d capture 3D spatial structure +- **Dilation columns (dilation_h/w/d):** Essential for distinguishing dilated 3D shapes. Without these, the model cannot differentiate shapes with same (N,C,K,Hi,Wi,Y,X) but different dilation. +- log2_spatial = log2(Di × Hi × Wi), log2_filter = log2(Z × Y × X), log2_output = log2(Do × Ho × Wo) + +**Combined 2D+3D Model:** +The single unified model learns to gate 3D features on `is_3d`. No separate 2D-only / 3D-only models needed. + +### 3.3 Suffix-Aware Features (Key Innovation) + +**Problem:** Kernel names like `grouped_conv_forward_bf16_2d_64x64x64_compv3_intrawave_dsb_si` encode wave_mode/dsb/si suffixes, but the original parser ignored them. This caused up to **16 physical kernels to collapse into one feature signature**, capping top-1 accuracy at ~12.5%. + +**Solution:** Added 6 suffix-aware features (features 62-67): +- `is_intrawave`, `has_dsb`, `has_si`, `is_basic`, `is_compv6`, `is_mem` + +**Impact:** Top-1 accuracy jumped from ~5-10% to **27.9%** (~3x improvement). + +--- + +## 4. Benchmarking Process + +### 4.1 Benchmark Architecture + +The benchmarking follows a **two-phase architecture** (mirroring FMHA): + +**Phase 1: Parallel Compilation** +- Expand kernel sweep configs (tile × pipeline combinations) +- Compile all kernels in parallel using ThreadPoolExecutor (8 workers default) +- Returns `.so` library paths (does NOT load libraries to avoid ctypes limits) +- Deduplicates kernels (e.g., compv3/4/5 may map to same physical kernel) + +**Phase 2: Sequential GPU Execution** +- Run each kernel via **subprocess isolation** (avoids Python library loading limits) +- Batch kernels into subprocess groups (default: 20 kernels per subprocess) +- Each subprocess loads library, runs kernels, returns results +- Timeout per kernel: 30s default + +### 4.2 Benchmark Script + +**Entry Point:** `grouped_conv_full_benchmark.py` + +**Usage:** +```bash +python grouped_conv_full_benchmark.py configs/forward_2d.json \ + --arch gfx950 \ + --problems forward_2d \ + --csv results.csv \ + --workers 8 \ + --batch-size 20 +``` + +**Available Problem Sets:** + +| Problem Set | Description | Count | +|------------------------------|--------------------------------------|---------------| +| `forward_2d` | 2D forward training problems | ~100 shapes | +| `forward_3d` | 3D forward training problems | 168 shapes | +| `bwd_data_2d/3d` | 2D/3D backward data | Varies | +| `bwd_weight_2d/3d` | 2D/3D backward weight | Varies | +| `validation_holdout` | Combined holdout (250 2D + 50 3D) | 300 shapes | +| `bwd_data_test_validation` | Backward data validation | Varies | +| `bwd_weight_test_validation` | Backward weight validation | Varies | + +**Note:** Problem sets are registered in `grouped_conv_full_benchmark.py` and must match a file in `problems/` directory. + +### 4.3 Data Pipeline + +**CSV → Parquet → Training:** + +1. **Benchmark Output:** CSV with columns (kernel, N, C, K, G, Hi, Wi, Y, X, Di, Z, stride_*, pad_*, dilation_*, latency_ms, tflops, non_zero) + +2. **Conversion:** `convert_csv_to_parquet.py` parses kernel names to extract: + - Tile dimensions (block_size, gemm_m_per_block, gemm_n_per_block) + - Pipeline (compv3/4/5/6, mem, basic_v1, etc.) + - **Suffix flags:** wave_mode, has_dsb, has_si (via regex on kernel name) + +3. **Training:** `train.py` loads parquet, generates 97 features, trains LightGBM model + +--- + +## 5. Results + +### 5.1 Model Performance Summary + +**Current Best Model:** `grouped_conv_forward_2d3d_suffix_bf16_gfx950` + +| Metric | Value | Notes | +|-------------------------|------------|--------------------------------------------| +| **Mean Efficiency** | 92.5% | Predicted-best / Oracle-best TFLOPS | +| **P10 Efficiency** | 82.6% | 10th percentile (worst-case shapes) | +| **Top-1 Accuracy** | 27.9% | Correct best kernel selected | +| **Top-5 Accuracy** | 70.6% | Oracle-best in top-5 predictions | +| **Cross-Val RMSE** | 0.254 | Log-space (expm1 to get real TFLOPS) | +| **Cross-Val R²** | 0.955 | Variance explained | +| **Training Data** | 77,656 rows| 170 unique problem shapes, ~456 kernels/shape | +| **LightGBM Estimators** | 2,000 | Decision trees | + +### 5.2 Cross-Validation Fold Details + +| Fold | RMSE (log) | R² | Mean Eff | P10 Eff | Train Size | Val Size | Val Groups | +|------|-----------|-------|----------|---------|------------|----------|------------| +| 0 | 0.267 | 0.957 | 95.3% | 84.1% | 62,036 | 15,620 | 48 | +| 1 | 0.234 | 0.963 | 96.2% | 85.4% | 62,108 | 15,548 | 48 | +| 2 | 0.175 | 0.984 | 92.8% | 78.8% | 62,124 | 15,532 | 49 | +| 3 | 0.228 | 0.957 | 95.8% | 89.1% | 62,177 | 15,479 | 50 | +| 4 | 0.378 | 0.914 | 92.8% | 79.9% | 62,179 | 15,477 | 53 | + +**GroupKFold:** Cross-validation groups by problem configuration `(N,C,K,G,Hi,Wi,Y,X,Di,Z,dilation_h,dilation_w)` to prevent train/val leakage. + +### 5.3 Model Evolution Impact + +| Change | Feature Count | Top-1 Accuracy | Mean Efficiency | Impact | +|---------------------------------|---------------|----------------|-----------------|----------------------| +| Legacy (2D-only, pre-suffix) | 83 | ~5-10% | ~85% | Baseline | +| 2D+3D (pre-suffix) | 91 | ~5-10% | 88.0% | +3% efficiency | +| **Suffix-aware (current)** | **97** | **27.9%** | **92.5%** | **+10x top-1, +4.5% eff** | + +**Key Insight:** Suffix-aware parsing (adding wave_mode/dsb/si flags) was the single largest improvement, far exceeding hyperparameter tuning or CV fold count. + +### 5.4 Variant Coverage + +| Variant | Model Status | Features | Performance | +|--------------|-------------------------------------------|----------|---------------------------------| +| **Forward** | ✅ Suffix-aware (current best) | 97 | 92.5% mean eff, 27.9% top-1 | +| **Bwd Data** | ⚠️ Pre-suffix (83 features, aliased) | 83 | Lower accuracy (~10% top-1 est.)| +| **Bwd Weight** | ⚠️ Pre-suffix (83 features, aliased) | 83 | Lower accuracy (~10% top-1 est.)| + +**Upgrade Path for Backward Variants:** +1. Re-benchmark with suffix-aware kernel names +2. Re-convert CSVs with updated regex +3. Retrain with 97-feature schema +4. Expect similar top-1 accuracy jump (5-10% → 27-30%) + +--- + +## 6. Training Configuration + +### 6.1 LightGBM Hyperparameters + +```json +{ + "objective": "regression", + "metric": ["rmse", "mae"], + "num_leaves": 255, + "max_depth": 15, + "n_estimators": 2000, + "learning_rate": 0.02, + "min_child_samples": 10, + "subsample": 0.85, + "colsample_bytree": 0.85, + "reg_alpha": 0.05, + "reg_lambda": 0.5, + "seed": 42 +} +``` + +**Notes:** +- Default params within ~1% of tuned configs +- Early stopping: 50 rounds without improvement +- Log-target transform (`log1p`) on TFLOPS for scale invariance + +### 6.2 Training Command + +```bash +python train.py \ + --data_dir data/grouped_conv_2d3d_suffix_bf16_gfx950 \ + --out_dir models/grouped_conv_forward_2d3d_suffix_bf16_gfx950 \ + --operation grouped_conv \ + --dtype bf16 \ + --arch gfx950 \ + --targets tflops \ + --n_splits 5 +``` + +**Warm-Start (Incremental Training):** +```bash +python train.py \ + --warm_start models/grouped_conv_forward_2d3d_suffix_bf16_gfx950 \ + --warm_start_n_estimators 500 \ + --data_dir data/new_benchmark \ + --out_dir models/grouped_conv_forward_2d3d_suffix_bf16_gfx950_v2 +``` + +--- + +## 7. Key Findings & Best Practices + +### 7.1 What Mattered Most + +1. **Suffix-aware kernel parsing:** +10x top-1 accuracy improvement +2. **GroupKFold CV:** Prevents train/val leakage (same problem in both sets) +3. **Dilation columns:** Essential for 3D shape discrimination +4. **Dimension tuple join:** Always join ML vs oracle on (N,C,K,G,Hi,Wi,Y,X,Di,Z), not `problem_idx` + +### 7.2 What Did Not Matter + +1. **Hyperparameter tuning:** Marginal (~1%) vs default LightGBM params +2. **CV fold count:** n_splits=5 vs 10 indistinguishable +3. **Log-target on grouped_conv:** Small gain (~0.5%) vs dramatic effect on GEMM + +### 7.3 Version-Aware Predictor + +**Challenge:** Feature schema evolved (83 → 91 → 97), but old models must remain loadable. + +**Solution:** `Predictor.__init__` reads `feature_spec.json["feature_names"]` and builds column index map. Old models pull only their expected columns from the full engine output. + +**Constraint:** Current engine must be a **superset** of all deployed model features. Adding features is safe; removing/renaming is breaking. + +--- + +## 8. Future Work + +### 8.1 Immediate + +- **Upgrade backward variants:** Re-benchmark and retrain bwd_data/bwd_weight with suffix-aware schema +- **Top-1 accuracy improvement:** Explore ensemble methods or refined features for the ~28% → 40%+ target + +### 8.2 Long-term + +- **Auto-tuning integration:** Use predictor for warm-start in genetic algorithm search +- **Multi-objective:** Train latency/bandwidth models alongside TFLOPS +- **Production deployment:** C++ inference via LightGBM C API for zero-Python overhead + +--- + +## 9. References + +### Key Files + +- **Feature Engine:** `dispatcher/heuristics/feature_engine_grouped_conv.py` +- **Predictor:** `dispatcher/heuristics/predict.py` +- **Training:** `dispatcher/heuristics/train.py` +- **Pipeline Variants:** `dispatcher/codegen/grouped_config_rules.py::PIPELINE_VARIANTS` +- **Benchmark:** `tile_engine/ops/grouped_conv/grouped_conv_full_benchmark.py` +- **Learnings:** `dispatcher/heuristics/LEARNINGS_GROUPED_CONV.md` + +### Model Artifacts + +- **Current Best:** `models/grouped_conv_forward_2d3d_suffix_bf16_gfx950/` + - `model_tflops.lgbm` (or `.lgbm.gz`) + - `feature_spec.json` + - `cv_metrics_tflops.json` + - `train_manifest.json` + +--- + +## Appendix A: Feature List (97 Features) + +
+Click to expand full feature list + +### Problem Features (38) +1. N, 2. C, 3. K, 4. G, 5. Hi, 6. Wi, 7. Y, 8. X, 9. stride_h, 10. stride_w, 11. pad_h, 12. pad_w, 13. Ho, 14. Wo, 15. log2_N, 16. log2_C, 17. log2_K, 18. log2_G, 19. log2_Hi, 20. log2_Wi, 21. log2_spatial, 22. log2_filter, 23. log2_output, 24. arithmetic_intensity, 25. filter_area, 26. is_1x1_conv, 27. is_3x3_conv, 28. channels_per_group, 29. aspect_ratio_hw, 30. aspect_ratio_filter, 31. is_3d, 32. Di, 33. Z, 34. Do, 35. stride_d, 36. pad_d, 37. dilation_h, 38. dilation_w + +### Group-Specific Features (8) +39. log2_channels_per_group, 40. log2_output_channels_per_group, 41. is_depthwise, 42. group_density, 43. is_small_group, 44. channels_product_per_group, 45. batch_group_product, 46. is_small_batch_grouped + +### Kernel Features (21) +47. block_size, 48. gemm_m_per_block, 49. gemm_n_per_block, 50. pipeline, 51. num_warps, 52. tile_volume, 53. tile_mn, 54. lds_usage_estimate, 55. lds_usage_ratio, 56. block_tile_ratio_m, 57. block_tile_ratio_n, 58. block_efficiency, 59. is_compv3, 60. is_compv4, 61. is_compv5, 62. is_intrawave, 63. has_dsb, 64. has_si, 65. is_basic, 66. is_compv6, 67. is_mem + +### Interaction Features (18) +68. gemm_m_output, 69. gemm_n_output, 70. gemm_k_output, 71. num_tiles_m, 72. num_tiles_n, 73. num_tiles_k, 74. total_output_tiles, 75. tile_eff_m, 76. tile_eff_n, 77. tile_eff_k, 78. overall_tile_efficiency, 79. cu_utilization, 80. ratio_gemm_m_to_tile_m, 81. ratio_gemm_n_to_tile_n, 82. ratio_gemm_k_to_tile_k, 83. problem_smaller_than_tile_m, 84. problem_smaller_than_tile_n, 85. problem_smaller_than_tile_k + +### Hardware Features (12) +86. hw_num_cus, 87. hw_simds_per_cu, 88. hw_total_simds, 89. hw_shader_engines, 90. hw_max_clock_mhz, 91. hw_max_waves_per_cu, 92. hw_wavefront_size, 93. hw_lds_capacity, 94. hw_l1_cache_kb, 95. hw_l2_cache_kb, 96. hw_l3_cache_kb, 97. hw_num_xcd + +
+ +--- + +**End of Report** diff --git a/tile_engine/ops/grouped_conv/compare_ml_vs_oracle.py b/dispatcher/heuristics/validation/grouped_conv/compare_ml_vs_oracle.py similarity index 94% rename from tile_engine/ops/grouped_conv/compare_ml_vs_oracle.py rename to dispatcher/heuristics/validation/grouped_conv/compare_ml_vs_oracle.py index 974b85e4f83..ce8dca980b7 100644 --- a/tile_engine/ops/grouped_conv/compare_ml_vs_oracle.py +++ b/dispatcher/heuristics/validation/grouped_conv/compare_ml_vs_oracle.py @@ -1,4 +1,7 @@ #!/usr/bin/env python3 +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + """ Compare ML heuristic predictions against oracle benchmark results. @@ -114,7 +117,15 @@ def run_end_to_end_workflow(args): elif args.problem_set: print(f"Problem set: {args.problem_set}") # Import problem set dynamically - sys.path.insert(0, str(Path(__file__).parent / "problems")) + # Problem sets live with the benchmarking harness in tile_engine. + _THIS_DIR = Path(__file__).parent + _TILE_ENGINE_GROUPED_CONV = ( + _THIS_DIR.parent.parent.parent.parent + / "tile_engine" + / "ops" + / "grouped_conv" + ) + sys.path.insert(0, str(_TILE_ENGINE_GROUPED_CONV / "problems")) try: problem_module = __import__(args.problem_set) problem_attr = ( @@ -165,15 +176,15 @@ def run_end_to_end_workflow(args): print() print("Please use the manual workflow documented in README.md:") print() - print(" 1. Create problem set file in problems/") + print(" 1. Create problem set file in tile_engine/ops/grouped_conv/problems/") print( - " 2. Run: python grouped_conv_full_benchmark.py --problems --csv oracle.csv" + " 2. Run: cd tile_engine/ops/grouped_conv && python grouped_conv_full_benchmark.py --problems --csv oracle.csv" ) print( - " 3. Run: cd ../../dispatcher/heuristics && python predict_cli.py --problem-module --output ml.csv" + " 3. Run: cd dispatcher/heuristics && python predict_cli.py --problem-module --output ml.csv" ) print( - " 4. Run: cd ../../tile_engine/ops/grouped_conv && python compare_ml_vs_oracle.py --oracle-csv oracle.csv --ml-csv ml.csv --plot result.png" + " 4. Run: cd dispatcher/heuristics/validation/grouped_conv && python compare_ml_vs_oracle.py --oracle-csv oracle.csv --ml-csv ml.csv --plot result.png" ) print() diff --git a/tile_engine/ops/grouped_conv/validate_ml_vs_oracle.py b/dispatcher/heuristics/validation/grouped_conv/validate_ml_vs_oracle.py similarity index 86% rename from tile_engine/ops/grouped_conv/validate_ml_vs_oracle.py rename to dispatcher/heuristics/validation/grouped_conv/validate_ml_vs_oracle.py index 9e5124caf8a..2009cef0c0b 100755 --- a/tile_engine/ops/grouped_conv/validate_ml_vs_oracle.py +++ b/dispatcher/heuristics/validation/grouped_conv/validate_ml_vs_oracle.py @@ -12,23 +12,29 @@ 4. Reports efficiency metrics """ +import argparse import sys from pathlib import Path import pandas as pd import numpy as np _THIS_DIR = Path(__file__).parent -_DISPATCHER_ROOT = _THIS_DIR.parent.parent.parent / "dispatcher" +# This file lives at: /projects/composablekernel/dispatcher/heuristics/validation/grouped_conv/ +# Walk up three levels (validation -> heuristics -> dispatcher) to find the dispatcher root. +_DISPATCHER_ROOT = _THIS_DIR.parent.parent.parent +_CK_ROOT = _DISPATCHER_ROOT.parent +# Problem definitions still live with the benchmarking harness in tile_engine. +_TILE_ENGINE_GROUPED_CONV = _CK_ROOT / "tile_engine" / "ops" / "grouped_conv" sys.path.insert(0, str(_DISPATCHER_ROOT / "python")) sys.path.insert(0, str(_DISPATCHER_ROOT / "heuristics")) sys.path.insert(0, str(_DISPATCHER_ROOT / "codegen")) -sys.path.insert(0, str(_THIS_DIR / "problems")) +sys.path.insert(0, str(_TILE_ENGINE_GROUPED_CONV / "problems")) from validation_holdout import VALIDATION_PROBLEMS # noqa: E402 from predict import Predictor # noqa: E402 from feature_engine_grouped_conv import GroupedConvFeatureEngine # noqa: E402 -from grouped_config_rules import COMMON_TILES, TILE_TO_WAVE, iter_pipeline_variants # noqa: E402 +from grouped_conv.grouped_config_rules_default import COMMON_TILES, TILE_TO_WAVE, iter_pipeline_variants # noqa: E402 # Generate kernel pool (suffix-aware; sourced from grouped_config_rules) @@ -81,11 +87,31 @@ def _build_kernel_name(kconf, ndim): ) -# Load model -model_dir = ( - _DISPATCHER_ROOT - / "heuristics/models/grouped_conv_forward_bf16_gfx950_2d_3d_no_compv5" +# Parse CLI args +_parser = argparse.ArgumentParser(description=__doc__) +_parser.add_argument( + "--oracle-csv", + type=Path, + default=_TILE_ENGINE_GROUPED_CONV / "validation_oracle_results.csv", + help="Oracle benchmark CSV (produced by tile_engine/ops/grouped_conv/grouped_conv_full_benchmark.py)", +) +_parser.add_argument( + "--model-dir", + type=Path, + default=_DISPATCHER_ROOT + / "heuristics/models/grouped_conv_forward_bf16_gfx950_2d_3d_no_compv5", + help="Trained LightGBM model directory.", +) +_parser.add_argument( + "--output", + type=Path, + default=_THIS_DIR / "validation_heuristic_vs_oracle.csv", + help="Where to write the per-problem comparison CSV.", ) +_args = _parser.parse_args() + +# Load model +model_dir = _args.model_dir feature_engine = GroupedConvFeatureEngine() predictor = Predictor(model_dir, feature_engine=feature_engine) @@ -98,7 +124,7 @@ def _build_kernel_name(kconf, ndim): print() # Load oracle benchmark results -oracle_df = pd.read_csv(_THIS_DIR / "validation_oracle_results.csv") +oracle_df = pd.read_csv(_args.oracle_csv) print(f"Oracle measurements: {len(oracle_df)}") print() @@ -281,7 +307,7 @@ def _build_kernel_name(kconf, ndim): print() # Save detailed results - results_df.to_csv(_THIS_DIR / "validation_heuristic_vs_oracle.csv", index=False) - print("Detailed results saved to: validation_heuristic_vs_oracle.csv") + results_df.to_csv(_args.output, index=False) + print(f"Detailed results saved to: {_args.output}") else: print("ERROR: No predictions could be compared with oracle data") diff --git a/dispatcher/include/ck_tile/dispatcher/arch_specs_generated.hpp b/dispatcher/include/ck_tile/dispatcher/arch_specs_generated.hpp index d8168caf01d..3ad2672372c 100644 --- a/dispatcher/include/ck_tile/dispatcher/arch_specs_generated.hpp +++ b/dispatcher/include/ck_tile/dispatcher/arch_specs_generated.hpp @@ -1,11 +1,11 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT -// Copyright (c) 2025, Advanced Micro Devices, Inc. All rights reserved. /** * AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY! * * Generated from: arch_specs.json - * Generated at: 2026-04-10T20:07:11.666441 + * Generated at: 2026-06-01T10:50:15.322672 * * To update this file: * 1. Edit arch_specs.json @@ -111,8 +111,18 @@ inline std::vector get_supported_warp_configs(GpuArch arch) { case GpuArch::GFX_908: return {{1, 4, 1}, {2, 2, 1}, {4, 1, 1}}; case GpuArch::GFX_90A: return {{1, 4, 1}, {2, 2, 1}, {4, 1, 1}}; - case GpuArch::GFX_942: return {{1, 4, 1}, {2, 2, 1}, {4, 1, 1}}; - case GpuArch::GFX_950: return {{1, 4, 1}, {2, 2, 1}, {4, 1, 1}, {8, 2, 1}, {4, 4, 1}}; + case GpuArch::GFX_942: + return {{1, 1, 1}, {1, 2, 1}, {1, 4, 1}, {2, 1, 1}, {2, 1, 2}, {2, 2, 1}, {4, 1, 1}}; + case GpuArch::GFX_950: + return {{1, 1, 1}, + {1, 2, 1}, + {1, 4, 1}, + {2, 1, 1}, + {2, 1, 2}, + {2, 2, 1}, + {4, 1, 1}, + {8, 2, 1}, + {4, 4, 1}}; case GpuArch::GFX_1100: return {{2, 4, 1}, {1, 8, 1}, {8, 1, 1}, {4, 2, 1}}; case GpuArch::GFX_1200: return {{2, 4, 1}, {1, 8, 1}, {8, 1, 1}, {4, 2, 1}}; case GpuArch::GFX_1201: return {{2, 4, 1}, {1, 8, 1}, {8, 1, 1}, {4, 2, 1}}; diff --git a/dispatcher/include/ck_tile/dispatcher/backends/generated_conv_backend.hpp b/dispatcher/include/ck_tile/dispatcher/backends/generated_conv_backend.hpp index b8e4964b132..75a71777b46 100644 --- a/dispatcher/include/ck_tile/dispatcher/backends/generated_conv_backend.hpp +++ b/dispatcher/include/ck_tile/dispatcher/backends/generated_conv_backend.hpp @@ -148,7 +148,7 @@ inline GroupedConvKernelInstance::RunFn make_conv_bwd_weight_run_fn() } // ------------------------------------------------------------------------- -// IsSupportedFn factories — check kernel applicability without launching +// IsSupportedFn factories -- check kernel applicability without launching // ------------------------------------------------------------------------- template @@ -181,7 +181,7 @@ inline GroupedConvKernelInstance::IsSupportedFn make_conv_bwd_data_is_supported_ } // ------------------------------------------------------------------------- -// Instance string extraction — get CK Tile GetInstanceString() representation +// Instance string extraction -- get CK Tile GetInstanceString() representation // ------------------------------------------------------------------------- #ifdef CK_EXPERIMENTAL_BUILDER diff --git a/dispatcher/include/ck_tile/dispatcher/backends/generated_tile_backend.hpp b/dispatcher/include/ck_tile/dispatcher/backends/generated_tile_backend.hpp index be22d94b333..d529be3b310 100644 --- a/dispatcher/include/ck_tile/dispatcher/backends/generated_tile_backend.hpp +++ b/dispatcher/include/ck_tile/dispatcher/backends/generated_tile_backend.hpp @@ -12,6 +12,8 @@ #include #include #include +#include +#include namespace ck_tile { namespace dispatcher { @@ -50,26 +52,46 @@ class GeneratedTileKernelInstance : public KernelInstance bool supports(const Problem& problem) const override { - // Check dimension divisibility if padding not enabled + // Tile-divisibility gate, mirroring ck_tile::GemmKernel::IsSupportedArgument + // exactly. A dimension only needs to be a multiple of its tile size when an + // operand whose contiguous (inner) axis is that dimension participates AND + // padding for it is disabled. This is layout-dependent: + // + // layout RowMajor A -> inner axis K | layout ColMajor A -> inner axis M + // layout RowMajor B -> inner axis N | layout ColMajor B -> inner axis K + // layout RowMajor C -> inner axis N | layout ColMajor C -> inner axis M + // + // The old check blindly required M % TileM == 0 for every layout, which + // wrongly rejected e.g. rcr kernels (RowMajor A & C never gate M) on + // M-indivisible problems that Old-TE runs fine. Anything this lets through + // is still validated by the kernel's own IsSupportedArgument inside launch(), + // so the bridge stays a strict functional equivalent of Old-TE. constexpr bool pad_m = SelectedKernel::kPadM; constexpr bool pad_n = SelectedKernel::kPadN; constexpr bool pad_k = SelectedKernel::kPadK; - if(pad_m && pad_n && pad_k) - { - return true; // Padding enabled - supports any size - } - - // Check divisibility constexpr int tile_m = SelectedKernel::TileM; constexpr int tile_n = SelectedKernel::TileN; constexpr int tile_k = SelectedKernel::TileK; - if(!pad_m && problem.M % tile_m != 0) + const auto is_row = [](LayoutTag l) { return l == LayoutTag::RowMajor; }; + const bool row_a = is_row(key_.signature.layout_a); + const bool row_b = is_row(key_.signature.layout_b); + const bool row_c = is_row(key_.signature.layout_c); + + // Which problem dimensions are actually constrained for this layout combo. + const bool require_m = (!row_a) || (!row_c); // ColMajor A or C gate M + const bool require_n = row_b || row_c; // RowMajor B or C gate N + const bool require_k = row_a || (!row_b); // RowMajor A or ColMajor B gate K + + const std::int64_t k_grain = + static_cast(tile_k) * (problem.k_batch > 0 ? problem.k_batch : 1); + + if(require_m && !pad_m && problem.M % tile_m != 0) return false; - if(!pad_n && problem.N % tile_n != 0) + if(require_n && !pad_n && problem.N % tile_n != 0) return false; - if(!pad_k && problem.K % tile_k != 0) + if(require_k && !pad_k && problem.K % k_grain != 0) return false; return true; @@ -86,7 +108,16 @@ class GeneratedTileKernelInstance : public KernelInstance { (void)d_ptrs; // Not used in basic GEMM - // Create arguments using constructor (correct order!) + // Leading dimensions depend on each operand's layout, NOT a fixed + // rcr assumption: RowMajor A/B/C -> inner axis is K/N/N; ColMajor -> + // M/K/M. Hard-coding {K, K, N} only happens to be right for rcr and for + // square problems (M==N==K); it corrupts every non-square rrr/ccr/crr + // launch. Derive each stride from the kernel's real layout instead. + const auto is_row = [](LayoutTag l) { return l == LayoutTag::RowMajor; }; + const auto stride_a = is_row(key_.signature.layout_a) ? problem.K : problem.M; + const auto stride_b = is_row(key_.signature.layout_b) ? problem.N : problem.K; + const auto stride_c = is_row(key_.signature.layout_c) ? problem.N : problem.M; + // Order from GemmHostArgs constructor: a_ptr, b_ptr, e_ptr, k_batch, M, N, K, stride_A, // stride_B, stride_E ck_tile::GemmHostArgs args(a_ptr, // a_ptr @@ -96,9 +127,9 @@ class GeneratedTileKernelInstance : public KernelInstance problem.M, // M problem.N, // N problem.K, // K - problem.K, // stride_A (row-major A: stride = K) - problem.K, // stride_B (column-major B: stride = K) - problem.N // stride_E/C (row-major C: stride = N) + stride_a, // stride_A + stride_b, // stride_B + stride_c // stride_E/C ); const bool bench = this->benchmarking_; @@ -106,11 +137,11 @@ class GeneratedTileKernelInstance : public KernelInstance stream_cfg.stream_id_ = reinterpret_cast(stream); stream_cfg.time_kernel_ = bench; stream_cfg.log_level_ = 0; - stream_cfg.cold_niters_ = bench ? 5 : 0; - stream_cfg.nrepeat_ = bench ? 10 : 1; + stream_cfg.cold_niters_ = bench ? env_int("CK_TILE_BENCH_WARMUP", 50) : 0; + stream_cfg.nrepeat_ = bench ? env_int("CK_TILE_BENCH_REPEAT", 100) : 1; stream_cfg.is_gpu_timer_ = bench; - stream_cfg.flush_cache_ = false; - stream_cfg.rotating_count_ = 1; + stream_cfg.flush_cache_ = bench && env_bool("CK_TILE_BENCH_FLUSH", true); + stream_cfg.rotating_count_ = bench ? env_int("CK_TILE_BENCH_ROTATING", 1000) : 1; // Call the generated kernel's launch method return SelectedKernel::launch(args, stream_cfg); @@ -134,6 +165,33 @@ class GeneratedTileKernelInstance : public KernelInstance } private: + // Read an integer benchmark knob from the environment, falling back to + // `fallback` when unset or unparseable. + static int env_int(const char* name, int fallback) + { + const char* v = std::getenv(name); + if(v == nullptr || *v == '\0') + return fallback; + char* end = nullptr; + const long out = std::strtol(v, &end, 10); + if(end == v) + return fallback; + return static_cast(out); + } + + // Read a boolean benchmark knob ("0"/"false"/"off", any case => false, else true). + static bool env_bool(const char* name, bool fallback) + { + const char* v = std::getenv(name); + if(v == nullptr || *v == '\0') + return fallback; + std::string s(v); + for(char& c : s) + if(c >= 'A' && c <= 'Z') + c = static_cast(c - 'A' + 'a'); + return !(s == "0" || s == "false" || s == "off"); + } + KernelKey key_; std::string name_; }; @@ -154,4 +212,4 @@ std::shared_ptr create_generated_tile_kernel(const KernelKey& ke } // namespace backends } // namespace dispatcher -} // namespace ck_tile +} // namespace ck_tile \ No newline at end of file diff --git a/dispatcher/include/ck_tile/dispatcher/backends/generated_tile_backend_streamk.hpp b/dispatcher/include/ck_tile/dispatcher/backends/generated_tile_backend_streamk.hpp new file mode 100644 index 00000000000..7badf449004 --- /dev/null +++ b/dispatcher/include/ck_tile/dispatcher/backends/generated_tile_backend_streamk.hpp @@ -0,0 +1,257 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +#pragma once + +#include "ck_tile/dispatcher/kernel_instance.hpp" +#include "ck_tile/core.hpp" +#include "ck_tile/host.hpp" +#include "ck_tile/ops/gemm.hpp" +#include "ck_tile/ops/gemm/kernel/streamk_gemm/streamk_gemm_kernel.hpp" +#include "ck_tile/ops/common/streamk_common.hpp" +#include +#include +#include +#include +#include + +namespace ck_tile { +namespace dispatcher { +namespace backends { + +// Lock the dispatcher's ReductionStrategy (defined in kernel_key.hpp, which is +// deliberately kept ck_tile-free -- same policy as the void* workspace in +// dispatcher.hpp) to ck_tile::StreamKReductionStrategy so the two enums cannot +// silently drift. The dispatcher enum carries an extra None=0 sentinel, so the +// three real strategies are offset by one. This backend header is the single +// place that includes both definitions, so the check belongs here rather than in +// the public key header. +static_assert(static_cast(ReductionStrategy::Atomic) == + static_cast(ck_tile::StreamKReductionStrategy::Atomic) + 1u, + "dispatcher ReductionStrategy drifted from ck_tile::StreamKReductionStrategy"); +static_assert(static_cast(ReductionStrategy::Linear) == + static_cast(ck_tile::StreamKReductionStrategy::Linear) + 1u, + "dispatcher ReductionStrategy drifted from ck_tile::StreamKReductionStrategy"); +static_assert(static_cast(ReductionStrategy::Tree) == + static_cast(ck_tile::StreamKReductionStrategy::Tree) + 1u, + "dispatcher ReductionStrategy drifted from ck_tile::StreamKReductionStrategy"); + +/** + * Kernel-instance wrapper for unified_gemm_codegen.py Stream-K kernels. + * + * Counterpart of GeneratedTileKernelInstance (regular GEMM) for the Stream-K + * variant. The difference is the host-args type: Stream-K needs + * ck_tile::StreamKHostArgs (workspace pointer + reduction strategy), which is + * ABI-incompatible with the GemmHostArgs path -- this is exactly why Stream-K + * could not previously ride the registry. With this backend it can: the + * Dispatcher selects the instance by KernelKey (which now carries streamk + + * reduction_strategy) and calls run(). + * + * supports() gates on the requested reduction strategy so that the registry can + * hold atomic/linear/tree side by side and the Dispatcher's first-fit selection + * picks the one the caller asked for via Problem::reduction_strategy. + * + * NOTE (PR-C): the generated SelectedKernel::launch(StreamKHostArgs, stream) + * still owns the reduction workspace internally (DeviceMem) and does the + * per-iter reset. PR-D relocates workspace ownership + reset to Dispatcher::run() + * via get_workspace_size()/the workspace-aware run() overload. + */ +template +class GeneratedStreamKKernelInstance : public KernelInstance +{ + public: + using ADataType = ADataType_; + using BDataType = BDataType_; + using CDataType = CDataType_; + using AccDataType = AccDataType_; + using SelectedKernel = SelectedKernelType; + + GeneratedStreamKKernelInstance(const KernelKey& key, const std::string& name) + : key_(key), name_(name) + { + } + + const KernelKey& get_key() const override { return key_; } + + std::string get_name() const override { return name_; } + + /// Accept ONLY when the caller requested a Stream-K kernel with THIS + /// instance's reduction strategy. Lets atomic/linear/tree coexist in the + /// registry and be selected by Problem::reduction_strategy. + bool supports(const Problem& problem) const override + { + if(!problem.streamk) + return false; + if(problem.reduction_strategy != key_.algorithm.reduction_strategy) + return false; + + // Stream-K distributes K-iterations across workgroups; padding flags + // mirror the regular backend's divisibility guard. + constexpr bool pad_m = SelectedKernel::kPadM; + constexpr bool pad_n = SelectedKernel::kPadN; + constexpr bool pad_k = SelectedKernel::kPadK; + if(!pad_m && problem.M % SelectedKernel::TileM != 0) + return false; + if(!pad_n && problem.N % SelectedKernel::TileN != 0) + return false; + if(!pad_k && problem.K % SelectedKernel::TileK != 0) + return false; + + // Final feasibility: enough tiles to partition across CUs. Rejecting here + // (instead of throwing at launch) lets the dispatcher's first-fit fall back + // to a non-Stream-K kernel for too-small problems. + return SelectedKernel::IsSupported(make_args(problem)); + } + + /// Device workspace (bytes) needed for `problem`. 0 for Atomic; >0 for + /// Linear/Tree. The Dispatcher uses this to size the buffer it owns and then + /// passes that buffer to the workspace-aware run() below. + std::size_t get_workspace_size(const Problem& problem) const override + { + return SelectedKernel::GetWorkSpaceSize(make_args(problem)); + } + + /// No-workspace entry point: delegates to the workspace-aware overload with a + /// null buffer, so the generated launch() falls back to its internal + /// (self-allocating) path. Used when the caller does not own a workspace. + float run(const void* a_ptr, + const void* b_ptr, + void* c_ptr, + const void** d_ptrs, + const Problem& problem, + void* stream) const override + { + return run(a_ptr, b_ptr, c_ptr, d_ptrs, /*workspace=*/nullptr, problem, stream); + } + + /// Workspace-aware execution (PR-D). `workspace` is the Dispatcher-owned + /// reduction buffer (may be null for Atomic, which needs none). When non-null + /// the generated launch() binds it instead of allocating its own DeviceMem. + float run(const void* a_ptr, + const void* b_ptr, + void* c_ptr, + const void** d_ptrs, + void* workspace, + const Problem& problem, + void* stream) const override + { + (void)d_ptrs; // Not used for Stream-K GEMM + + auto args = make_args(problem, a_ptr, b_ptr, c_ptr); + + const bool bench = this->benchmarking_; + ck_tile::stream_config stream_cfg; + stream_cfg.stream_id_ = reinterpret_cast(stream); + stream_cfg.time_kernel_ = bench; + stream_cfg.log_level_ = 0; + stream_cfg.cold_niters_ = bench ? 5 : 0; + stream_cfg.nrepeat_ = bench ? 10 : 1; + stream_cfg.is_gpu_timer_ = bench; + // Flush the L2 between timed iterations so the measurement is cold, like + // tile_engine and the standalone 03 driver. Leaving the cache warm here was + // the methodology artifact that over-reported TFlops and produced the + // spurious dispatcher-vs-TE "performance gap"; do not present a warm number + // as parity evidence. + stream_cfg.flush_cache_ = bench; + // NOTE: input-buffer rotation is intentionally NOT enabled (rotating_count + // = 1). Atomic reduction accumulates straight into C, and this same run() + // serves the functional path that callers verify against the reference, so + // rotating/accumulating would corrupt the output left on the device. This + // means the timing here is cold-but-non-rotated and is therefore NOT the + // fully apple-to-apple surface: for TE-calibrated numbers use the 03 driver + // (or a --validate 0 pass) which rotates 1000 input copies like tile_engine. + stream_cfg.rotating_count_ = 1; + + if(workspace != nullptr) + return SelectedKernel::launch(args, stream_cfg, workspace); + return SelectedKernel::launch(args, stream_cfg); + } + + bool validate(const void* a_ptr, + const void* b_ptr, + const void* c_ptr, + const void** d_ptrs, + const Problem& problem, + float tolerance) const override + { + (void)d_ptrs; + (void)tolerance; + // This backend owns no host reference, so a numeric correctness check is + // out of scope here (the TE/driver harness does that). But returning a + // blind "true" would mis-report an unrunnable config as valid, so validate + // what we CAN without a reference: non-null operands, a well-formed + // problem, and that THIS Stream-K instance actually supports it. + if(a_ptr == nullptr || b_ptr == nullptr || c_ptr == nullptr) + return false; + if(!problem.is_valid()) + return false; + return supports(problem); + } + + private: + /// Build StreamKHostArgs for `problem`. Leading dims are derived from the + /// kernel key's layouts so every layout works (rcr/rrr/ccr/crr, ...), not + /// just rcr: A is MxK (row->K, col->M), B is KxN (row->N, col->K), C is MxN + /// (row->N, col->M). k_batch is owned by the Stream-K tile partitioner, not + /// passed here. Pointers default to null for sizing-only use + /// (GetWorkSpaceSize). StreamKHostArgs uses ck_tile::index_t (int32); cast + /// from Problem's int64. + ck_tile::StreamKHostArgs make_args(const Problem& problem, + const void* a_ptr = nullptr, + const void* b_ptr = nullptr, + void* c_ptr = nullptr) const + { + using idx = ck_tile::index_t; + // StreamKHostArgs uses int32 index_t while Problem carries int64 dims. + // Guard the narrowing so an oversized M/N/K (or a derived leading dim) + // fails loudly instead of silently wrapping to a negative/garbage extent. + // The dimension parser was widened to std::stoll specifically to avoid + // overflow, so dropping back to int32 here must be checked, not assumed. + auto to_idx = [](std::int64_t v, const char* what) -> idx { + if(v < 0 || v > static_cast(std::numeric_limits::max())) + throw std::runtime_error(std::string("StreamK make_args: ") + what + " (" + + std::to_string(v) + + ") exceeds int32 ck_tile::index_t range"); + return static_cast(v); + }; + + const auto& sig = key_.signature; + const bool a_row = sig.layout_a == LayoutTag::RowMajor; + const bool b_row = sig.layout_b == LayoutTag::RowMajor; + const bool c_row = sig.layout_c == LayoutTag::RowMajor; + const idx M = to_idx(problem.M, "M"); + const idx N = to_idx(problem.N, "N"); + const idx K = to_idx(problem.K, "K"); + const idx stride_a = to_idx(a_row ? problem.K : problem.M, "stride_a"); + const idx stride_b = to_idx(b_row ? problem.N : problem.K, "stride_b"); + const idx stride_c = to_idx(c_row ? problem.N : problem.M, "stride_c"); + return ck_tile::StreamKHostArgs{a_ptr, b_ptr, c_ptr, M, N, K, stride_a, stride_b, stride_c}; + } + + KernelKey key_; + std::string name_; +}; + +/// Helper to create a Stream-K kernel-instance wrapper. +template +std::shared_ptr create_generated_streamk_kernel(const KernelKey& key, + const std::string& name) +{ + return std::make_shared>(key, name); +} + +} // namespace backends +} // namespace dispatcher +} // namespace ck_tile diff --git a/dispatcher/include/ck_tile/dispatcher/backends/tile_backend.hpp b/dispatcher/include/ck_tile/dispatcher/backends/tile_backend.hpp index a3a0b046856..968588a1c45 100644 --- a/dispatcher/include/ck_tile/dispatcher/backends/tile_backend.hpp +++ b/dispatcher/include/ck_tile/dispatcher/backends/tile_backend.hpp @@ -29,27 +29,37 @@ class TileKernelInstance : public KernelInstance bool supports(const Problem& problem) const override { - // Check dimension divisibility if padding not enabled + // Tile-divisibility gate, layout-aware to match + // ck_tile::GemmKernel::IsSupportedArgument (see generated_tile_backend.hpp + // for the full rationale). A dimension is only constrained when an operand + // whose inner axis is that dimension participates and its padding is off: + // RowMajor A->K, ColMajor A->M; RowMajor B->N, ColMajor B->K; + // RowMajor C->N, ColMajor C->M. constexpr bool pad_m = SelectedKernel::kPadM; constexpr bool pad_n = SelectedKernel::kPadN; constexpr bool pad_k = SelectedKernel::kPadK; - if(pad_m && pad_n && pad_k) - { - // Padding enabled - supports any size - return true; - } - - // Check divisibility constexpr int tile_m = SelectedKernel::TileM; constexpr int tile_n = SelectedKernel::TileN; constexpr int tile_k = SelectedKernel::TileK; - if(!pad_m && problem.M % tile_m != 0) + const auto is_row = [](LayoutTag l) { return l == LayoutTag::RowMajor; }; + const bool row_a = is_row(key_.signature.layout_a); + const bool row_b = is_row(key_.signature.layout_b); + const bool row_c = is_row(key_.signature.layout_c); + + const bool require_m = (!row_a) || (!row_c); + const bool require_n = row_b || row_c; + const bool require_k = row_a || (!row_b); + + const std::int64_t k_grain = + static_cast(tile_k) * (problem.k_batch > 0 ? problem.k_batch : 1); + + if(require_m && !pad_m && problem.M % tile_m != 0) return false; - if(!pad_n && problem.N % tile_n != 0) + if(require_n && !pad_n && problem.N % tile_n != 0) return false; - if(!pad_k && problem.K % tile_k != 0) + if(require_k && !pad_k && problem.K % k_grain != 0) return false; // Check shared memory budget if specified @@ -170,4 +180,4 @@ std::shared_ptr create_tile_kernel_instance(const KernelKey& key } // namespace backends } // namespace dispatcher -} // namespace ck_tile +} // namespace ck_tile \ No newline at end of file diff --git a/dispatcher/include/ck_tile/dispatcher/dispatcher.hpp b/dispatcher/include/ck_tile/dispatcher/dispatcher.hpp index d266d693daf..80a90ea0644 100644 --- a/dispatcher/include/ck_tile/dispatcher/dispatcher.hpp +++ b/dispatcher/include/ck_tile/dispatcher/dispatcher.hpp @@ -27,6 +27,7 @@ #include "ck_tile/dispatcher/kernel_instance.hpp" #include "ck_tile/dispatcher/problem.hpp" #include "ck_tile/dispatcher/registry.hpp" +#include #include #include #include @@ -41,6 +42,16 @@ using HeuristicFunction = std::function(const Problem&) /// Dispatcher: Top-level orchestration for kernel selection and execution /// Provides unified interface for kernel dispatch across different backends +/// +/// Concurrency contract: a Dispatcher instance is NOT safe for concurrent use +/// from multiple threads / HIP streams. It owns a single reduction workspace for +/// Stream-K linear/tree kernels (see workspace_ below), which would be corrupted +/// by two overlapping dispatches. Callers that need concurrency should create one +/// Dispatcher per stream/thread (the object is a lightweight handle -- just a +/// Registry* + arch string + heuristic), exactly as one would use per-stream +/// library handles. This mirrors how the workspace is zeroed on the caller's +/// stream in run() (hipMemsetAsync), so a per-stream Dispatcher stays correctly +/// ordered without any cross-stream synchronization. class Dispatcher { public: @@ -56,6 +67,18 @@ class Dispatcher /// @param gfx_arch Target GPU architecture (e.g. "gfx950") explicit Dispatcher(Registry* registry = nullptr, const std::string& gfx_arch = ""); + /// Frees the dispatcher-owned Stream-K reduction workspace, if any. + ~Dispatcher(); + + /// The Dispatcher owns a raw HIP reduction workspace that it frees in the + /// destructor, so it must not be copied (a copy would double-free the buffer) + /// nor moved (no use-case, and consistent with the single-stream contract + /// above). Non-copyable, non-movable. + Dispatcher(const Dispatcher&) = delete; + Dispatcher& operator=(const Dispatcher&) = delete; + Dispatcher(Dispatcher&&) = delete; + Dispatcher& operator=(Dispatcher&&) = delete; + void set_arch(const std::string& arch) { gfx_arch_ = arch; } [[nodiscard]] const std::string& arch() const { return gfx_arch_; } @@ -149,6 +172,19 @@ class Dispatcher std::string gfx_arch_; bool benchmarking_ = true; + // Dispatcher-owned, grow-on-demand reduction workspace for Stream-K kernels + // (linear/tree). Sized via KernelInstance::get_workspace_size() and reused + // across calls so we don't hipMalloc/hipFree on the hot path. Held as a raw + // pointer to keep HIP/ck_tile out of this public header. + mutable void* workspace_ = nullptr; + mutable std::size_t workspace_bytes_ = 0; + + /// Ensure the owned workspace holds at least `bytes`, growing it if needed, + /// and zero the first `bytes` on `stream` (hipMemsetAsync). Not thread-safe -- + /// see the Dispatcher concurrency contract above (one Dispatcher per stream). + /// `stream` is a hipStream_t held as void* to keep HIP out of this header. + void ensure_workspace(std::size_t bytes, void* stream) const; + /// Select kernel using first-fit strategy [[nodiscard]] KernelInstancePtr select_first_fit(const Problem& problem) const; diff --git a/dispatcher/include/ck_tile/dispatcher/kernel_instance.hpp b/dispatcher/include/ck_tile/dispatcher/kernel_instance.hpp index b6ef76e4f87..9b577ece358 100644 --- a/dispatcher/include/ck_tile/dispatcher/kernel_instance.hpp +++ b/dispatcher/include/ck_tile/dispatcher/kernel_instance.hpp @@ -5,6 +5,7 @@ #include "ck_tile/dispatcher/kernel_key.hpp" #include "ck_tile/dispatcher/problem.hpp" +#include #include #include @@ -45,6 +46,30 @@ class KernelInstance const Problem& problem, void* stream = nullptr) const = 0; + /// Device workspace (in bytes) this kernel needs for `problem` (0 = none). + /// Non-zero only for Stream-K linear/tree reductions; the caller (Dispatcher) + /// sizes and owns the buffer and passes it to the workspace-aware run(). + [[nodiscard]] virtual std::size_t get_workspace_size(const Problem& problem) const + { + (void)problem; + return 0; + } + + /// Workspace-aware execution. Default forwards to the no-workspace run(), so + /// existing (non-Stream-K) kernels need no change; the Stream-K backend + /// overrides this to set the reduction workspace pointer before launch. + [[nodiscard]] virtual float run(const void* a_ptr, + const void* b_ptr, + void* c_ptr, + const void** d_ptrs, + void* workspace, + const Problem& problem, + void* stream = nullptr) const + { + (void)workspace; + return run(a_ptr, b_ptr, c_ptr, d_ptrs, problem, stream); + } + /// Validate kernel output against reference implementation /// @param a_ptr Pointer to matrix A (device memory) /// @param b_ptr Pointer to matrix B (device memory) diff --git a/dispatcher/include/ck_tile/dispatcher/kernel_key.hpp b/dispatcher/include/ck_tile/dispatcher/kernel_key.hpp index 24b20ecd9b8..637eea74412 100644 --- a/dispatcher/include/ck_tile/dispatcher/kernel_key.hpp +++ b/dispatcher/include/ck_tile/dispatcher/kernel_key.hpp @@ -48,7 +48,8 @@ enum class Pipeline : std::uint8_t CompV5, // Compute pipeline v5 CompV6, // Compute pipeline v6 PreShuffleV1, // Weight preshuffle pipeline v1 - PreShuffleV2 // Weight preshuffle pipeline v2 (optimized) + PreShuffleV2, // Weight preshuffle pipeline v2 (optimized) + Wavelet // Wavelet pipeline (specialized math + load waves) }; /// Epilogue strategies for output processing @@ -71,6 +72,30 @@ enum class Scheduler : std::uint8_t Interwave }; +/// Stream-K partial-sum reduction strategy. `None` = not a Stream-K kernel. +/// Mirrors ck_tile::StreamKReductionStrategy (Atomic/Linear/Tree). +enum class ReductionStrategy : std::uint8_t +{ + None = 0, + Atomic, + Linear, + Tree +}; + +/// Canonical lower-case name for a reduction strategy. Matches the codegen suffix +/// scheme (atomic -> "atomic", etc.) so callers/drivers share one spelling. +inline const char* to_string(ReductionStrategy r) +{ + switch(r) + { + case ReductionStrategy::Atomic: return "atomic"; + case ReductionStrategy::Linear: return "linear"; + case ReductionStrategy::Tree: return "tree"; + case ReductionStrategy::None: return "none"; + } + return "none"; +} + /// KernelKey: Compile-time kernel configuration metadata /// Organized into Signature (what operation) and Algorithm (how it's implemented) struct KernelKey @@ -146,6 +171,11 @@ struct KernelKey bool pad_m = true; // Support arbitrary M dimensions via padding bool pad_n = true; // Support arbitrary N dimensions via padding bool pad_k = true; // Support arbitrary K dimensions via padding + + // Stream-K (workgroup K-stream) parameters + bool streamk = false; // is a Stream-K kernel + ReductionStrategy reduction_strategy = ReductionStrategy::None; // atomic / linear / tree + bool workspace = false; // needs a device accumulation buffer (linear/tree) } algorithm; std::string gfx_arch; // e.g. "gfx942", "gfx90a", "gfx908" @@ -194,7 +224,10 @@ struct KernelKey algorithm.num_wave_groups, algorithm.pad_m, algorithm.pad_n, - algorithm.pad_k); + algorithm.pad_k, + algorithm.streamk, + algorithm.reduction_strategy, + algorithm.workspace); } /// Equality comparison @@ -291,6 +324,7 @@ inline std::string to_string(Pipeline pipeline) case Pipeline::CompV6: return "compv6"; case Pipeline::PreShuffleV1: return "preshufflev1"; case Pipeline::PreShuffleV2: return "preshufflev2"; + case Pipeline::Wavelet: return "wavelet"; default: return "unknown"; } } @@ -316,6 +350,8 @@ inline Pipeline string_to_pipeline(const std::string& str) return Pipeline::PreShuffleV1; if(str == "preshufflev2") return Pipeline::PreShuffleV2; + if(str == "wavelet") + return Pipeline::Wavelet; return Pipeline::Mem; // Default } @@ -369,6 +405,11 @@ inline Scheduler string_to_scheduler(const std::string& str) { if(str == "auto") return Scheduler::Auto; + // Preshuffle kernels emit "default"; the codegen maps it to Scheduler::Auto + // (see codegen_common.py SCHEDULER_TO_DISPATCHER), so mirror that here + // instead of silently falling through to Intrawave. + if(str == "default") + return Scheduler::Auto; if(str == "intrawave") return Scheduler::Intrawave; if(str == "interwave") @@ -436,6 +477,18 @@ inline std::string KernelKey::encode_identifier() const if(algorithm.preshuffle) oss << "_preshuffle"; + // Stream-K suffix -- must match unified_gemm_codegen.py KernelNaming.generate(): + // atomic -> "..._streamk" linear -> "..._streamk_linear" tree -> "..._streamk_tree" + // Guarded by algorithm.streamk so non-Stream-K identifiers stay byte-identical. + if(algorithm.streamk) + { + oss << "_streamk"; + if(algorithm.reduction_strategy == ReductionStrategy::Linear) + oss << "_linear"; + else if(algorithm.reduction_strategy == ReductionStrategy::Tree) + oss << "_tree"; + } + return oss.str(); } diff --git a/dispatcher/include/ck_tile/dispatcher/ml_heuristic.hpp b/dispatcher/include/ck_tile/dispatcher/ml_heuristic.hpp index 6ae584f6174..dd164894c41 100644 --- a/dispatcher/include/ck_tile/dispatcher/ml_heuristic.hpp +++ b/dispatcher/include/ck_tile/dispatcher/ml_heuristic.hpp @@ -340,8 +340,9 @@ class MLHeuristic auto f = extract_features(prob, key, hw_); int64_t ol = 0; double pred = 0; + // data_type=1 (C_API_DTYPE_FLOAT64): f is std::array. if(LGBM_BoosterPredictForMat( - b_, f.data(), 0, 1, NUM_FEATURES, 1, 0, 0, 0, "", &ol, &pred) != 0) + b_, f.data(), 1, 1, NUM_FEATURES, 1, 0, 0, 0, "", &ol, &pred) != 0) return 0; return log_t_ ? std::expm1(pred) : pred; } diff --git a/dispatcher/include/ck_tile/dispatcher/problem.hpp b/dispatcher/include/ck_tile/dispatcher/problem.hpp index 5bffb56b49b..266a5683281 100644 --- a/dispatcher/include/ck_tile/dispatcher/problem.hpp +++ b/dispatcher/include/ck_tile/dispatcher/problem.hpp @@ -7,6 +7,8 @@ #include #include +#include "ck_tile/dispatcher/kernel_key.hpp" // ReductionStrategy + namespace ck_tile { namespace dispatcher { @@ -58,6 +60,10 @@ struct Problem // Validation control bool enable_validation; // Enable output validation against reference + // Stream-K request: which reduction strategy the caller wants (None = non-Stream-K) + bool streamk = false; + ReductionStrategy reduction_strategy = ReductionStrategy::None; + /// Default constructor with sensible defaults Problem() : M(0), @@ -66,7 +72,9 @@ struct Problem k_batch(1), smem_budget(0), prefer_persistent(false), - enable_validation(false) + enable_validation(false), + streamk(false), + reduction_strategy(ReductionStrategy::None) { } @@ -78,7 +86,9 @@ struct Problem k_batch(1), smem_budget(0), prefer_persistent(false), - enable_validation(false) + enable_validation(false), + streamk(false), + reduction_strategy(ReductionStrategy::None) { } @@ -293,6 +303,14 @@ class ProblemBuilder return *this; } + /// Request a Stream-K kernel with a given reduction strategy + ProblemBuilder& stream_k(ReductionStrategy strategy = ReductionStrategy::Atomic) + { + problem_.streamk = true; + problem_.reduction_strategy = strategy; + return *this; + } + /// Build the Problem [[nodiscard]] Problem build() const { diff --git a/dispatcher/library/CMakeLists.txt b/dispatcher/library/CMakeLists.txt index a0e07fd3ede..3e5d94400e7 100644 --- a/dispatcher/library/CMakeLists.txt +++ b/dispatcher/library/CMakeLists.txt @@ -14,8 +14,7 @@ # ---- Configuration (inherits from parent scope) ---- set(DISPATCHER_DIR "${PROJECT_SOURCE_DIR}/dispatcher") -set(DISPATCHER_CODEGEN "${DISPATCHER_DIR}/codegen/unified_grouped_conv_codegen.py") -set(DISPATCHER_CONFIG_SET "tests" CACHE STRING "Dispatcher config set: tests or profiler") +set(DISPATCHER_RULE_SET "tests" CACHE STRING "Dispatcher rule set: profiler, tests, full, full-tests, tiny, or default") # Extract first GPU target for codegen string(REPLACE ";" " " _GPU_TARGETS_SPACE "${GPU_TARGETS}") @@ -24,10 +23,6 @@ list(GET _GPU_TARGETS_LIST 0 _GPU_TARGET) # ---- Variant-to-path mapping tables ---- -set(_DISP_CONFIG_SUBDIR_fwd "forward") -set(_DISP_CONFIG_SUBDIR_bwd_weight "backward_weight") -set(_DISP_CONFIG_SUBDIR_bwd_data "backward_data") - set(_DISP_GEN_SCRIPT "generate_profiler_kernels.py") set(_DISP_HEADER_PREFIX_fwd "grouped_conv_fwd_") @@ -45,31 +40,27 @@ set(_DISP_HEADER_PREFIX_bwd_data "grouped_conv_bwd_data_") # ============================================================================= function(ck_add_dispatcher_conv_instances VARIANT) # Look up variant-specific paths - set(CONFIG_SUBDIR "${_DISP_CONFIG_SUBDIR_${VARIANT}}") set(HEADER_PREFIX "${_DISP_HEADER_PREFIX_${VARIANT}}") - if(NOT CONFIG_SUBDIR) + if(NOT HEADER_PREFIX) message(FATAL_ERROR "Unknown dispatcher variant: ${VARIANT}") endif() - set(CONFIG_DIR "${DISPATCHER_DIR}/codegen/configs/grouped_conv/${CONFIG_SUBDIR}") set(SCRIPT_PATH "${DISPATCHER_DIR}/scripts/${_DISP_GEN_SCRIPT}") set(KERNEL_DIR "${CMAKE_CURRENT_BINARY_DIR}/dispatcher_${VARIANT}_kernels") set(TARGET_NAME "ck_dispatcher_grouped_conv_${VARIANT}") # --- Step 1: Run Python codegen at configure time --- - # Always regenerate: DISPATCHER_CONFIG_SET is a CACHE variable, so changing it + # Always regenerate: DISPATCHER_RULE_SET is a CACHE variable, so changing it # triggers a full reconfigure. Wipe the kernel dir first to remove stale files. file(REMOVE_RECURSE ${KERNEL_DIR}) file(MAKE_DIRECTORY ${KERNEL_DIR}) execute_process( COMMAND ${Python3_EXECUTABLE} ${SCRIPT_PATH} --variant ${VARIANT} - --config-dir ${CONFIG_DIR} - --codegen ${DISPATCHER_CODEGEN} --output-dir ${KERNEL_DIR} --arch ${_GPU_TARGET} - --config-set ${DISPATCHER_CONFIG_SET} + --rule-set ${DISPATCHER_RULE_SET} RESULT_VARIABLE ret OUTPUT_VARIABLE output ERROR_VARIABLE error @@ -78,7 +69,7 @@ function(ck_add_dispatcher_conv_instances VARIANT) if(NOT ret EQUAL 0) message(FATAL_ERROR "Dispatcher ${VARIANT} kernel generation failed.\nReturn: ${ret}\nOutput: ${output}\nError: ${error}") endif() - message(STATUS "Dispatcher ${VARIANT} kernels generated (config set: ${DISPATCHER_CONFIG_SET}): ${output}") + message(STATUS "Dispatcher ${VARIANT} kernels generated (rule set: ${DISPATCHER_RULE_SET}): ${output}") # --- Step 2: Create .cpp wrappers for each generated kernel header --- file(GLOB _KERNEL_HEADERS "${KERNEL_DIR}/${HEADER_PREFIX}*.hpp") @@ -115,12 +106,15 @@ function(ck_add_dispatcher_conv_instances VARIANT) ) target_compile_options(${TARGET_NAME} PRIVATE -DCK_TILE_FLOAT_TO_BFLOAT16_DEFAULT=0 - -mllvm -enable-noalias-to-md-conversion=0 + -DCK_TILE_EXPERIMENTAL_USE_BUFFER_LOAD_OOB_CHECK_OFFSET_TRICK=1 -Wno-undefined-func-template -Wno-float-equal -Wno-header-hygiene -Wno-unused-parameter -Wno-missing-variable-declarations + # New clang -Weverything suggestion firing on builder-pattern setters that + # return *this in the shared dispatcher headers; not a real defect. + -Wno-lifetime-safety-intra-tu-suggestions ) if(NOT WIN32 AND ${hip_VERSION_FLAT} GREATER 600241132) target_compile_options(${TARGET_NAME} PRIVATE --offload-compress) diff --git a/dispatcher/parity_diag/regression/ab_efficient_sweep.py b/dispatcher/parity_diag/regression/ab_efficient_sweep.py new file mode 100644 index 00000000000..c7a332e9b93 --- /dev/null +++ b/dispatcher/parity_diag/regression/ab_efficient_sweep.py @@ -0,0 +1,163 @@ +#!/usr/bin/env python3 +"""Efficient A/B sweep: bridge .so vs Old-TE binary, all layouts + fp16/bf16. + +Faster successor to run_alllayout_sweep.py: the bridge side batches all shapes +for a stem into ONE run_one_gemm_kernel.py worker call (one Python+numpy+CDLL +startup per stem instead of one per measurement). Old-TE binaries are run once +per shape; their internal warmup=50/repeat=100 already yields a stable median, +matching the prior methodology. + +- Bridge .so : main worktree dispatcher/build/examples (built from the FIXED source). +- Old-TE bin : develop-parity worktree build/bin (develop branch), per user instruction. + +Writes allresult_fp16_bf16.csv with resume support (keyed on stem,shape). + +CSV fields: stem,pipeline,dtype,layout,shape,bridge_tflops,old_tflops,gap_pct, + bridge_verified,oldte_built +""" +import csv, json, os, re, subprocess, sys, time +from pathlib import Path + +ROOT = Path("/home/AMD/muozturk/New_project/rocm-libraries/projects/composablekernel") +DISP = ROOT / "dispatcher" +WORKER = ROOT / "tile_engine/ops/gemm/run_one_gemm_kernel.py" +SO_DIR = DISP / "build" / "examples" +GEN_DIR = DISP / "build" / "generated_kernels" +OLD_BIN_DIR = Path( + "/home/AMD/muozturk/New_project/rocm-libraries/.claude/worktrees" + "/develop-parity/projects/composablekernel/build/bin" +) +REG = DISP / "parity_diag" / "regression" +STEMS_FILE = REG / "stems_selected.txt" +CSV_OUT = REG / "allresult_fp16_bf16.csv" + +PYPATH = os.pathsep.join([str(DISP / "python"), str(ROOT / "tile_engine/ops/gemm")]) +DEVICE = os.environ.get("PARITY_DEVICE", "0") + +SHAPES = [(512, 512, 512), (1024, 1024, 1024), (2048, 2048, 2048), + (1024, 512, 256), (4096, 4096, 4096)] + +FIELDS = ["stem", "pipeline", "dtype", "layout", "shape", + "bridge_tflops", "old_tflops", "gap_pct", + "bridge_verified", "oldte_built"] + +_TFLOPS_RE = re.compile(r'"tflops\(TFlops\)":\s*([0-9.]+)') + + +def pipeline_of(stem): + for p in ("compv3", "compv4", "mem"): + if f"_{p}_" in stem: + return p + return "other" + + +def base_env(): + env = os.environ.copy() + env["HIP_VISIBLE_DEVICES"] = DEVICE + env["GEMM_PYPATH"] = PYPATH + env["LD_LIBRARY_PATH"] = "/opt/rocm/lib:" + env.get("LD_LIBRARY_PATH", "") + return env + + +def run_bridge_all(stem): + """One batched worker call over all SHAPES. Returns {shape_str: tflops|None}.""" + so = SO_DIR / f"libgemm_{stem}.so" + out = {f"{M}x{N}x{K}": None for (M, N, K) in SHAPES} + if not so.exists(): + return out + # Staleness guard: a .so older than its generated header was built from an + # obsolete codegen and must NOT be measured -- doing so reports phantom + # regressions (the big 256-tile gaps in allresult_fp16_bf16_2.csv were all + # stale binaries that recovered to parity on rebuild). Treat stale as missing. + hdr = GEN_DIR / f"gemm_{stem}.hpp" + if hdr.exists() and so.stat().st_mtime < hdr.stat().st_mtime: + print(f" STALE .so (older than header), skipping: {stem}", file=sys.stderr, flush=True) + return out + items = [{"so_path": str(so), "problem": {"M": M, "N": N, "K": K}, + "kernel_name": f"gemm_{stem}"} for (M, N, K) in SHAPES] + payload = json.dumps({"items": items, "verify": False}) + try: + p = subprocess.run([sys.executable, str(WORKER)], input=payload.encode(), + stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, + env=base_env(), timeout=900) + except subprocess.TimeoutExpired: + return out + for line in p.stdout.decode().strip().splitlines(): + try: + d = json.loads(line) + except json.JSONDecodeError: + continue + idx = d.get("idx") + if isinstance(idx, int) and 0 <= idx < len(SHAPES) and d.get("ok"): + M, N, K = SHAPES[idx] + out[f"{M}x{N}x{K}"] = d.get("tflops") + return out + + +def run_oldte(stem, M, N, K): + binp = OLD_BIN_DIR / f"benchmark_gemm_universal_{stem}" + if not binp.exists(): + return None + try: + p = subprocess.run([str(binp), f"-m={M}", f"-n={N}", f"-k={K}", + "-warmup=50", "-repeat=100"], + stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, + env=base_env(), timeout=300) + except subprocess.TimeoutExpired: + return None + m = _TFLOPS_RE.search(p.stdout.decode()) + return float(m.group(1)) if m else None + + +def main(): + stems = [l.strip() for l in STEMS_FILE.read_text().splitlines() if l.strip()] + total = len(stems) * len(SHAPES) + done = set() + if CSV_OUT.exists(): + with open(CSV_OUT) as f: + for row in csv.DictReader(f): + done.add((row["stem"], row["shape"])) + mode = "a" if done else "w" + print(f"stems={len(stems)} shapes={len(SHAPES)} total={total} resume={len(done)}", flush=True) + + t0 = time.time(); n = len(done) + with open(CSV_OUT, mode, newline="") as fh: + w = csv.DictWriter(fh, fieldnames=FIELDS) + if mode == "w": + w.writeheader() + for stem in stems: + shapes_todo = [(M, N, K) for (M, N, K) in SHAPES + if (stem, f"{M}x{N}x{K}") not in done] + if not shapes_todo: + continue + parts = stem.split("_") + dtype, layout = parts[0], parts[1] + pipeline = pipeline_of(stem) + oldte_built = (OLD_BIN_DIR / f"benchmark_gemm_universal_{stem}").exists() + + bridge = run_bridge_all(stem) + for (M, N, K) in shapes_todo: + shape = f"{M}x{N}x{K}" + bt = bridge.get(shape) + ot = run_oldte(stem, M, N, K) + if bt is not None and ot not in (None, 0): + gap = (bt - ot) / ot * 100.0 + else: + gap = float("nan") + w.writerow(dict( + stem=stem, pipeline=pipeline, dtype=dtype, layout=layout, shape=shape, + bridge_tflops=f"{bt:.4f}" if bt is not None else "nan", + old_tflops=f"{ot:.4f}" if ot is not None else "nan", + gap_pct=f"{gap:.4f}" if gap == gap else "nan", + bridge_verified="None", oldte_built=str(oldte_built))) + fh.flush() + n += 1 + el = time.time() - t0 + rate = (n - len(done)) / el if el > 0 else 0 + eta = (total - n) / rate / 3600 if rate > 0 else 0 + print(f"[{n}/{total}] {stem[:48]:48} rate={rate:.1f}/s ETA={eta:.1f}h", flush=True) + print(f"DONE rows={n} -> {CSV_OUT}", flush=True) + + +if __name__ == "__main__": + main() diff --git a/dispatcher/parity_diag/regression/ab_same_harness.py b/dispatcher/parity_diag/regression/ab_same_harness.py new file mode 100644 index 00000000000..91910717449 --- /dev/null +++ b/dispatcher/parity_diag/regression/ab_same_harness.py @@ -0,0 +1,310 @@ +#!/usr/bin/env python3 +"""Apples-to-apples GEMM A/B: bridge kernel vs old-TE kernel, ONE harness. + +Why this exists +--------------- +The earlier sweep (allsweep6144rcrfp16.py) compared the bridge's dispatcher +measurement against old TE's *standalone benchmark binary* +(benchmark_gemm_universal_). That comparison is NOT apples-to-apples: +the device kernel is byte-identical, yet old TE's standalone binary reports +~18-20% lower TFLOPS at e.g. 1024^3 / compv4. rocprof shows the identical +kernel genuinely runs longer in that process -- ~+8% cycles plus a lower +sustained SCLK -- a power/clock + execution-environment artifact of that +binary, NOT a bridge speedup, compiler difference, or kernel difference. +(See diagnose.md sec.4.) + +This harness removes the artifact: it builds the OLD-TE kernel into a .so from +old TE's own generated header and runs BOTH the bridge kernel and the old-TE +kernel through the SAME worker (run_one_gemm_kernel.py). Measured this way the +gap collapses to ~1%, which is the honest result. + +The old-TE generated-header directory is derived per stem as +``///`` (e.g. fp16/rcr, bf16/crr), so a single +run covers every dtype/layout. Set OLD_TE_GEN to pin one explicit leaf dir for +all stems (legacy behavior); set OLD_TE_GEN_BASE to relocate the base. + +Usage: + python3 ab_same_harness.py # default kernel list + shapes + python3 ab_same_harness.py [...] # explicit stems + python3 ab_same_harness.py --stems-file F [--csv OUT] # sweep a stems file +""" +import argparse +import csv +import json +import os +import statistics +import subprocess +import sys +from pathlib import Path + +# composablekernel root: .../composablekernel/dispatcher/parity_diag/regression/ +ROOT = Path(__file__).resolve().parents[3] +DISP = ROOT / "dispatcher" +GEN = DISP / "build" / "generated_kernels" +SRC = DISP / "bindings" / "ctypes" / "gemm_ctypes_lib.cpp" +STATIC = DISP / "build" / "libck_tile_dispatcher.a" +BR_SO_DIR = DISP / "build" / "examples" +WORKER = ROOT / "tile_engine/ops/gemm/run_one_gemm_kernel.py" +# Base dir of old-TE generated single-kernel headers; the per-stem leaf +# (/) is appended in old_gen_dir(). Points at a sibling +# develop-parity worktree under the rocm-libraries root by default. +OLD_GEN_BASE = Path(os.environ.get( + "OLD_TE_GEN_BASE", + str(ROOT.parents[1] / ".claude/worktrees/develop-parity" + "/projects/composablekernel/build/tile_engine/ops/gemm/gemm_universal"), +)) +# Legacy explicit override: when set, this exact leaf dir is used for ALL stems. +OLD_GEN_PIN = os.environ.get("OLD_TE_GEN") +OUT = DISP / "parity_diag" / "regression" / "_ab_same_harness_build" +ARCH = os.environ.get("GFX_ARCH", "gfx942") +DEVICE = os.environ.get("PARITY_DEVICE", "0") +REPEATS = int(os.environ.get("AB_REPEATS", "3")) + +SHAPES = [(512, 512, 512), (1024, 1024, 1024), (2048, 2048, 2048), + (1024, 512, 256), (4096, 4096, 4096)] + +DEFAULT_STEMS = [ + "fp16_rcr_compv4_default_intrawave_False_False_False_False_64x128x64_2x2x1_32x32x16", + "fp16_rcr_compv4_cshuffle_intrawave_False_False_False_False_64x128x64_1x4x1_32x32x16", + "fp16_rcr_compv4_default_intrawave_False_False_False_False_128x128x64_4x1x1_32x32x16", +] + +PYPATH = os.pathsep.join([str(DISP / "python"), str(ROOT / "tile_engine/ops/gemm")]) + + +def old_gen_dir(stem: str) -> Path: + """Old-TE header dir for a stem: // (or the pinned dir). + + Stems are named ``__...`` (e.g. fp16_rcr_..., bf16_crr_...), + which is exactly the develop-parity gen-tree layout, so the leaf is derived + from the stem itself -- no per-layout hardcoding. + """ + if OLD_GEN_PIN: + return Path(OLD_GEN_PIN) + parts = stem.split("_") + dtype, layout = parts[0], parts[1] + return OLD_GEN_BASE / dtype / layout + + +def build_old_so(stem: str) -> Path | None: + """Compile old TE's generated kernel header into a bridge-loadable .so. + + Cached: if the .so already exists it is reused, so a parallel --build-only + pre-pass (CPU-bound hipcc) can be separated from the serial GPU measurement. + """ + hdr = old_gen_dir(stem) / f"gemm_universal_single_{stem}.hpp" + if not hdr.exists(): + return None + OUT.mkdir(parents=True, exist_ok=True) + obj = OUT / f"{stem}.o" + lib = OUT / f"libold_{stem}.so" + if lib.exists(): + return lib + common = [ + "-fPIC", "-O3", + f"-I{DISP / 'include'}", f"-I{ROOT / 'include'}", f"-I{ROOT}", f"-I{GEN}", + "-DCK_TILE_SINGLE_KERNEL_INCLUDE", f"-include{hdr}", "-D__HIP_PLATFORM_AMD__", + f"--offload-arch={ARCH}", f'-DGFX_ARCH="{ARCH}"', + # Match the bridge build's AMDGPU codegen flags (gemm_utils.py + # _build_compile_jobs / _TILE_ENGINE_CODEGEN_FLAGS), which are also what + # Tile Engine's own CMake passes. Without these the old-TE side is built + # with a *different* instruction schedule (notably -enable-post-misched + # defaults back on) and runs ~10-40% faster than real old-TE, making the + # bridge look regressed when it is actually at parity. Build BOTH sides + # identically so the A/B measures the kernel, not a flag asymmetry. + "-mllvm", "-enable-noalias-to-md-conversion=0", + "-mllvm", "--lsr-drop-solution=1", + "-mllvm", "-enable-post-misched=0", + "-mllvm", "-amdgpu-early-inline-all=true", + "-mllvm", "-amdgpu-function-calls=false", + "-fno-offload-uniform-block", + "-Wno-undefined-func-template", "-Wno-float-equal", + ] + cc = subprocess.run(["/opt/rocm/bin/hipcc", "-c", *common, str(SRC), "-o", str(obj)], + capture_output=True) + if cc.returncode != 0: + return None + ln = subprocess.run(["/opt/rocm/bin/hipcc", "-shared", "-fPIC", + f"--offload-arch={ARCH}", "--hip-link", + str(obj), str(STATIC), "-o", str(lib)], capture_output=True) + return lib if ln.returncode == 0 else None + + +def meas(so: Path, M: int, N: int, K: int) -> float | None: + """Median TFLOPS over REPEATS worker calls (each call does its own + warmup=50/repeat=100 internally). Median, not max, to match the sweep + methodology and stay robust to the occasional clock-warmup outlier.""" + if not so or not Path(so).exists(): + return None + payload = json.dumps({"so_path": str(so), "problem": {"M": M, "N": N, "K": K}, + "kernel_name": "x"}) + env = os.environ.copy() + env["HIP_VISIBLE_DEVICES"] = DEVICE + env["GEMM_PYPATH"] = PYPATH + env["LD_LIBRARY_PATH"] = "/opt/rocm/lib:" + env.get("LD_LIBRARY_PATH", "") + samples = [] + for _ in range(REPEATS): + p = subprocess.run([sys.executable, str(WORKER)], input=payload.encode(), + stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, env=env) + for line in p.stdout.decode().splitlines(): + try: + d = json.loads(line) + except json.JSONDecodeError: + continue + if d.get("ok"): + samples.append(d["tflops"]) + return statistics.median(samples) if samples else None + + +def meas_all(so: Path) -> dict: + """Median TFLOPS per shape from REPEATS *batched* worker calls. + + One worker call measures ALL shapes (5x fewer python+numpy+CDLL startups + than per-shape meas()), which is the throughput lever for a full sweep on a + single GPU. Returns {shape_str: tflops|None}.""" + out = {f"{M}x{N}x{K}": None for (M, N, K) in SHAPES} + if not so or not Path(so).exists(): + return out + items = [{"so_path": str(so), "problem": {"M": M, "N": N, "K": K}, + "kernel_name": "x"} for (M, N, K) in SHAPES] + payload = json.dumps({"items": items, "verify": False}) + env = os.environ.copy() + env["HIP_VISIBLE_DEVICES"] = DEVICE + env["GEMM_PYPATH"] = PYPATH + env["LD_LIBRARY_PATH"] = "/opt/rocm/lib:" + env.get("LD_LIBRARY_PATH", "") + samples = {s: [] for s in out} + for _ in range(REPEATS): + p = subprocess.run([sys.executable, str(WORKER)], input=payload.encode(), + stdout=subprocess.PIPE, stderr=subprocess.DEVNULL, + env=env, timeout=900) + for line in p.stdout.decode().splitlines(): + try: + d = json.loads(line) + except json.JSONDecodeError: + continue + idx = d.get("idx") + if isinstance(idx, int) and 0 <= idx < len(SHAPES) and d.get("ok"): + M, N, K = SHAPES[idx] + samples[f"{M}x{N}x{K}"].append(d["tflops"]) + for s, xs in samples.items(): + if xs: + out[s] = statistics.median(xs) + return out + + +def pipeline_of(stem: str) -> str: + for p in ("compv3", "compv4", "mem"): + if f"_{p}_" in stem: + return p + return "other" + + +def main(): + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("stems", nargs="*", help="kernel stems to A/B") + ap.add_argument("--stems-file", help="file with one stem per line") + ap.add_argument("--csv", help="write results to CSV (resume-aware)") + ap.add_argument("--build-only", action="store_true", + help="parallel-compile old-TE .so for all stems, then exit " + "(CPU pre-pass; GPU measurement reuses the cache)") + ap.add_argument("--jobs", type=int, default=min(os.cpu_count() or 8, 16), + help="parallel compile jobs for --build-only") + args = ap.parse_args() + + stems = list(args.stems) + if args.stems_file: + stems += [l.strip() for l in Path(args.stems_file).read_text().splitlines() + if l.strip()] + stems = stems or DEFAULT_STEMS + + # Parallel CPU pre-compile of every old-TE .so (no GPU touched). + if args.build_only: + from concurrent.futures import ProcessPoolExecutor, as_completed + ok = miss = fail = 0 + print(f"build-only: {len(stems)} stems, jobs={args.jobs}", flush=True) + with ProcessPoolExecutor(max_workers=args.jobs) as ex: + futs = {ex.submit(build_old_so, s): s for s in stems} + for i, fut in enumerate(as_completed(futs), 1): + try: + r = fut.result() + except Exception: + r = None + s = futs[fut] + if r is None: + # distinguish "no header" from "compile failed" + if (old_gen_dir(s) / f"gemm_universal_single_{s}.hpp").exists(): + fail += 1 + else: + miss += 1 + else: + ok += 1 + if i % 100 == 0: + print(f" [{i}/{len(stems)}] ok={ok} no_header={miss} fail={fail}", + flush=True) + print(f"build-only DONE: ok={ok} no_header={miss} fail={fail}", flush=True) + return + + # CSV sweep mode: same columns as the (now-corrected) sweep, resume-aware. + if args.csv: + fields = ["stem", "pipeline", "dtype", "layout", "shape", + "bridge_tflops", "old_tflops", "gap_pct", "oldte_built"] + out = Path(args.csv) + done = set() + if out.exists(): + with open(out) as f: + for row in csv.DictReader(f): + done.add((row["stem"], row["shape"])) + mode = "a" if done else "w" + print(f"stems={len(stems)} shapes={len(SHAPES)} resume={len(done)} -> {out}", + flush=True) + with open(out, mode, newline="") as fh: + w = csv.DictWriter(fh, fieldnames=fields) + if mode == "w": + w.writeheader() + for stem in stems: + todo = [(M, N, K) for (M, N, K) in SHAPES + if (stem, f"{M}x{N}x{K}") not in done] + if not todo: + continue + parts = stem.split("_") + dtype, layout = parts[0], parts[1] + old_so = build_old_so(stem) + br_so = BR_SO_DIR / f"libgemm_{stem}.so" + # Batched: one worker call per side covers all shapes. + bridge = meas_all(br_so) + old = meas_all(old_so) if old_so else {} + for (M, N, K) in todo: + shape = f"{M}x{N}x{K}" + b = bridge.get(shape) + o = old.get(shape) + gap = (b - o) / o * 100 if (b and o) else float("nan") + w.writerow(dict( + stem=stem, pipeline=pipeline_of(stem), dtype=dtype, + layout=layout, shape=shape, + bridge_tflops=f"{b:.4f}" if b is not None else "nan", + old_tflops=f"{o:.4f}" if o is not None else "nan", + gap_pct=f"{gap:.4f}" if gap == gap else "nan", + oldte_built=str(old_so is not None))) + fh.flush() + print(f" done {stem[:60]}", flush=True) + print(f"DONE -> {out}", flush=True) + return + + # Pretty-print mode. + print(f"{'shape':>14} {'bridge':>9} {'oldTE':>9} {'gap%':>7} kernel") + for stem in stems: + old_so = build_old_so(stem) + br_so = BR_SO_DIR / f"libgemm_{stem}.so" + if old_so is None: + print(f" [skip: no old-TE header] {stem}") + continue + for (M, N, K) in SHAPES: + b = meas(br_so, M, N, K) + o = meas(old_so, M, N, K) + gap = (b - o) / o * 100 if (b and o) else float("nan") + print(f"{f'{M}x{N}x{K}':>14} {b or float('nan'):9.2f} " + f"{o or float('nan'):9.2f} {gap:7.2f} {stem[:40]}") + + +if __name__ == "__main__": + main() diff --git a/dispatcher/python/ctypes_utils.py b/dispatcher/python/ctypes_utils.py index d719d1405e5..ce481094965 100644 --- a/dispatcher/python/ctypes_utils.py +++ b/dispatcher/python/ctypes_utils.py @@ -154,6 +154,7 @@ def get_arch_filter_data() -> Dict[str, Any]: TRAIT_UNSUPPORTED_COMBINATIONS, WARP_SUPPORTED_COMBINATIONS, WARP_TILE_SUPPORTED_COMBINATIONS, + PRESHUFFLE_WARP_TILE_SUPPORTED_COMBINATIONS, get_supported_archs, ) @@ -161,6 +162,12 @@ def get_arch_filter_data() -> Dict[str, Any]: "trait_unsupported": TRAIT_UNSUPPORTED_COMBINATIONS, "warp_combos": WARP_SUPPORTED_COMBINATIONS, "warp_tile_combos": WARP_TILE_SUPPORTED_COMBINATIONS, + # Preshuffle uses a distinct (smaller) MFMA warp-tile whitelist -- e.g. + # gfx942 fp8 preshuffle allows [16,16,32]/[16,16,64] but NOT the + # standard [16,16,16]. Using the standard table would let expand_sweep + # emit fp8/bf8 preshuffle configs the codegen then rejects (disjoint + # accepted sets), so validation consults this table for preshuffle. + "preshuffle_warp_tile_combos": PRESHUFFLE_WARP_TILE_SUPPORTED_COMBINATIONS, "supported_archs": get_supported_archs(), } except ImportError: @@ -177,13 +184,17 @@ def get_arch_filter_data() -> Dict[str, Any]: "gfx90a": [[1, 4, 1], [2, 2, 1], [4, 1, 1]], }, "warp_tile_combos": { - "gfx942": {"fp16_fp16_fp16": [[16, 16, 16], [32, 32, 16]]}, - "gfx90a": {"fp16_fp16_fp16": [[16, 16, 16], [32, 32, 16]]}, + "gfx942": {"fp16_fp16_fp32": [[16, 16, 16], [32, 32, 16]]}, + "gfx90a": {"fp16_fp16_fp32": [[16, 16, 16], [32, 32, 16]]}, + }, + "preshuffle_warp_tile_combos": { + "gfx942": { + "fp16_fp16_fp32": [[16, 16, 16], [32, 32, 16], [16, 16, 32]], + "fp8_fp8_fp32": [[32, 32, 16], [16, 16, 32], [16, 16, 64]], + }, }, "supported_archs": ["gfx90a", "gfx942", "gfx950"], } - - @dataclass class ValidationResult: """Result of kernel config validation.""" @@ -281,18 +292,42 @@ def validate_kernel_config(config: "KernelConfig") -> ValidationResult: suggested_fixes["wave_n"] = warp_combos[0][1] suggested_fixes["wave_k"] = warp_combos[0][2] - # Check warp tile configuration for this arch and dtype - dtype_key = f"{dtype}_{dtype}_{dtype}" + # Check warp tile configuration for this arch and dtype. + # The arch_specs tables key on the ACCUMULATOR dtype (e.g. "fp8_fp8_fp32", + # "int8_int8_int32"), not the input dtype repeated -- using + # f"{dtype}_{dtype}_{dtype}" silently missed every non-fp16 key and fell + # through to the permissive default, admitting warp tiles the codegen rejects. + # + # The key is "{dtype_a}_{dtype_b}_{dtype_acc}". This shared standard path also + # serves mixed-A/B-dtype configs (e.g. fp8_bf8). The tables above are indexed + # by the (dtype_a, dtype_b) pair, so both must be threaded through -- building + # the key from dtype_a repeated would silently look up the wrong (or a + # nonexistent) entry for a mixed-dtype caller and fall through to the + # permissive default. Preshuffle's own scope pins dtype_a == dtype_b, but this + # helper lives on the shared path, so key on both explicitly. + dtype_b = getattr(config, "dtype_b", None) or dtype + dtype_acc = getattr(config, "dtype_acc", None) or ( + "int32" if dtype == "int8" else "fp32" + ) + dtype_key = f"{dtype}_{dtype_b}_{dtype_acc}" + # Preshuffle consults its own (smaller) whitelist; other variants use the + # standard GEMM warp-tile table. + table_key = ( + "preshuffle_warp_tile_combos" + if variant == "preshuffle" + else "warp_tile_combos" + ) warp_tile_combos = ( - arch_data["warp_tile_combos"] + arch_data.get(table_key, {}) .get(arch, {}) .get(dtype_key, [[32, 32, 16], [16, 16, 16]]) ) warp_cfg = [warp_m, warp_n, warp_k] if warp_cfg not in warp_tile_combos: valid_str = ", ".join(f"[{c[0]},{c[1]},{c[2]}]" for c in warp_tile_combos[:5]) + dtype_label = dtype if dtype_b == dtype else f"{dtype}/{dtype_b}" errors.append( - f"Unsupported warp tile [{warp_m},{warp_n},{warp_k}] for {arch}/{dtype}. Valid: {valid_str}" + f"Unsupported warp tile [{warp_m},{warp_n},{warp_k}] for {arch}/{dtype_label}. Valid: {valid_str}" ) if warp_tile_combos: suggested_fixes["warp_m"] = warp_tile_combos[0][0] @@ -311,8 +346,6 @@ def validate_kernel_config(config: "KernelConfig") -> ValidationResult: warnings=warnings, suggested_fixes=suggested_fixes, ) - - def auto_correct_kernel_config( config: "KernelConfig", verbose: bool = False ) -> Tuple["KernelConfig", bool, List[str]]: @@ -1073,7 +1106,7 @@ def _generate_single_kernel_subprocess(args: dict) -> Tuple[bool, Optional[str], "--config", config_file, "--variants", - "standard", + args.get("variant", "standard"), ] res = subprocess.run(cmd, capture_output=True, text=True, timeout=300) @@ -1389,7 +1422,7 @@ class KernelConfig: gfx_arch: str = "gfx942" # GEMM variant (affects arch filter validation) - # "standard", "preshuffle", or "multi_d" + # "standard", "preshuffle", "multi_d", or "stream_k" variant: str = "standard" @property diff --git a/dispatcher/python/gemm_utils.py b/dispatcher/python/gemm_utils.py new file mode 100644 index 00000000000..50367bd26b7 --- /dev/null +++ b/dispatcher/python/gemm_utils.py @@ -0,0 +1,2422 @@ +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT +""" +GEMM Tile Engine <-> Dispatcher bridge. + +This is the GEMM counterpart of ``grouped_conv_utils.py`` / ``fmha_utils.py``: +a single shared config dataclass (``GemmKernelConfig``) that Tile Engine imports +and hands back to the dispatcher. There is no translator between two +vocabularies -- both sides share the one object whose ``.name`` mirrors the +kernel identifier baked into the generated kernel header. + +Public surface (mirrors the grouped_conv bridge): + + GemmKernelConfig -- the shared contract dataclass + .name -- registry/runtime lookup key (byte-exact) + .to_codegen_json() -- feeds unified_gemm_codegen.py + GemmProblem -- a single (M, N, K) problem + setup_multiple_gemm_dispatchers -- codegen + hipcc -> .so paths (NO GPU) + GemmDispatcherLib -- thin ctypes ABI wrapper + GpuGemmRunner -- GPU memory + run + time (from a .so path) + expand_sweep -- TE JSON sweep config -> [GemmKernelConfig] + +The heavy lifting for codegen and compilation is reused from ``ctypes_utils`` +so there is a single source of truth for how a kernel header is produced and +how it is compiled into a ``.so``. +""" + +from __future__ import annotations + +import ctypes +import functools +import itertools +import json +import multiprocessing +import subprocess +import tempfile +from concurrent.futures import ProcessPoolExecutor, as_completed +from dataclasses import dataclass, field, replace +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple + +import numpy as np + +# Reuse the proven codegen/compile leaf helpers from the dispatcher's own +# python layer. gemm_utils is a thin bridge on top of these. +import ctypes_utils as _cu + +_LAYOUT_CHAR = {"row": "r", "col": "c", "r": "r", "c": "c"} +_LAYOUT_WORD = {"r": "row", "c": "col"} + +# --- Bridge shared helpers (canonical superset; byte-identical across bridges) --- +# Supported GPU architectures for the bridge (single source of truth). +_SUPPORTED_ARCHES = ("gfx90a", "gfx942", "gfx950") + +# Single source of truth for the preshuffle B-shuffle permutation used by the +# bridge. The bridge codegen only emits the NON-permuteN preshuffle pipeline +# (WeightPreshufflePipelineAGmemBGmemCRegV2), whose device-side B packing matches +# ck_tile::shuffle_b (permute_n=False). Old-TE's default_config.json / +# default_ci_config.json set permute_n=true, but that is a HOST-marker that +# selects a distinct (permuteN) TE pipeline the bridge does not generate -- it +# does NOT map to a separate bridged device kernel. Honoring true here would +# mis-shuffle B (GPU-verified max_rel ~1.25 vs ~5e-4). So every bridge pin reads +# this one constant. TODO: to support permute_n=True, emit the permuteN pipeline +# in unified_gemm_codegen and set this to a swept/config-driven value. +BRIDGE_PERMUTE_N = False + + +@functools.lru_cache(maxsize=1) +def _get_arch() -> str: + """Detect the GPU architecture from rocminfo and validate it. + + Returns the detected ``gfxNNN`` string. Raises ``RuntimeError`` when no arch + can be detected (no GPU / rocminfo unavailable) -- we refuse to silently + default to a specific architecture -- and ``ValueError`` when the detected + arch is not one this bridge supports. + """ + detected: Optional[str] = None + try: + out = subprocess.check_output( + ["rocminfo"], stderr=subprocess.DEVNULL, text=True + ) + for line in out.splitlines(): + stripped = line.strip() + if stripped.startswith("Name:") and "gfx" in stripped: + name = stripped.split(":", 1)[1].strip() + if name.startswith("gfx"): + detected = name + break + except Exception: # noqa: BLE001 - rocminfo missing / no GPU / timeout + detected = None + + if detected is None: + raise RuntimeError( + "Could not detect GPU architecture from rocminfo; refusing to " + "default to a specific GPU architecture. Pass an explicit --arch / " + "gfx_arch (one of " + f"{', '.join(_SUPPORTED_ARCHES)})." + ) + if detected not in _SUPPORTED_ARCHES: + raise ValueError( + f"Unsupported GPU architecture {detected!r}; supported: " + f"{', '.join(_SUPPORTED_ARCHES)}." + ) + return detected + + +def _resolve_arch(arch: Optional[str]) -> str: + """Resolve a possibly-``None`` arch to a validated, supported ``gfxNNN``. + + ``None``/empty -> detect via :func:`_get_arch`. An explicit value is + validated against ``_SUPPORTED_ARCHES`` (raising ``ValueError`` if unknown) + so a typo can never silently reach the compiler. + """ + if not arch: + return _get_arch() + if arch not in _SUPPORTED_ARCHES: + raise ValueError( + f"Unsupported GPU architecture {arch!r}; supported: " + f"{', '.join(_SUPPORTED_ARCHES)}." + ) + return arch + + +def _cshuffle_store_ok( + m_repeat: int, n_repeat: int, warp_tile_m: int, warp_tile_n: int +) -> bool: + """Return False for the one CShuffle-store combination that is numerically + wrong (issue #9684): an ODD per-wave repeat (>1) paired with a 32-wide warp + tile in that dimension. GPU-verified on gfx942 -- e.g. tile_m=192 / wave_m=2 + / warp_tile_m=32 (MRepeat=3) returns garbage, while every other non-power-of- + two repeat (incl. MRepeat=3 with warp_tile_m=16, and even repeats like 6/12) + is correct. Only relevant for the CShuffle epilogue; the default epilogue is + exempt.""" + + def _dim_bad(repeat: int, warp_tile: int) -> bool: + return repeat > 1 and repeat % 2 == 1 and warp_tile == 32 + + return not (_dim_bad(m_repeat, warp_tile_m) or _dim_bad(n_repeat, warp_tile_n)) +# --- end bridge shared helpers --- + + +def _cap(flag: bool) -> str: + """Reproduce Python ``str(bool).capitalize()`` -> 'True' / 'False'.""" + return "True" if flag else "False" + + +# --------------------------------------------------------------------------- +# Dtype codecs: map a bridge dtype token -> numpy dtype for host operands. +# +# fp16 maps to plain numpy; bf16/fp8/bf8 need ml_dtypes. fp8/bf8 use the FNUZ +# encodings (E4M3FNUZ / E5M2FNUZ) that the gfx942 MFMA path expects -- matching +# the regular bridge's fp8/bf8 codec (PR #8887). ml_dtypes is imported lazily so +# the fp16-only path keeps working where ml_dtypes is unavailable. +# --------------------------------------------------------------------------- + +# Canonicalize common spellings to a single token. +_DTYPE_ALIASES = { + "fp16": "fp16", + "f16": "fp16", + "half": "fp16", + "float16": "fp16", + "bf16": "bf16", + "bfloat16": "bf16", + "fp8": "fp8", + "fp8_e4m3": "fp8", + "e4m3": "fp8", + "bf8": "bf8", + "fp8_e5m2": "bf8", + "e5m2": "bf8", +} + + +def numpy_dtype_for(dtype: str): + """Return the numpy dtype object used for host operands of ``dtype``. + + fp16 -> np.float16; bf16/fp8/bf8 require the ``ml_dtypes`` package (imported + lazily) and use FNUZ fp8 encodings for gfx942 parity. + """ + token = _DTYPE_ALIASES.get(str(dtype).lower()) + if token is None: + raise ValueError(f"Unsupported grouped GEMM dtype: {dtype!r}") + if token == "fp16": + return np.float16 + try: + import ml_dtypes # noqa: WPS433 (lazy: optional dep) + except ImportError as exc: # pragma: no cover - env-dependent + raise RuntimeError( + f"dtype {dtype!r} requires the 'ml_dtypes' package (pip install ml_dtypes)" + ) from exc + if token == "bf16": + return np.dtype(ml_dtypes.bfloat16) + if token == "fp8": + return np.dtype(ml_dtypes.float8_e4m3fnuz) + if token == "bf8": + return np.dtype(ml_dtypes.float8_e5m2fnuz) + raise ValueError(f"Unsupported grouped GEMM dtype: {dtype!r}") # pragma: no cover + + +def output_dtype_for(dtype: str) -> str: + """Return the bridge dtype token of a kernel's OUTPUT for input ``dtype``. + + Mirrors ``codegen_common.CommonTypeMappings.get_output_dtype`` (fp8/bf8 -> + fp16, else identity): the generated grouped kernel emits an fp16 ``CDataType`` + for fp8/bf8 inputs, so the host C buffer must be sized/typed by the OUTPUT + dtype, not the INPUT dtype. ``codegen_common`` lives on the dispatcher + ``codegen`` dir which ctypes_utils already puts on ``sys.path``; import it + lazily so the fp16-only path has no extra dependency. + """ + token = _DTYPE_ALIASES.get(str(dtype).lower()) + if token is None: + raise ValueError(f"Unsupported grouped GEMM dtype: {dtype!r}") + try: + from codegen_common import CommonTypeMappings # noqa: WPS433 (lazy) + except ImportError: # pragma: no cover - fall back to the documented mapping + return "fp16" if token in ("fp8", "bf8") else token + return CommonTypeMappings.get_output_dtype(token) + + +def output_numpy_dtype_for(dtype: str): + """Numpy dtype of a kernel's OUTPUT buffer for input ``dtype``. + + Composition of :func:`output_dtype_for` + :func:`numpy_dtype_for`. For + fp8/bf8 this resolves to ``np.float16`` (2 bytes) because the kernel's + ``CDataType`` is fp16; for fp16/bf16 it equals the input dtype. + """ + return numpy_dtype_for(output_dtype_for(dtype)) + + +# ============================================================================ +# The shared contract: GemmKernelConfig +# ============================================================================ + + +@dataclass +class GemmKernelConfig: + """The common config struct shared by Tile Engine and the Dispatcher. + + Naming convention (the "warp/wave trap" lives here, in ONE place): + * ``wave_m/n/k`` -- warps per block (C++ ``wave_shape``; TE "warp"). + * ``warp_tile_m/n/k`` -- MFMA instruction shape (C++ ``warp_tile_shape``; + TE "warp_tile"). + """ + + # --- Signature: what operation is computed ----------------------------- + dtype_a: str = "fp16" + dtype_b: str = "fp16" + dtype_c: str = "fp16" + dtype_acc: str = "fp32" + layout_a: str = "row" + layout_b: str = "col" + layout_c: str = "row" + + # --- Algorithm: how it is implemented ---------------------------------- + tile_m: int = 128 + tile_n: int = 128 + tile_k: int = 32 + wave_m: int = 2 + wave_n: int = 2 + wave_k: int = 1 + warp_tile_m: int = 32 + warp_tile_n: int = 32 + warp_tile_k: int = 16 + + pipeline: str = "compv4" + scheduler: str = "intrawave" + epilogue: str = "cshuffle" + + pad_m: bool = True + pad_n: bool = True + pad_k: bool = True + persistent: bool = False + + # No silent default: the arch must be resolved (rocminfo-detected or passed + # explicitly) before this config feeds the compiler. expand_sweep / + # setup_multiple_gemm_dispatchers guarantee a non-None value; a stray None + # reaching -DGFX_ARCH / --offload-arch would build for the wrong device. + gfx_arch: Optional[str] = None + variant: str = "standard" + # Stream-K reduction strategy: "atomic" (default), "linear", or "tree". + # Only meaningful when variant == "stream_k". + reduction_strategy: str = "atomic" + + # --- Preshuffle only --------------------------------------------------- + # Selects the B-preshuffle permutation (shuffle_b_permuteN vs shuffle_b). + # Mirrors Old-TE's permute_n config knob; participates in the kernel name so + # it must match unified_gemm_codegen.py::key_name. Ignored by other variants. + permute_n: bool = False + + # --- Multi-ABD only ---------------------------------------------------- + # Arrays of A/B/D tensors and per-group element-wise ops. These are + # behavior-affecting and appear in .name (and thus in the codegen kernel + # name) so distinct tensor counts / ops never collapse to one kernel. + # layout_d is the 4th ('D') char of the multi_abd rcrr layout code. + num_a_tensors: int = 2 + num_b_tensors: int = 2 + num_d_tensors: int = 2 + a_elementwise_op: str = "PassThrough" + b_elementwise_op: str = "PassThrough" + cde_elementwise_op: str = "PassThrough" + layout_d: str = "row" + + # --- Multi-D only (variant=="multi_d") --------------------------------- + # elementwise_op: "MultiDAdd" | "MultiDMultiply" | "PassThrough" + # d_layout : row/col of every D tensor (row for the TE multi_d builder) + # num_d_tensors (above) is reused as the fused-D operand count for multi_d. + elementwise_op: str = "PassThrough" + d_layout: str = "row" + + # ------------------------------------------------------------------ # + # Derived string fragments + # ------------------------------------------------------------------ # + @property + def layout(self) -> str: + """3-char layout string, e.g. 'rcr'.""" + return ( + _LAYOUT_CHAR[self.layout_a] + + _LAYOUT_CHAR[self.layout_b] + + _LAYOUT_CHAR[self.layout_c] + ) + + @property + def layout4(self) -> str: + """4-char multi_abd layout string (A,B,E,D), e.g. 'rcrr'.""" + return self.layout + _LAYOUT_CHAR[self.layout_d] + + @property + def codegen_layout(self) -> str: + """Layout string passed to unified_gemm_codegen.py --layout. + + Multi-D takes a 4-char layout (A,B,C + D); the codegen splits off the + 4th char as the D-tensor layout. Every other variant uses the 3-char + A,B,C layout. + """ + if self.variant == "multi_d": + return self.layout + _LAYOUT_CHAR[self.d_layout] + return self.layout + + @property + def tile_str(self) -> str: + return f"{self.tile_m}x{self.tile_n}x{self.tile_k}" + + @property + def wave_str(self) -> str: + return f"{self.wave_m}x{self.wave_n}x{self.wave_k}" + + @property + def warp_tile_str(self) -> str: + return f"{self.warp_tile_m}x{self.warp_tile_n}x{self.warp_tile_k}" + + @property + def name(self) -> str: + """Registry / runtime lookup key. + + Reproduces, byte-for-byte, the ``KERNEL_NAME`` that + ``unified_gemm_codegen.py::KernelNaming.generate`` bakes into the + generated kernel header (and that the .so reports via + ``dispatcher_get_kernel_name``). This is the single thread tying + config -> codegen -> runtime together. + """ + # Multi-ABD uses the 4-char layout (A,B,E,D); multi_d likewise appends + # its D-tensor layout char; every other variant uses the 3-char (A,B,C). + # This mirrors KernelNaming.generate in the codegen. + if self.variant == "multi_abd": + layout_str = self.layout4 + elif self.variant == "multi_d": + layout_str = self.layout + _LAYOUT_CHAR[self.d_layout] + else: + layout_str = self.layout + name = ( + f"gemm_{self.dtype_a}_{layout_str}" + f"_{self.pipeline}_{self.epilogue}_{self.scheduler}" + f"_{_cap(self.pad_m)}_{_cap(self.pad_n)}_{_cap(self.pad_k)}" + f"_{_cap(self.persistent)}" + f"_{self.tile_str}_{self.wave_str}_{self.warp_tile_str}" + ) + if self.variant == "preshuffle": + name += "_preshuffle" + if self.permute_n: + name += "_permuteN" + elif self.variant == "stream_k": + name += "_streamk" + # Atomic keeps the bare "_streamk" suffix (original parity); linear + # and tree are disambiguated, matching KernelNaming.generate. + if self.reduction_strategy != "atomic": + name += f"_{self.reduction_strategy}" + elif self.variant == "multi_abd": + # Byte-for-byte match to codegen KernelNaming.generate's multiabd + # suffix: tensor counts then the three element-wise ops. + name += ( + f"_multiabd_a{self.num_a_tensors}_b{self.num_b_tensors}" + f"_d{self.num_d_tensors}" + f"_{self.a_elementwise_op}_{self.b_elementwise_op}" + f"_{self.cde_elementwise_op}" + ) + elif self.variant == "multi_d": + # Mirror KernelNaming.generate: "_multid_{elementwise_op}_d{num_d}". + name += f"_multid_{self.elementwise_op}_d{self.num_d_tensors}" + elif self.variant == "grouped": + name += "_grouped" + return name + + # ------------------------------------------------------------------ # + # Serialization + # ------------------------------------------------------------------ # + def to_codegen_json(self) -> Dict[str, Any]: + """Single-config JSON consumed by unified_gemm_codegen.py. + + Note the warp/wave mapping: the codegen calls the warps-per-block + triple ``warp_*`` and the MFMA triple ``warp_tile_*``. We translate + from dispatcher semantics here so the mapping cannot drift. + """ + cfg = { + "tile_config": { + "tile_m": [self.tile_m], + "tile_n": [self.tile_n], + "tile_k": [self.tile_k], + # dispatcher wave_* -> codegen warp_* (warps per block) + "warp_m": [self.wave_m], + "warp_n": [self.wave_n], + "warp_k": [self.wave_k], + # dispatcher warp_tile_* -> codegen warp_tile_* (MFMA shape) + "warp_tile_m": [self.warp_tile_m], + "warp_tile_n": [self.warp_tile_n], + "warp_tile_k": [self.warp_tile_k], + }, + "trait_config": { + "pipeline": [self.pipeline], + "epilogue": [self.epilogue], + "scheduler": [self.scheduler], + "pad_m": [self.pad_m], + "pad_n": [self.pad_n], + "pad_k": [self.pad_k], + "persistent": [self.persistent], + }, + # Top-level knob read by unified_gemm_codegen for the preshuffle + # variant (selects shuffle_b_permuteN vs shuffle_b). Harmless for + # other variants, which ignore it. + "permute_n": self.permute_n, + } + # Pin the single reduction strategy so stream-K codegen emits exactly this + # kernel (the generator otherwise expands all strategies in its default). + if self.variant == "stream_k": + cfg["streamk_config"] = {"reduction_strategy": [self.reduction_strategy]} + # Multi-ABD codegen reads its tensor counts / element-wise ops from a + # dedicated ``multi_abd_config`` block. These are scalars (one kernel per + # config), matching the codegen's _get_configs_for_variant reader. + if self.variant == "multi_abd": + cfg["multi_abd_config"] = { + "num_a_tensors": self.num_a_tensors, + "num_b_tensors": self.num_b_tensors, + "num_d_tensors": self.num_d_tensors, + "a_elementwise_op": self.a_elementwise_op, + "b_elementwise_op": self.b_elementwise_op, + "cde_elementwise_op": self.cde_elementwise_op, + } + # Multi-D signature: the codegen expands its multi_d variant over the + # (elementwise_op x num_d_tensors) product, so pin both to this config's + # single values. Only emitted for multi_d (ignored elsewhere). + if self.variant == "multi_d": + cfg["multi_d_config"] = { + "elementwise_ops": [self.elementwise_op], + "num_d_tensors": [self.num_d_tensors], + } + return cfg + + def to_dict(self) -> Dict[str, Any]: + return { + "dtype_a": self.dtype_a, + "dtype_b": self.dtype_b, + "dtype_c": self.dtype_c, + "dtype_acc": self.dtype_acc, + "layout": self.layout, + "tile": [self.tile_m, self.tile_n, self.tile_k], + "wave": [self.wave_m, self.wave_n, self.wave_k], + "warp_tile": [self.warp_tile_m, self.warp_tile_n, self.warp_tile_k], + "pipeline": self.pipeline, + "scheduler": self.scheduler, + "epilogue": self.epilogue, + "pad": [self.pad_m, self.pad_n, self.pad_k], + "persistent": self.persistent, + "gfx_arch": self.gfx_arch, + "variant": self.variant, + "name": self.name, + } + + def to_ctypes_config(self) -> "_cu.KernelConfig": + """Convert to the ctypes_utils.KernelConfig used by the codegen/validate + helpers. ctypes_utils renames the MFMA triple ``warp_*`` (no _tile).""" + return _cu.KernelConfig( + dtype_a=self.dtype_a, + dtype_b=self.dtype_b, + dtype_c=self.dtype_c, + dtype_acc=self.dtype_acc, + layout_a=_LAYOUT_WORD[_LAYOUT_CHAR[self.layout_a]], + layout_b=_LAYOUT_WORD[_LAYOUT_CHAR[self.layout_b]], + layout_c=_LAYOUT_WORD[_LAYOUT_CHAR[self.layout_c]], + tile_m=self.tile_m, + tile_n=self.tile_n, + tile_k=self.tile_k, + wave_m=self.wave_m, + wave_n=self.wave_n, + wave_k=self.wave_k, + warp_m=self.warp_tile_m, + warp_n=self.warp_tile_n, + warp_k=self.warp_tile_k, + pipeline=self.pipeline, + scheduler=self.scheduler, + epilogue=self.epilogue, + pad_m=self.pad_m, + pad_n=self.pad_n, + pad_k=self.pad_k, + gfx_arch=self.gfx_arch, + variant=self.variant, + ) +# ============================================================================ +# Problem +# ============================================================================ + + +@dataclass +class GemmProblem: + """A single GEMM problem: C[MxN] = A[MxK] @ B[KxN].""" + + M: int + N: int + K: int + + @property + def flops(self) -> float: + return 2.0 * self.M * self.N * self.K + + def to_dict(self) -> Dict[str, int]: + return {"M": self.M, "N": self.N, "K": self.K} + + @classmethod + def from_dict(cls, d: Dict[str, int]) -> "GemmProblem": + return cls(M=int(d["M"]), N=int(d["N"]), K=int(d["K"])) + + +@dataclass +class GroupedGemmProblem: + """A grouped GEMM problem: a list of independent (M, N, K) sub-problems + all run by a single grouped kernel launch. + + Each group g computes C_g[M_g x N_g] = A_g[M_g x K_g] @ B_g[K_g x N_g]. + """ + + groups: List[Tuple[int, int, int]] + + @classmethod + def uniform( + cls, group_count: int, M: int, N: int, K: int + ) -> "GroupedGemmProblem": + """All groups share the same (M, N, K) shape.""" + return cls(groups=[(int(M), int(N), int(K)) for _ in range(int(group_count))]) + + @property + def group_count(self) -> int: + return len(self.groups) + + @property + def flops(self) -> float: + return sum(2.0 * m * n * k for (m, n, k) in self.groups) + + def to_dict(self) -> Dict[str, Any]: + return {"groups": [[int(m), int(n), int(k)] for (m, n, k) in self.groups]} + + @classmethod + def from_dict(cls, d: Dict[str, Any]) -> "GroupedGemmProblem": + return cls(groups=[(int(m), int(n), int(k)) for (m, n, k) in d["groups"]]) + + +@dataclass +class GemmResult: + output: np.ndarray + time_ms: float + status: int + tflops: float + kernel_name: str + # Optional numeric-verification metric: global relative error of the kernel + # output vs a numpy reference (max|out-ref|/max|ref|). None when the runner + # did not compute a reference. Multi-ABD populates this in-runner because it + # generates its own A/B/D operands internally (see GpuMultiABDRunner.run). + max_rel: Optional[float] = None + + @property + def success(self) -> bool: + return self.status == 0 + + +@dataclass +class GroupedGemmResult: + """Result of a grouped GEMM launch: one output per group plus aggregate + timing/throughput across the whole batch.""" + + outputs: List[np.ndarray] + time_ms: float + status: int + tflops: float + kernel_name: str + + @property + def success(self) -> bool: + return self.status == 0 + + +# ============================================================================ +# ctypes ABI wrapper +# ============================================================================ + + +class GemmDispatcherLib: + """Thin ctypes wrapper around a compiled GEMM dispatcher .so. + + Supports both the legacy single-kernel ABI (``dispatcher_get_kernel_name``) + and the multi-kernel ABI (``dispatcher_get_kernel_name_at(index, buf, n)``) + so one .so can report a whole batch and be selected by name. + """ + + def __init__(self, so_path: Path): + self._path = Path(so_path) + self._lib = ctypes.CDLL(str(self._path)) + self._has_indexed = hasattr(self._lib, "dispatcher_get_kernel_name_at") + self._has_single = hasattr(self._lib, "dispatcher_run_gemm") + self._has_grouped = hasattr(self._lib, "dispatcher_run_grouped_gemm") + self._has_multi_d = hasattr(self._lib, "dispatcher_run_multi_d_gemm") + self._setup_functions() + + def _setup_functions(self) -> None: + lib = self._lib + + lib.dispatcher_initialize.argtypes = [] + lib.dispatcher_initialize.restype = ctypes.c_int + + lib.dispatcher_get_kernel_count.argtypes = [] + lib.dispatcher_get_kernel_count.restype = ctypes.c_int + + lib.dispatcher_get_kernel_name.argtypes = [] + lib.dispatcher_get_kernel_name.restype = ctypes.c_char_p + + if self._has_indexed: + lib.dispatcher_get_kernel_name_at.argtypes = [ + ctypes.c_int, + ctypes.c_char_p, + ctypes.c_int, + ] + lib.dispatcher_get_kernel_name_at.restype = ctypes.c_int + + # Regular single-problem GEMM ABI (gemm_ctypes_lib.cpp). Absent on the + # grouped and multi_d libs, which expose dispatcher_run_grouped_gemm / + # dispatcher_run_multi_d_gemm instead. + if self._has_single: + lib.dispatcher_run_gemm.argtypes = [ + ctypes.c_void_p, # A (host) + ctypes.c_void_p, # B (host) + ctypes.c_void_p, # C (host) + ctypes.c_int64, # M + ctypes.c_int64, # N + ctypes.c_int64, # K + ctypes.POINTER(ctypes.c_float), # time_ms + ] + lib.dispatcher_run_gemm.restype = ctypes.c_int + + # Multi-problem ABI (grouped GEMM .so). Absent on regular libs. + if self._has_grouped: + lib.dispatcher_run_grouped_gemm.argtypes = [ + ctypes.c_int, # group_count + ctypes.POINTER(ctypes.c_int64), # Ms[] + ctypes.POINTER(ctypes.c_int64), # Ns[] + ctypes.POINTER(ctypes.c_int64), # Ks[] + ctypes.POINTER(ctypes.c_void_p), # A_ptrs[] + ctypes.POINTER(ctypes.c_void_p), # B_ptrs[] + ctypes.POINTER(ctypes.c_void_p), # C_ptrs[] + ctypes.POINTER(ctypes.c_float), # time_ms + ] + lib.dispatcher_run_grouped_gemm.restype = ctypes.c_int + + # Multi-D ABI: extra D-pointer array + count (multi_d_gemm_ctypes_lib.cpp). + if self._has_multi_d: + lib.dispatcher_run_multi_d_gemm.argtypes = [ + ctypes.c_void_p, # A (host) + ctypes.c_void_p, # B (host) + ctypes.POINTER(ctypes.c_void_p), # D_ptrs[] (host) + ctypes.c_int, # num_d + ctypes.c_void_p, # C (host) + ctypes.c_int64, # M + ctypes.c_int64, # N + ctypes.c_int64, # K + ctypes.POINTER(ctypes.c_float), # time_ms + ] + lib.dispatcher_run_multi_d_gemm.restype = ctypes.c_int + if hasattr(lib, "dispatcher_get_num_d_tensors"): + lib.dispatcher_get_num_d_tensors.argtypes = [] + lib.dispatcher_get_num_d_tensors.restype = ctypes.c_int + + lib.dispatcher_cleanup.argtypes = [] + lib.dispatcher_cleanup.restype = None + + @property + def path(self) -> Path: + return self._path + + def initialize(self) -> bool: + return self._lib.dispatcher_initialize() == 0 + + def get_kernel_count(self) -> int: + return int(self._lib.dispatcher_get_kernel_count()) + + @property + def kernel_names(self) -> List[str]: + """List every kernel the .so exposes, by index when available.""" + if self._has_indexed: + names: List[str] = [] + count = self.get_kernel_count() + buf = ctypes.create_string_buffer(256) + for i in range(count): + if self._lib.dispatcher_get_kernel_name_at(i, buf, 256) == 0: + names.append(buf.value.decode("utf-8")) + if names: + return names + # Legacy single-kernel fallback. + raw = self._lib.dispatcher_get_kernel_name() + return [raw.decode("utf-8")] if raw else [] + + def run( + self, A: np.ndarray, B: np.ndarray, C: np.ndarray, M: int, N: int, K: int + ) -> Tuple[int, float]: + if not self._has_single: + raise RuntimeError( + f"{self._path} does not expose dispatcher_run_gemm; this is not a " + f"regular GEMM .so (grouped/multi_d libs use run_grouped/run_multi_d)" + ) + time_ms = ctypes.c_float(0.0) + status = self._lib.dispatcher_run_gemm( + A.ctypes.data_as(ctypes.c_void_p), + B.ctypes.data_as(ctypes.c_void_p), + C.ctypes.data_as(ctypes.c_void_p), + M, + N, + K, + ctypes.byref(time_ms), + ) + return status, time_ms.value + + @property + def has_multi_d(self) -> bool: + return self._has_multi_d + + def num_d_tensors(self) -> int: + """Number of D tensors baked into this multi_d .so (0 if not multi_d).""" + if self._has_multi_d and hasattr(self._lib, "dispatcher_get_num_d_tensors"): + return int(self._lib.dispatcher_get_num_d_tensors()) + return 0 + + def run_multi_d( + self, + A: np.ndarray, + B: np.ndarray, + Ds: List[np.ndarray], + C: np.ndarray, + M: int, + N: int, + K: int, + ) -> Tuple[int, float]: + """Run a multi_d GEMM: E = elementwise_op(A@B, D0, D1, ...). + + ``Ds`` is a list of ``num_d_tensors`` host arrays (each MxN, same element + type as C). Pointers are collected into a ctypes ``c_void_p`` array; the + .so owns all device memory. + """ + if not self._has_multi_d: + raise RuntimeError( + f"{self._path} does not expose dispatcher_run_multi_d_gemm" + ) + num_d = len(Ds) + d_arr_t = ctypes.c_void_p * max(num_d, 1) + d_arr = d_arr_t(*[d.ctypes.data_as(ctypes.c_void_p) for d in Ds]) + time_ms = ctypes.c_float(0.0) + status = self._lib.dispatcher_run_multi_d_gemm( + A.ctypes.data_as(ctypes.c_void_p), + B.ctypes.data_as(ctypes.c_void_p), + d_arr, + num_d, + C.ctypes.data_as(ctypes.c_void_p), + M, + N, + K, + ctypes.byref(time_ms), + ) + return status, time_ms.value + + def run_grouped( + self, + A_list: List[np.ndarray], + B_list: List[np.ndarray], + C_list: List[np.ndarray], + Ms: List[int], + Ns: List[int], + Ks: List[int], + ) -> Tuple[int, float]: + """Launch the grouped kernel over a batch of (M, N, K) sub-problems. + + Each A/B/C entry is a host numpy array already laid out (dtype + row/col + transpose) as the kernel expects for its compile-time layout; the caller + (GpuGroupedGemmRunner) does that per-dtype/per-layout packing. Pointers + are marshalled into ctypes pointer arrays. + """ + if not self._has_grouped: + raise RuntimeError( + f"{self._path} does not expose dispatcher_run_grouped_gemm" + ) + + g = len(A_list) + c_int64_arr = (ctypes.c_int64 * g) + c_void_arr = (ctypes.c_void_p * g) + + ms = c_int64_arr(*[int(m) for m in Ms]) + ns = c_int64_arr(*[int(n) for n in Ns]) + ks = c_int64_arr(*[int(k) for k in Ks]) + + a_ptrs = c_void_arr(*[A.ctypes.data_as(ctypes.c_void_p) for A in A_list]) + b_ptrs = c_void_arr(*[B.ctypes.data_as(ctypes.c_void_p) for B in B_list]) + c_ptrs = c_void_arr(*[C.ctypes.data_as(ctypes.c_void_p) for C in C_list]) + + time_ms = ctypes.c_float(0.0) + status = self._lib.dispatcher_run_grouped_gemm( + g, + ms, + ns, + ks, + a_ptrs, + b_ptrs, + c_ptrs, + ctypes.byref(time_ms), + ) + return status, time_ms.value + + def cleanup(self) -> None: + self._lib.dispatcher_cleanup() + + +# ============================================================================ +# GPU runner (constructed from a .so path; loaded only inside a worker) +# ============================================================================ + + +def _fp32_to_bf16_u16(x: np.ndarray) -> np.ndarray: + """Encode fp32 -> bfloat16 bit pattern in a uint16 array (round-to-nearest-even). + + numpy has no native bf16, but the C ABI only cares about the 2-byte memory + layout (sizeof(bf16_t) == 2 == sizeof(uint16)). Truncating the low 16 bits of + the fp32 representation with round-to-nearest-even matches ck_tile's bf16. + """ + u32 = np.ascontiguousarray(x, dtype=np.float32).view(np.uint32) + # round-to-nearest-even: add (lsb-of-kept-bits + 0x7FFF) before truncating + rounding = ((u32 >> 16) & 1) + np.uint32(0x7FFF) + return ((u32 + rounding) >> 16).astype(np.uint16) + + +def _bf16_u16_to_fp32(u16: np.ndarray) -> np.ndarray: + """Decode a uint16 bf16 bit pattern back to fp32 (low 16 mantissa bits zero).""" + return (u16.astype(np.uint32) << 16).view(np.float32) + + +# --------------------------------------------------------------------------- +# fp8 (E4M3) / bf8 (E5M2) -- FNUZ ("NANOO") encoding used by gfx942/MI300. +# +# numpy has no native 8-bit float, and the C ABI only cares about the 1-byte +# memory layout (sizeof(fp8_t) == sizeof(bf8_t) == 1). We carry the value as a +# uint8 bit pattern. As with bf16, the DECODE is the load-bearing half: it must +# return the exact value the device's fp8_t/bf8_t represents for a byte, so the +# NumPy reference multiplies bit-for-bit what the GPU multiplies. The ENCODE only +# needs to land on the nearest representable byte. +# +# FNUZ format (gfx942): bias = 2^(exp_bits-1); the all-1s exponent is a normal +# number (no Inf), the sole NaN is the sign=1/exp=0/mant=0 byte (0x80), and there +# is no negative zero. gfx950/MI350 uses the OCP fp8 format instead; this codec +# targets the gfx942 default and the OCP path needs separate handling. +# --------------------------------------------------------------------------- + + +@functools.lru_cache(maxsize=None) +def _fnuz_decode_table(exp_bits: int, mant_bits: int) -> np.ndarray: + """Build the 256-entry byte -> fp32 value table for an 8-bit FNUZ float. + + The table is a pure function of (exp_bits, mant_bits), so it is cached; the + returned array is marked read-only because callers share the one instance. + """ + bias = (1 << (exp_bits - 1)) + mant_max = 1 << mant_bits + sign_shift = exp_bits + mant_bits + exp_mask = (1 << exp_bits) - 1 + table = np.zeros(256, dtype=np.float32) + for b in range(256): + sign = (b >> sign_shift) & 1 + exp = (b >> mant_bits) & exp_mask + mant = b & (mant_max - 1) + if exp == 0 and mant == 0: + # +0 (0x00); the negative-zero slot (0x80) is the lone NaN. + table[b] = np.float32(np.nan) if sign else np.float32(0.0) + continue + if exp == 0: + val = (mant / mant_max) * (2.0 ** (1 - bias)) # subnormal + else: + val = (1.0 + mant / mant_max) * (2.0 ** (exp - bias)) # normal + table[b] = np.float32(-val if sign else val) + table.flags.writeable = False # shared cached instance -- do not mutate + return table + + +def _fnuz_encode(x: np.ndarray, exp_bits: int, mant_bits: int) -> np.ndarray: + """Encode fp32 -> nearest 8-bit FNUZ float, returned as a uint8 bit pattern.""" + table = _fnuz_decode_table(exp_bits, mant_bits) + sign_byte = np.uint8(1 << (exp_bits + mant_bits)) # 0x80 + + # Positive half (bytes 0..127) holds every non-negative magnitude, sorted. + # Compare in float64: for very large inputs the gap between the two top + # magnitudes is below fp32 resolution, which would tie and mis-saturate. + pos_mag = table[: int(sign_byte)].astype(np.float64) + order = np.argsort(pos_mag) + sorted_mag = pos_mag[order] + sorted_byte = order.astype(np.uint8) + + xf = np.ascontiguousarray(x, dtype=np.float32) + ax = np.abs(xf).astype(np.float64) + # Both neighbours come from the raw insertion point: raw==size saturates to + # the top magnitude (lo==hi), raw==0 pins to zero, otherwise compare the two. + raw = np.searchsorted(sorted_mag, ax) + hi = np.clip(raw, 0, sorted_mag.size - 1) + lo = np.clip(raw - 1, 0, sorted_mag.size - 1) + pick_lo = np.abs(sorted_mag[lo] - ax) <= np.abs(sorted_mag[hi] - ax) + chosen = np.where(pick_lo, lo, hi) + out = sorted_byte[chosen] + + # Apply sign, but never the 0x80 (-0 == NaN) slot: zeros stay +0. + is_zero = sorted_mag[chosen] == 0 + out = np.where((xf < 0) & ~is_zero, out | sign_byte, out) + out = np.where(np.isnan(xf), sign_byte, out) # NaN inputs -> NaN byte + return out.astype(np.uint8).reshape(np.shape(x)) + + +def _fp32_to_fp8_u8(x: np.ndarray) -> np.ndarray: + """Encode fp32 -> fp8 E4M3 (FNUZ) bit pattern in a uint8 array.""" + return _fnuz_encode(x, exp_bits=4, mant_bits=3) + + +def _fp8_u8_to_fp32(u8: np.ndarray) -> np.ndarray: + """Decode an fp8 E4M3 (FNUZ) bit pattern back to fp32.""" + return _fnuz_decode_table(4, 3)[u8.astype(np.intp)] + + +def _fp32_to_bf8_u8(x: np.ndarray) -> np.ndarray: + """Encode fp32 -> bf8 E5M2 (FNUZ) bit pattern in a uint8 array.""" + return _fnuz_encode(x, exp_bits=5, mant_bits=2) + + +def _bf8_u8_to_fp32(u8: np.ndarray) -> np.ndarray: + """Decode a bf8 E5M2 (FNUZ) bit pattern back to fp32.""" + return _fnuz_decode_table(5, 2)[u8.astype(np.intp)] + + +# Output (C) element dtype for an A/B element dtype, mirroring the codegen's +# CommonTypeMappings.get_output_dtype: fp8/bf8 accumulate into fp16, int8 into +# int32, everything else stores in its own dtype. +_OUTPUT_DTYPE = {"fp8": "fp16", "bf8": "fp16", "int8": "int32"} + + +def _output_dtype(dtype: str) -> str: + return _OUTPUT_DTYPE.get(dtype, dtype) + + +def _dtype_from_kernel_name(name: str) -> str: + """Extract the dtype token from a kernel name like ``gemm___...``.""" + parts = name.split("_") + return parts[1] if len(parts) > 1 else "fp16" + + +def _layout_from_kernel_name(name: str) -> str: + """Extract the 3-char layout token (e.g. 'rcr') from a kernel name. + + Name format is ``gemm___...``; each char is 'r' (row-major) + or 'c' (column-major) for operands A, B, C respectively. + """ + parts = name.split("_") + if len(parts) > 2 and len(parts[2]) == 3 and set(parts[2]) <= {"r", "c"}: + return parts[2] + return "rcr" + + +class GpuGemmRunner: + """High-level runner: construct from a .so path, call run(A, B, problem). + + The GEMM ctypes ABI takes HOST pointers and manages GPU memory internally + (hipMalloc/hipMemcpy/hipFree), so this runner stays simple -- it hands + numpy arrays straight to the .so. + """ + + def __init__(self, lib_path: Path): + self.lib = GemmDispatcherLib(lib_path) + if not self.lib.initialize(): + raise RuntimeError(f"Failed to initialize dispatcher .so: {lib_path}") + names = self.lib.kernel_names + self._kernel_name = names[0] if names else "unknown" + + @property + def kernel_name(self) -> str: + return self._kernel_name + + def run( + self, A: np.ndarray, B: np.ndarray, problem: GemmProblem + ) -> GemmResult: + M, N, K = problem.M, problem.N, problem.K + + # Caller passes logical A (MxK) and B (KxN) row-major. The compiled + # kernel dictates both the element dtype and the memory layout of each + # operand (encoded in its name, e.g. gemm_bf16_rcr_...). The C ABI sizes + # its device buffers from sizeof(ADataType) and the kernel computes + # strides from its compiled layout + M,N,K -- so the host buffers must + # be laid out byte-for-byte in the order the kernel expects. + # + # For a 'c' (column-major) operand we transpose so the contiguous host + # buffer's flat memory matches column-major order: + # col-major A (MxK) <=> ascontiguousarray(A.T) (KxM row-major) + # Likewise column-major C (MxN) lands in memory as NxM row-major, so we + # allocate (N,M) and transpose the result back to logical MxN. + dtype = _dtype_from_kernel_name(self._kernel_name) + la, lb, lc = _layout_from_kernel_name(self._kernel_name) + + A_lay = A if la == "r" else A.T + B_lay = B if lb == "r" else B.T + C_shape = (M, N) if lc == "r" else (N, M) + + # Build A/B host buffers in the kernel's element dtype. The encode + # helpers (bf16/fp8/bf8) already force a contiguous float32 source, so an + # outer ascontiguousarray would only add a redundant copy; the native + # numpy dtypes (fp16/int8) still need it. + if dtype == "bf16": + A_h = _fp32_to_bf16_u16(A_lay) + B_h = _fp32_to_bf16_u16(B_lay) + elif dtype == "fp8": + A_h = _fp32_to_fp8_u8(A_lay) + B_h = _fp32_to_fp8_u8(B_lay) + elif dtype == "bf8": + A_h = _fp32_to_bf8_u8(A_lay) + B_h = _fp32_to_bf8_u8(B_lay) + elif dtype == "int8": + A_h = np.ascontiguousarray(A_lay, dtype=np.int8) + B_h = np.ascontiguousarray(B_lay, dtype=np.int8) + else: # fp16 (default) + A_h = np.ascontiguousarray(A_lay, dtype=np.float16) + B_h = np.ascontiguousarray(B_lay, dtype=np.float16) + + # The C buffer's element size must equal sizeof(CDataType): fp8/bf8 + # accumulate into fp16, int8 into int32, otherwise the input dtype. + out_dtype = _output_dtype(dtype) + _C_NP = {"fp16": np.float16, "bf16": np.uint16, "int32": np.int32} + if out_dtype not in _C_NP: + # A silent fp16 fallback would size the host C buffer wrong for an + # unrecognized dtype (sizeof(CDataType) mismatch -> corrupt results + # across the C ABI). Fail loudly so a new dtype is added here. + raise ValueError( + f"unsupported C dtype {out_dtype!r} (from input dtype {dtype!r}); " + "add it to _C_NP so the host buffer matches sizeof(CDataType)" + ) + C_h = np.zeros(C_shape, dtype=_C_NP[out_dtype]) + + status, time_ms = self.lib.run(A_h, B_h, C_h, M, N, K) + + # Decode the output back to a comparable numeric array. + if out_dtype == "bf16": + C_dec = _bf16_u16_to_fp32(C_h) + else: # fp16 / int32 are already directly comparable + C_dec = C_h + C_out = C_dec if lc == "r" else C_dec.T + + tflops = (problem.flops / (time_ms * 1e-3)) / 1e12 if time_ms > 0 else 0.0 + return GemmResult( + output=C_out, + time_ms=time_ms, + status=status, + tflops=tflops, + kernel_name=self._kernel_name, + ) + + +class GpuGroupedGemmRunner: + """High-level runner for the GROUPED variant: construct from a grouped .so + path, call run(A_list, B_list, problem). + + Like GpuGemmRunner, the ctypes ABI takes HOST pointers and manages GPU + memory internally (per group), so this runner only marshals the host operand + arrays. The runner is parameterized by ``(dtype, layout)`` (mirroring + ``GpuGemmRunner``/``GemmProblem``): the A/B operands are cast to the per-dtype + INPUT numpy codec (fp16/bf16/fp8-E4M3FNUZ/bf8-E5M2FNUZ) and transposed per the + A/B/C layout so the contiguous host buffer matches the layout the kernel was + generated with (the ctypes lib derives strides from the same layouts). + + The C/output buffer is sized/typed by the kernel's OUTPUT dtype, not the input + dtype: for fp8/bf8 inputs the generated kernel's ``CDataType`` is fp16, so the + host C buffer is fp16 (2 bytes) even though A/B are 1-byte fp8/bf8. Sizing C by + the input dtype would under-allocate by 2x and the ctypes copy-back would + overrun the host buffer (heap corruption). See :func:`output_numpy_dtype_for`. + """ + + def __init__(self, lib_path: Path, dtype: str = "fp16", layout: str = "rcr"): + self.lib = GemmDispatcherLib(lib_path) + if not self.lib.initialize(): + raise RuntimeError( + f"Failed to initialize grouped dispatcher .so: {lib_path}" + ) + names = self.lib.kernel_names + self._kernel_name = names[0] if names else "unknown" + self._dtype = dtype + # A/B (input) codec vs C (output) codec: they differ for fp8/bf8 + # (output is fp16), so keep them distinct to size the C buffer correctly. + self._np_dtype = numpy_dtype_for(dtype) + self._c_np_dtype = output_numpy_dtype_for(dtype) + if len(layout) != 3 or any(ch not in ("r", "c") for ch in layout): + raise ValueError(f"layout must be a 3-char r/c string, got {layout!r}") + self._layout = layout + + @property + def kernel_name(self) -> str: + return self._kernel_name + + def run( + self, + A_list: List[np.ndarray], + B_list: List[np.ndarray], + problem: GroupedGemmProblem, + ) -> GroupedGemmResult: + groups = problem.groups + if len(A_list) != len(groups) or len(B_list) != len(groups): + raise ValueError( + "A_list/B_list length must match the number of groups " + f"({len(A_list)}/{len(B_list)} vs {len(groups)})" + ) + + Ms = [g[0] for g in groups] + Ns = [g[1] for g in groups] + Ks = [g[2] for g in groups] + + la, lb, _lc = self._layout[0], self._layout[1], self._layout[2] + nd = self._np_dtype + c_nd = self._c_np_dtype # OUTPUT dtype (fp16 for fp8/bf8); see __init__. + + A_h: List[np.ndarray] = [] + B_h: List[np.ndarray] = [] + C_h: List[np.ndarray] = [] + for A, B, (M, N, _K) in zip(A_list, B_list, groups): + # A logically MxK, B logically KxN, C row-major MxN (CLayout is always + # RowMajor for grouped). Store each operand so its contiguous buffer + # matches its layout: row-major -> as-is, col-major -> transpose. + A_buf = A if la == "r" else A.T + B_buf = B if lb == "r" else B.T + A_h.append(np.ascontiguousarray(A_buf, dtype=nd)) + B_h.append(np.ascontiguousarray(B_buf, dtype=nd)) + # Size C by the kernel's CDataType (output dtype), NOT the input dtype: + # fp8/bf8 inputs produce fp16 output, so a 1-byte C would be overrun. + C_h.append(np.zeros((M, N), dtype=c_nd)) + + status, time_ms = self.lib.run_grouped(A_h, B_h, C_h, Ms, Ns, Ks) + + tflops = (problem.flops / (time_ms * 1e-3)) / 1e12 if time_ms > 0 else 0.0 + return GroupedGemmResult( + outputs=C_h, + time_ms=time_ms, + status=status, + tflops=tflops, + kernel_name=self._kernel_name, + ) + + +# ============================================================================ +# Multi-D GEMM problem / result / runner +# ============================================================================ + + +@dataclass +class MultiDGemmProblem: + """A multi_d GEMM problem: E[MxN] = op(A[MxK] @ B[KxN], D0, D1, ...). + + ``num_d`` D tensors, each MxN and stored in the output (C) element dtype. + """ + + M: int + N: int + K: int + num_d: int = 2 + + @property + def flops(self) -> float: + # 2*M*N*K for the GEMM; the element-wise D fuse is negligible and matches + # how Old-TE reports multi_d TFLOPs. + return 2.0 * self.M * self.N * self.K + + +@dataclass +class MultiDGemmResult: + output: np.ndarray + time_ms: float + status: int + tflops: float + kernel_name: str + + @property + def success(self) -> bool: + return self.status == 0 + + +def _multi_d_layout_from_kernel_name(name: str) -> str: + """Extract the 4-char layout (e.g. 'rcrr') from a multi_d kernel name. + + Name format is ``gemm___...``; each char is 'r'/'c' for + operands A, B, C, D. Falls back to 'rcrr' if not found. + """ + parts = name.split("_") + if len(parts) > 2 and len(parts[2]) == 4 and set(parts[2]) <= {"r", "c"}: + return parts[2] + return "rcrr" + + +class GpuMultiDGemmRunner: + """High-level runner for the multi_d bridge .so. + + Constructed from a .so path; call ``run(A, B, Ds, problem)`` with logical + row-major A (MxK), B (KxN) and a list of row-major D tensors (each MxN). The + kernel's compiled dtype/layout (from its name) dictates operand memory + layout; the C ABI owns all device memory. fp16-only for now (the TE multi_d + op supports only fp16). + """ + + def __init__(self, lib_path: Path): + self.lib = GemmDispatcherLib(lib_path) + if not self.lib.initialize(): + raise RuntimeError(f"Failed to initialize multi_d .so: {lib_path}") + if not self.lib.has_multi_d: + raise RuntimeError( + f"{lib_path} is not a multi_d .so (no dispatcher_run_multi_d_gemm)" + ) + names = self.lib.kernel_names + self._kernel_name = names[0] if names else "unknown" + self._num_d = self.lib.num_d_tensors() + + @property + def kernel_name(self) -> str: + return self._kernel_name + + @property + def num_d_tensors(self) -> int: + return self._num_d + + def run( + self, + A: np.ndarray, + B: np.ndarray, + Ds: List[np.ndarray], + problem: MultiDGemmProblem, + ) -> MultiDGemmResult: + M, N, K = problem.M, problem.N, problem.K + dtype = _dtype_from_kernel_name(self._kernel_name) + layout4 = _multi_d_layout_from_kernel_name(self._kernel_name) + la, lb, lc, ld = layout4[0], layout4[1], layout4[2], layout4[3] + + if dtype != "fp16": + raise ValueError(f"multi_d bridge currently supports fp16 only, got {dtype}") + if len(Ds) != self._num_d: + raise ValueError( + f"kernel expects {self._num_d} D tensors, got {len(Ds)}" + ) + + # A/B host buffers, transposed for column-major operands (see GpuGemmRunner). + A_lay = A if la == "r" else A.T + B_lay = B if lb == "r" else B.T + A_h = np.ascontiguousarray(A_lay, dtype=np.float16) + B_h = np.ascontiguousarray(B_lay, dtype=np.float16) + + # C and D are row-major (last two layout chars are 'r' for the TE + # multi_d builder); keep them MxN contiguous. + C_shape = (M, N) if lc == "r" else (N, M) + C_h = np.zeros(C_shape, dtype=np.float16) + D_h = [] + for d in Ds: + d_lay = d if ld == "r" else d.T + D_h.append(np.ascontiguousarray(d_lay, dtype=np.float16)) + + status, time_ms = self.lib.run_multi_d(A_h, B_h, D_h, C_h, M, N, K) + + C_out = C_h if lc == "r" else C_h.T + tflops = (problem.flops / (time_ms * 1e-3)) / 1e12 if time_ms > 0 else 0.0 + return MultiDGemmResult( + output=C_out, + time_ms=time_ms, + status=status, + tflops=tflops, + kernel_name=self._kernel_name, + ) + + +# ============================================================================ +# Multi-ABD ctypes ABI wrapper + runner (divergent, array-pointer ABI) +# ============================================================================ + +# Element size (bytes) per CK dtype -- mirrors the codegen's ELEMENT_SIZE_MAP and +# lets the ctypes shim size its device buffers without knowing the CK type. +_ELEM_BYTES = {"fp16": 2, "bf16": 2, "fp32": 4, "fp8": 1, "bf8": 1, "int8": 1, "int32": 4} + + +class MultiABDDispatcherLib: + """Thin ctypes wrapper around a compiled gemm_multi_abd dispatcher .so. + + Multi-ABD is registry-bypass with a divergent ABI: ``dispatcher_run_multi_abd`` + takes ARRAYS of host pointers (one per A/B/D tensor) plus per-group element + sizes, and the .so owns all GPU memory (hipMalloc/Memcpy/Free) internally. + """ + + def __init__(self, so_path: Path): + self._path = Path(so_path) + self._lib = ctypes.CDLL(str(self._path)) + self._setup_functions() + + def _setup_functions(self) -> None: + lib = self._lib + lib.dispatcher_initialize.argtypes = [] + lib.dispatcher_initialize.restype = ctypes.c_int + lib.dispatcher_get_kernel_name.argtypes = [] + lib.dispatcher_get_kernel_name.restype = ctypes.c_char_p + for fn in ( + "dispatcher_get_num_a_tensors", + "dispatcher_get_num_b_tensors", + "dispatcher_get_num_d_tensors", + ): + getattr(lib, fn).argtypes = [] + getattr(lib, fn).restype = ctypes.c_int + lib.dispatcher_run_multi_abd.argtypes = [ + ctypes.POINTER(ctypes.c_void_p), # as_hosts + ctypes.POINTER(ctypes.c_void_p), # bs_hosts + ctypes.POINTER(ctypes.c_void_p), # ds_hosts + ctypes.c_void_p, # e_host + ctypes.POINTER(ctypes.c_int64), # stride_as + ctypes.POINTER(ctypes.c_int64), # stride_bs + ctypes.POINTER(ctypes.c_int64), # stride_ds + ctypes.c_int64, # stride_e + ctypes.c_int, # elem_a + ctypes.c_int, # elem_b + ctypes.c_int, # elem_d + ctypes.c_int, # elem_e + ctypes.c_int, # num_a + ctypes.c_int, # num_b + ctypes.c_int, # num_d + ctypes.c_int64, # M + ctypes.c_int64, # N + ctypes.c_int64, # K + ctypes.POINTER(ctypes.c_float), # time_ms + ] + lib.dispatcher_run_multi_abd.restype = ctypes.c_int + lib.dispatcher_cleanup.argtypes = [] + lib.dispatcher_cleanup.restype = None + + @property + def path(self) -> Path: + return self._path + + def initialize(self) -> bool: + return self._lib.dispatcher_initialize() == 0 + + @property + def kernel_name(self) -> str: + raw = self._lib.dispatcher_get_kernel_name() + return raw.decode("utf-8") if raw else "unknown" + + @property + def tensor_counts(self) -> Tuple[int, int, int]: + return ( + int(self._lib.dispatcher_get_num_a_tensors()), + int(self._lib.dispatcher_get_num_b_tensors()), + int(self._lib.dispatcher_get_num_d_tensors()), + ) + + def run( + self, + as_arrays: List[np.ndarray], + bs_arrays: List[np.ndarray], + ds_arrays: List[np.ndarray], + e_array: np.ndarray, + M: int, + N: int, + K: int, + elem_a: int, + elem_b: int, + elem_d: int, + elem_e: int, + stride_as: Optional[List[int]] = None, + stride_bs: Optional[List[int]] = None, + stride_ds: Optional[List[int]] = None, + stride_e: int = 0, + ) -> Tuple[int, float]: + def _ptr_array(arrays): + arr = (ctypes.c_void_p * max(len(arrays), 1))() + for i, a in enumerate(arrays): + arr[i] = a.ctypes.data_as(ctypes.c_void_p) + return arr + + def _i64_array(vals): + # The GemmMultiABDKernel does NOT derive strides from a 0 sentinel + # (unlike some CK host helpers); it passes them straight to the + # UniversalGemm kernel args. We must therefore supply the explicit + # leading strides (see GpuMultiABDRunner.run, which mirrors the + # Old-TE profiler's get_default_stride). + if not vals: + return ctypes.POINTER(ctypes.c_int64)() + arr = (ctypes.c_int64 * len(vals))() + for i, v in enumerate(vals): + arr[i] = int(v) + return arr + + as_ptrs = _ptr_array(as_arrays) + bs_ptrs = _ptr_array(bs_arrays) + ds_ptrs = _ptr_array(ds_arrays) + stride_as_arr = _i64_array(stride_as) + stride_bs_arr = _i64_array(stride_bs) + stride_ds_arr = _i64_array(stride_ds) + time_ms = ctypes.c_float(0.0) + status = self._lib.dispatcher_run_multi_abd( + as_ptrs, + bs_ptrs, + ds_ptrs, + e_array.ctypes.data_as(ctypes.c_void_p), + stride_as_arr, + stride_bs_arr, + stride_ds_arr, + int(stride_e), + elem_a, + elem_b, + elem_d, + elem_e, + len(as_arrays), + len(bs_arrays), + len(ds_arrays), + M, + N, + K, + ctypes.byref(time_ms), + ) + return status, time_ms.value + + def cleanup(self) -> None: + self._lib.dispatcher_cleanup() + + +# Multi-ABD per-group element-wise CDE ops, as numpy reductions over +# (acc, D0, D1, ...). These mirror ck_tile::element_wise (see +# unary_element_wise_operation.hpp) EXACTLY so the numpy reference matches the +# device epilogue: +# PassThrough : E = C (D tensors ignored) +# MultiDAdd : E = C + D0 + D1 + ... +# MultiDMultiply : E = C * D0 * D1 * ... +# AddScale : E = scale * (C + D0 + D1 + ...) (default scale = 1.0; +# note AddScale folds *all* its arguments including C, so C +# participates in the sum -- see struct AddScale) +def _cde_reference(op: str, acc: np.ndarray, ds: List[np.ndarray]) -> np.ndarray: + """Apply the CDE element-wise op to the fp32 accumulator + D tensors.""" + acc = acc.astype(np.float32) + ds32 = [d.astype(np.float32) for d in ds] + if op == "PassThrough": + return acc + if op == "MultiDAdd": + out = acc.copy() + for d in ds32: + out = out + d + return out + if op == "MultiDMultiply": + out = acc.copy() + for d in ds32: + out = out * d + return out + if op == "AddScale": + # AddScale starts at 0 and folds every argument (C included). + out = acc.copy() + for d in ds32: + out = out + d + return out # scale defaults to 1.0 + raise ValueError(f"Unsupported CDE element-wise op for reference: {op}") + + +def _ab_reference(op: str, group: List[np.ndarray]) -> np.ndarray: + """Combine a group of A (or B) tensors into a single matrix via the op. + + Mirrors reference_gemm_multiple_abd's A/B pre-pass, which applies the group + element-wise op across the tuple of tensors element-by-element: + PassThrough : first tensor only (op(y, x0, x1...) assigns y = x0) + MultiDAdd : sum of all tensors + MultiDMultiply : product of all tensors + AddScale : scale * sum of all tensors (scale defaults to 1.0) + """ + g32 = [t.astype(np.float32) for t in group] + if op == "PassThrough": + return g32[0] + if op == "MultiDAdd": + out = g32[0].copy() + for t in g32[1:]: + out = out + t + return out + if op == "AddScale": + out = np.zeros_like(g32[0]) + for t in g32: + out = out + t + return out # scale defaults to 1.0 + if op == "MultiDMultiply": + out = g32[0].copy() + for t in g32[1:]: + out = out * t + return out + raise ValueError(f"Unsupported A/B element-wise op for reference: {op}") + + +class GpuMultiABDRunner: + """High-level multi-ABD runner: construct from a .so, call run(problem). + + All A/B/D operands share the group dtype/layout (matching the Tile Engine + gemm_multi_abd op). The runner builds the host operand buffers in the + kernel's element dtype + layout and hands raw pointer arrays to the .so, + which owns GPU memory. fp16 is the only supported multi-abd dtype. + + Numeric verification (B1): the runner generates all A/B/D operands itself, + so it also owns the numpy reference. When ``verify`` is set on ``run`` it + computes ``E = CDE( AB(As) @ BB(Bs), {Ds} )`` -- byte-for-byte mirroring + ck_tile::reference_gemm_multiple_abd (A/B groups combined element-wise via + their ops into one matrix, single GEMM, then the CDE op folds the D tensors) + -- and reports max_rel = max|E_gpu - E_ref| / max|E_ref| on the result. + + Layout and per-group element-wise ops / tensor counts are taken from the + supplied config object when available (N2); the kernel name is used only as + a fallback so the runner never silently guesses a wrong layout. + """ + + def __init__( + self, + lib_path: Path, + layout4: Optional[str] = None, + a_elementwise_op: Optional[str] = None, + b_elementwise_op: Optional[str] = None, + cde_elementwise_op: Optional[str] = None, + ): + self.lib = MultiABDDispatcherLib(lib_path) + if not self.lib.initialize(): + raise RuntimeError(f"Failed to initialize multi_abd .so: {lib_path}") + self._kernel_name = self.lib.kernel_name + self._num_a, self._num_b, self._num_d = self.lib.tensor_counts + + # N2: prefer the layout / ops derived from the config object. Only fall + # back to parsing the kernel name (which is deterministic from config) + # when the caller did not supply them -- no silent "rcrr" default. + self._layout4 = layout4 or self._parse_layout4() + a_op, b_op, cde_op = self._parse_ops() + self._a_op = a_elementwise_op or a_op + self._b_op = b_elementwise_op or b_op + self._cde_op = cde_elementwise_op or cde_op + + @property + def kernel_name(self) -> str: + return self._kernel_name + + def _parse_layout4(self) -> str: + """Fallback: 4-char (A,B,E,D) layout from ``gemm___...``.""" + parts = self._kernel_name.split("_") + if len(parts) > 2 and len(parts[2]) == 4 and set(parts[2]) <= {"r", "c"}: + return parts[2] + raise ValueError( + f"Cannot derive multi_abd layout from kernel name {self._kernel_name!r}; " + "pass layout4 from the config object instead" + ) + + def _parse_ops(self) -> Tuple[str, str, str]: + """Fallback: parse the three element-wise ops from the kernel name. + + Name suffix is ``..._multiabd_a_b_d___``. + """ + marker = "_multiabd_" + idx = self._kernel_name.find(marker) + if idx >= 0: + tail = self._kernel_name[idx + len(marker) :].split("_") + # tail == [aNA, bNB, dND, Aop, Bop, CDEop] + if len(tail) >= 6: + return tail[3], tail[4], tail[5] + # Raise rather than silently defaulting to PassThrough (which would yield + # a wrong numeric reference): the config is the source of truth and the + # name is deterministic from it, so an unparseable name is a real error. + # Mirrors _parse_layout4, which also raises. + raise ValueError( + f"cannot parse multi_abd element-wise ops from kernel name " + f"{self._kernel_name!r}; expected a " + f"'..._multiabd_a_b_d___' suffix" + ) + + def run( + self, + problem: GemmProblem, + seed: int = 0, + verify: bool = False, + verify_tol: float = 2e-2, + ) -> GemmResult: + M, N, K = problem.M, problem.N, problem.K + dtype = _dtype_from_kernel_name(self._kernel_name) + if dtype != "fp16": + raise ValueError( + f"multi_abd runner supports fp16 only, got {dtype!r} " + f"(kernel {self._kernel_name!r})" + ) + layout4 = self._layout4 + la, lb = layout4[0], layout4[1] + ld = layout4[3] if len(layout4) >= 4 else "r" + + rng = np.random.default_rng(seed) + + # Logical (row-major, M-major) operands used for the numpy reference, and + # the physically-laid-out contiguous buffers handed to the .so. The .so + # interprets each buffer per the compiled layout, so a column-major + # operand is stored transposed but represents the same logical matrix. + def _mk(rows, cols, layout_char, n_tensors, lo, hi): + logical, physical = [], [] + for _ in range(n_tensors): + x = rng.uniform(lo, hi, size=(rows, cols)).astype(np.float32) + if dtype != "fp16": + raise ValueError(f"multi_abd runner supports fp16 only, got {dtype}") + x16 = x.astype(np.float16) + logical.append(x16) + x_lay = x16 if layout_char == "r" else x16.T + physical.append(np.ascontiguousarray(x_lay, dtype=np.float16)) + return logical, physical + + as_logical, as_arrays = _mk(M, K, la, self._num_a, -5.0, 5.0) + bs_logical, bs_arrays = _mk(K, N, lb, self._num_b, -5.0, 5.0) + ds_logical, ds_arrays = _mk(M, N, ld, self._num_d, -1.0, 1.0) + elem = _ELEM_BYTES.get(dtype, 2) + e_array = np.zeros((M, N), dtype=np.float16) + + # Explicit leading strides -- the GemmMultiABDKernel does NOT derive them + # from a zero sentinel (it forwards them straight to the UniversalGemm + # kernel args), so a 0 stride collapses the whole output onto row 0. + # Mirror the Old-TE profiler's get_default_stride(rows, cols, is_row): + # row-major -> #cols, col-major -> #rows. + def _lead_stride(rows, cols, layout_char): + return cols if layout_char == "r" else rows + + stride_as = [_lead_stride(M, K, la)] * self._num_a + stride_bs = [_lead_stride(K, N, lb)] * self._num_b + stride_ds = [_lead_stride(M, N, ld)] * self._num_d + # E is the C position (index 2) of the 4-char layout. + le = layout4[2] if len(layout4) >= 3 else "r" + stride_e = _lead_stride(M, N, le) + + status, time_ms = self.lib.run( + as_arrays, + bs_arrays, + ds_arrays, + e_array, + M, + N, + K, + elem, + elem, + elem, + elem, + stride_as=stride_as, + stride_bs=stride_bs, + stride_ds=stride_ds, + stride_e=stride_e, + ) + tflops = (problem.flops / (time_ms * 1e-3)) / 1e12 if time_ms > 0 else 0.0 + + max_rel = None + if verify and status == 0: + # A/B groups are combined element-wise into a single matrix, then a + # single GEMM, then the CDE op folds the D tensors -- exactly + # reference_gemm_multiple_abd. Compute in fp32. + a_m_k = _ab_reference(self._a_op, as_logical) + b_k_n = _ab_reference(self._b_op, bs_logical) + acc = a_m_k @ b_k_n + ref = _cde_reference(self._cde_op, acc, ds_logical).astype(np.float32) + got = e_array.astype(np.float32) + denom = float(np.max(np.abs(ref))) or 1.0 + max_rel = float(np.max(np.abs(got - ref)) / denom) + + return GemmResult( + output=e_array, + time_ms=time_ms, + status=status, + tflops=tflops, + kernel_name=self._kernel_name, + max_rel=max_rel, + ) + + +# ============================================================================ +# Build API: codegen + hipcc -> .so paths (no GPU) +# ============================================================================ + +# AMDGPU codegen flags Tile Engine passes to hipcc for GEMM kernels. These MUST +# match, flag-for-flag, the set the Tile Engine gemm_universal benchmark TU is +# compiled with (projects/composablekernel/CMakeLists.txt) -- they steer inlining +# and register allocation, and because persistent kernels size their grid by +# occupancy, any mismatch produces large perf gaps vs Tile Engine and makes the +# parity comparison no longer apples-to-apples. +# +# Tile Engine's actual GEMM benchmark flags (verified from its compile_commands): +# -fno-offload-uniform-block +# -mllvm --lsr-drop-solution=1 +# -mllvm -enable-post-misched=0 +# -mllvm -amdgpu-early-inline-all=true +# -mllvm -amdgpu-function-calls=false +# -mllvm -amdgpu-coerce-illegal-types=1 (CMake adds this only when the +# compiler accepts it; see below) +# NOTE: -enable-noalias-to-md-conversion=0 is NOT a Tile Engine GEMM flag (it only +# appears in the standalone CK examples/tests), so it deliberately is NOT here. +_TILE_ENGINE_CODEGEN_FLAGS = ( + "-mllvm", "--lsr-drop-solution=1", + "-mllvm", "-enable-post-misched=0", + "-mllvm", "-amdgpu-early-inline-all=true", + "-mllvm", "-amdgpu-function-calls=false", + "-fno-offload-uniform-block", +) + +# Flags Tile Engine's CMake only adds when ``check_cxx_compiler_flag`` passes +# (newer -mllvm options that some clang builds reject). We mirror that probe so +# the bridge stays matched to Tile Engine on every toolchain: the flag is present +# exactly where TE would have it, and absent where TE's CMake would also skip it. +_PROBED_CODEGEN_FLAGS = ( + ("-mllvm", "-amdgpu-coerce-illegal-types=1"), +) + +# The single hipcc used for BOTH the flag-acceptance probe and the actual +# compile/link. Pinned to match Old-TE, which builds via CMake's +# CMAKE_CXX_COMPILER (== /opt/rocm/bin/hipcc in CK CI) and never reads $HIPCC; +# ctypes_utils uses the same path. Keeping probe == compiler guarantees the +# -mllvm flag decision reflects the compiler that actually builds the kernel. +_HIPCC = "/opt/rocm/bin/hipcc" + + +def _resolve_hipcc() -> str: + return _HIPCC + + +@functools.lru_cache(maxsize=None) +def _hipcc_accepts(flag_tuple: Tuple[str, ...]) -> bool: + """Mirror CMake check_cxx_compiler_flag: does hipcc compile a trivial TU with + these flags? Cached so the probe runs at most once per distinct flag set.""" + hipcc = _resolve_hipcc() + try: + with tempfile.TemporaryDirectory() as d: + src = Path(d) / "probe.cpp" + src.write_text("int main(){}\n") + r = subprocess.run( + [hipcc, *flag_tuple, "-c", str(src), "-o", str(Path(d) / "probe.o")], + capture_output=True, timeout=120, + ) + return r.returncode == 0 + except Exception: + return False + + +@functools.lru_cache(maxsize=1) +def _tile_engine_codegen_flags() -> Tuple[str, ...]: + """Tile Engine's GEMM codegen flags plus any probe-gated flags the compiler + accepts -- the exact backend flag set the TE benchmark is built with.""" + flags = list(_TILE_ENGINE_CODEGEN_FLAGS) + for pair in _PROBED_CODEGEN_FLAGS: + if _hipcc_accepts(pair): + flags = list(pair) + flags + return tuple(flags) + + +def _ctypes_source_name(config: GemmKernelConfig) -> str: + """Pick the ctypes ABI source for a config's variant. + + Variants whose launch ABI differs from the single-problem + ``dispatcher_run_gemm`` path need their own lib: + * stream_k keeps the single-problem C ABI (single A/B/C, M/N/K) but its + lib builds a ``StreamKHostArgs`` and calls ``SelectedKernel::launch`` + directly instead of routing through the registry. + * grouped has a multi-problem launch signature the single-problem + ``gemm_ctypes_lib.cpp`` cannot express. + * multi_d fuses extra D operands and exposes a GemmMultiDArgs launch + signature, so it compiles against its dedicated ctypes source. + * multi_abd has a divergent (array-pointer) ABI + (dispatcher_run_multi_abd) that the single-problem + ``gemm_ctypes_lib.cpp`` cannot express. + """ + if config.variant == "stream_k": + return "streamk_gemm_ctypes_lib.cpp" + if config.variant == "grouped": + return "grouped_gemm_ctypes_lib.cpp" + if config.variant == "multi_d": + return "multi_d_gemm_ctypes_lib.cpp" + if config.variant == "multi_abd": + return "gemm_multi_abd_ctypes_lib.cpp" + return "gemm_ctypes_lib.cpp" + + +def _build_compile_jobs( + config: GemmKernelConfig, header: Path +) -> Tuple[Dict[str, Any], Path]: + """Replicate the (validated) compile+link commands from ctypes_utils.""" + root = _cu.get_dispatcher_root() + ck_root = root.parent + build_dir = _cu.get_build_dir() + output_dir = _cu.get_generated_kernels_dir() + ctypes_source = root / "bindings" / "ctypes" / _ctypes_source_name(config) + static_lib = build_dir / "libck_tile_dispatcher.a" + + lib_path = build_dir / "examples" / f"lib{config.name}.so" + # Multi-ABD is self-contained (registry-bypass, no static lib) so it can be + # built without a prior full CMake configure of the dispatcher; that CMake + # step is what normally creates build/examples. Ensure the output directory + # exists so the hipcc -o path is always writable (harmless if it already is). + lib_path.parent.mkdir(parents=True, exist_ok=True) + obj_file = lib_path.with_suffix(".o") + # The Stream-K path skips the cmake build that would normally create this + # directory, so ensure it exists before hipcc writes the object/.so here. + lib_path.parent.mkdir(parents=True, exist_ok=True) + + # Per-variant AMDGPU codegen flags. The regular path matches Tile Engine's + # gemm_universal build via _tile_engine_codegen_flags(). Stream-K must instead + # match TE's gemm_streamk build EXACTLY for a fair A/B: -enable-post-misched=0 + # is applied unconditionally (not persistent-gated) and it does NOT use + # -enable-noalias-to-md-conversion=0. + is_streamk = getattr(config, "variant", "") == "stream_k" + variant_flags = ( + [ + "-std=c++20", + "-fno-offload-uniform-block", + "-mllvm", "--lsr-drop-solution=1", + "-mllvm", "-enable-post-misched=0", + "-mllvm", "-amdgpu-early-inline-all=true", + "-mllvm", "-amdgpu-function-calls=false", + "--offload-compress", + ] + if is_streamk + else list(_tile_engine_codegen_flags()) + ) + + compile_cmd = [ + _resolve_hipcc(), + "-c", + "-fPIC", + "-O3", + f"-I{root / 'include'}", + f"-I{ck_root / 'include'}", + f"-I{ck_root}", + f"-I{str(output_dir)}", + "-DCK_TILE_SINGLE_KERNEL_INCLUDE", + f"-include{header}", + "-D__HIP_PLATFORM_AMD__", + f"--offload-arch={config.gfx_arch}", + f'-DGFX_ARCH="{config.gfx_arch}"', + # Match Tile Engine's AMDGPU codegen flags exactly (see variant_flags / + # _tile_engine_codegen_flags). Without them the kernel is compiled with + # different inlining/register allocation, which changes occupancy; + # persistent kernels size their grid by occupancy + # (UniversalGemmKernel::MaxOccupancyGridSize = #CUs x occupancy), so a + # mismatch shows up as large perf gaps vs Tile Engine on persistent tiles. + *variant_flags, + "-Wno-undefined-func-template", + "-Wno-float-equal", + str(ctypes_source), + "-o", + str(obj_file), + ] + link_cmd = [ + _resolve_hipcc(), + "-shared", + "-fPIC", + f"--offload-arch={config.gfx_arch}", + "--hip-link", + str(obj_file), + ] + # The regular GEMM ABI goes through the dispatcher registry and must link the + # dispatcher static lib. Both Stream-K and Multi-ABD are registry-bypass + # (their ctypes libs launch the force-included kernel directly and reference + # no registry/dispatcher symbols), so their .so needs only the force-included + # kernel -- no static lib -- keeping it self-contained. + registry_bypass = is_streamk or config.variant == "multi_abd" + if not registry_bypass: + link_cmd.append(str(static_lib)) + link_cmd += ["-o", str(lib_path)] + job = {"compile_cmd": compile_cmd, "link_cmd": link_cmd, "lib_path": str(lib_path)} + return job, lib_path + + +def setup_multiple_gemm_dispatchers( + configs: List[GemmKernelConfig], + verbose: bool = True, + max_workers: Optional[int] = None, +) -> List[Optional[Path]]: + """Codegen + compile each config into its own .so. Returns .so paths. + + This is the build half of the bridge. It touches NO GPU -- pure CPU + codegen + hipcc, run massively in parallel -- and returns only ``Path`` + objects (``None`` for configs that failed to generate/compile), aligned to + the input order. Benchmarking happens later, in an isolated worker. + """ + import sys + + n = len(configs) + results: List[Optional[Path]] = [None] * n + if n == 0: + return results + + # Guard the compile path: every config's gfx_arch must be a concrete, + # supported arch before it reaches -DGFX_ARCH / --offload-arch / gpu_target. + # expand_sweep already resolves this, but a config built directly (gfx_arch + # left as None) would otherwise emit a literal "None" arch. Resolve/validate + # here too, defaulting a None to the rocminfo-detected arch (never gfx942). + _shared_arch: Optional[str] = None + resolved_configs: List[GemmKernelConfig] = [] + for c in configs: + if c.gfx_arch: + resolved_configs.append(replace(c, gfx_arch=_resolve_arch(c.gfx_arch))) + else: + if _shared_arch is None: + _shared_arch = _get_arch() + resolved_configs.append(replace(c, gfx_arch=_shared_arch)) + configs = resolved_configs + + # Hard-fail rather than build a runnable but WRONG kernel: a preshuffle config + # with permute_n=True would compile a "_permuteN" kernel whose device pipeline + # is not yet bridged (it mis-shuffles B -> wrong results; see BRIDGE_PERMUTE_N). + # expand_sweep never yields such a config (it pins permute_n to BRIDGE_PERMUTE_N), + # so this only catches a hand-constructed / misused config before it becomes a + # .so that could silently produce incorrect output. + if not BRIDGE_PERMUTE_N: + for c in configs: + if getattr(c, "variant", "") == "preshuffle" and getattr( + c, "permute_n", False + ): + raise ValueError( + "permute_n=True is not supported by the bridge yet " + "(BRIDGE_PERMUTE_N=False): refusing to build a permuteN kernel " + f"that would mis-shuffle B ({c.name}). Flip BRIDGE_PERMUTE_N once " + "the permuteN pipeline is emitted in unified_gemm_codegen." + ) + + max_workers = max_workers or min(multiprocessing.cpu_count(), 8) + + # Dedupe identical configs by name; compile once, share the path. + first_index: Dict[str, int] = {} + unique: List[int] = [] + for i, c in enumerate(configs): + key = c.name + if key not in first_index: + first_index[key] = i + unique.append(i) + + codegen_script = _cu.get_codegen_path() + output_dir = _cu.get_generated_kernels_dir() + static_lib = _cu.get_build_dir() / "libck_tile_dispatcher.a" + ctypes_dir = _cu.get_dispatcher_root() / "bindings" / "ctypes" + # Multi-ABD is registry-bypass: it links only the force-included kernel, so it + # needs its own ctypes source but NOT the dispatcher static lib. Every other + # variant goes through the registry and requires the static lib too. + needed_sources = {ctypes_dir / _ctypes_source_name(c) for c in configs} + missing = [str(p) for p in needed_sources if not p.exists()] + # Stream-K and Multi-ABD .so files are registry-bypass: they link only the + # force-included kernel (no registry/dispatcher symbols), so they do not need + # the dispatcher static lib. Only a build in which every config is one of + # these can skip the static lib; any other variant requires it. + all_registry_bypass = {c.variant for c in configs} <= {"stream_k", "multi_abd"} + need_static_lib = not all_registry_bypass + if (need_static_lib and not static_lib.exists()) or missing: + parts = [] + if need_static_lib and not static_lib.exists(): + parts.append(str(static_lib)) + parts.extend(missing) + raise FileNotFoundError( + "Missing static lib or ctypes source required for compilation:\n " + + "\n ".join(parts) + + "\n" + "Build the dispatcher first (cmake + make)." + ) + + # -- Step 1: parallel codegen (one header per unique config) ----------- + codegen_args = [] + for i in unique: + c = configs[i] + codegen_args.append( + { + "index": i, + "python": sys.executable, + "codegen_script": str(codegen_script), + "output_dir": str(output_dir), + "dtype": c.dtype_a, + "layout": c.codegen_layout, + # Multi-ABD codegen expects the 4-char (A,B,E,D) layout so it can + # split off the D layout; every other variant uses 3-char. + "layout": c.layout4 if c.variant == "multi_abd" else c.layout, + "gpu_target": c.gfx_arch, + "tile_config_json": c.to_codegen_json(), + "hpp_glob_pattern": f"{c.name}.hpp", + # Honor the config's variant so non-standard kernels are codegen'd + # as themselves; the kernel name (and thus hpp_glob_pattern) already + # carries the variant suffix, so a missing/standard value here would + # produce a header whose name never matches the requested pattern. + "variant": c.variant, + } + ) + + if verbose: + print( + f"[gemm-bridge] codegen: {len(codegen_args)} headers " + f"(workers={max_workers})..." + ) + + headers: Dict[int, Path] = {} + with ProcessPoolExecutor(max_workers=max_workers) as ex: + futs = { + ex.submit(_cu._generate_single_kernel_subprocess, a): a["index"] + for a in codegen_args + } + for fut in as_completed(futs): + i = futs[fut] + ok, hdr, err = fut.result() + if ok and hdr: + headers[i] = Path(hdr) + if verbose: + print(f" OK codegen [{i}] {configs[i].name}") + elif verbose: + print(f" FAIL codegen [{i}] {configs[i].name}: {err}") + + # -- Step 2: parallel compile + link ----------------------------------- + compile_jobs = [] + job_index: List[int] = [] + for i in unique: + hdr = headers.get(i) + if hdr is None: + continue + job, _ = _build_compile_jobs(configs[i], hdr) + compile_jobs.append(job) + job_index.append(i) + + if verbose and compile_jobs: + print( + f"[gemm-bridge] compile: {len(compile_jobs)} .so " + f"(workers={max_workers})..." + ) + + with ProcessPoolExecutor(max_workers=max_workers) as ex: + futs = { + ex.submit(_cu._run_hipcc_subprocess, job): job_index[j] + for j, job in enumerate(compile_jobs) + } + for fut in as_completed(futs): + i = futs[fut] + ok, lp, err = fut.result() + if ok and lp: + results[i] = Path(lp) + if verbose: + print(f" OK compile [{i}] {Path(lp).name}") + elif verbose: + print(f" FAIL compile [{i}] {configs[i].name}: {err}") + + # -- Fan the deduped result back out to every input index -------------- + for i, c in enumerate(configs): + if results[i] is None: + results[i] = results[first_index[c.name]] + + if verbose: + ok_count = sum(1 for r in results if r is not None) + print(f"[gemm-bridge] setup complete: {ok_count}/{n} configs -> .so") + + return results + + +# ============================================================================ +# TE sweep config expansion +# ============================================================================ + + +def _expand_range(entry: Dict[str, Any]) -> List[int]: + """Expand a tile_config entry: either {min,max,step} or {values:[...]}.""" + if "values" in entry: + return list(entry["values"]) + lo = int(entry["min"]) + hi = int(entry["max"]) + step = int(entry.get("step", 1)) + return list(range(lo, hi + 1, step)) + + +def _expand_values(entry: Optional[Dict[str, Any]], default: List[Any]) -> List[Any]: + if entry is None: + return list(default) + return list(entry.get("values", default)) + + +def _is_power_of_two(x: int) -> bool: + return x > 0 and (x & (x - 1)) == 0 + + +# --- Warp-configuration gate (parity with Old-TE) -------------------------- +# Old-TE's gemm_validation_utils.validate_warp_configuration restricts the +# warps-per-block triple (wave_m/n/k) to WARP_SUPPORTED_COMBINATIONS[arch]. +# expand_sweep must apply the SAME gate or the bridge emits wave configs Old-TE +# never generates (product != 4 on CDNA), diverging the two instance sets. +_WARP_SUPPORTED_COMBINATIONS_FALLBACK = { + "gfx90a": [[1, 4, 1], [2, 2, 1], [4, 1, 1]], + "gfx942": [[1, 4, 1], [2, 2, 1], [4, 1, 1]], + "gfx950": [[1, 4, 1], [2, 2, 1], [4, 1, 1]], + "gfx1201": [[2, 4, 1], [1, 8, 1], [8, 1, 1], [4, 2, 1]], +} + + +def _warp_supported_table(): + """Canonical WARP_SUPPORTED_COMBINATIONS from gemm_validation_utils, with a + hardcoded fallback so the bridge never silently skips the gate.""" + try: + from gemm_validation_utils import WARP_SUPPORTED_COMBINATIONS as _t + return _t + except Exception: # pragma: no cover - fallback keeps the gate active + return _WARP_SUPPORTED_COMBINATIONS_FALLBACK + + +def _warp_config_supported(wave_m: int, wave_n: int, wave_k: int, arch: str) -> bool: + """True iff [wave_m, wave_n, wave_k] is an allowed warps-per-block triple + for ``arch`` (mirrors Old-TE validate_warp_configuration). Unknown arch => + permissive (matches Old-TE's log-and-allow behavior).""" + allowed = _warp_supported_table().get(arch) + if not allowed: + return True + return [wave_m, wave_n, wave_k] in allowed + + +def expand_sweep( + config_path: str, + arch: Optional[str] = None, + dtype: str = "fp16", + layout: str = "rcr", + variant: str = "standard", + num_a_tensors: int = 2, + num_b_tensors: int = 2, + num_d_tensors: int = 2, + a_elementwise_op: str = "PassThrough", + b_elementwise_op: str = "PassThrough", + cde_elementwise_op: str = "PassThrough", + mabd_cli_overrides: Optional[Dict[str, Any]] = None, +) -> List[GemmKernelConfig]: + """Expand a Tile Engine GEMM JSON sweep config into GemmKernelConfig list. + + The TE config uses ``tile_config`` (ranges/value-lists for tile, warp and + warp_tile triples) and ``trait_config`` (value-lists for pipeline, + scheduler, epilogue, pad_*, persistent). Every valid combination becomes + one GemmKernelConfig. Invalid combinations are dropped via the dispatcher's + own validator, and duplicates (by .name) are collapsed. + + The operand signature (``dtype``, ``layout``) is applied to every emitted + GemmKernelConfig, so the same sweep expands across any supported dtype/layout. + + For ``variant='multi_abd'`` the ``layout`` is the 4-char (A,B,E,D) code + (e.g. ``rcrr``); the tensor counts and per-group element-wise ops are carried + onto every produced config so they participate in the kernel name. For + ``variant='multi_d'`` the ``layout`` may be 4-char (4th char = D-tensor + layout) and each base config is further expanded over ``multi_d_config`` + (elementwise_ops x num_d_tensors), mirroring the codegen's multi_d expansion. + + ``arch`` may be ``None`` (or omitted): it is resolved once here via + :func:`_resolve_arch` (rocminfo-detect + validate) so every produced config + carries a concrete, supported ``gfx_arch`` -- the compile command's + ``-DGFX_ARCH`` / ``--offload-arch`` never see ``None``. An explicit, + unsupported arch raises ``ValueError``. + """ + # Multi-ABD is fp16-only end-to-end (codegen, ctypes lib, and GpuMultiABDRunner + # all assume fp16). Reject other dtypes here -- before any codegen/build -- so + # callers get a clear error instead of a runtime failure after kernels compile. + if variant == "multi_abd" and dtype != "fp16": + raise ValueError( + f"multi_abd bridge supports fp16 only, got {dtype!r}; " + "codegen, ctypes lib and the runner are all fp16-only for this variant" + ) + + # Resolve the arch up front so it cannot silently default: this is the single + # value stamped onto every emitted config's .gfx_arch below. + arch = _resolve_arch(arch) + + with open(config_path) as f: + cfg = json.load(f) + + tc = cfg.get("tile_config", {}) + tr = cfg.get("trait_config", {}) + + tile_ms = _expand_range(tc["tile_m"]) + tile_ns = _expand_range(tc["tile_n"]) + tile_ks = _expand_range(tc["tile_k"]) + wave_ms = _expand_range(tc["warp_m"]) # TE "warp" == wave count + wave_ns = _expand_range(tc["warp_n"]) + wave_ks = _expand_range(tc["warp_k"]) + wt_ms = _expand_range(tc["warp_tile_m"]) + wt_ns = _expand_range(tc["warp_tile_n"]) + wt_ks = _expand_range(tc["warp_tile_k"]) + + pipelines = _expand_values(tr.get("pipeline"), ["compv3"]) + schedulers = _expand_values(tr.get("scheduler"), ["intrawave"]) + epilogues = _expand_values(tr.get("epilogue"), ["cshuffle"]) + pad_ms = _expand_values(tr.get("pad_m"), [False]) + pad_ns = _expand_values(tr.get("pad_n"), [False]) + pad_ks = _expand_values(tr.get("pad_k"), [False]) + persistents = _expand_values(tr.get("persistent"), [False]) + + # Preshuffle B-shuffle permutation knob -- pinned to the single source of + # truth BRIDGE_PERMUTE_N (see its definition for the full rationale). We + # deliberately ignore cfg.get("permute_n"): both default_config.json and + # default_ci_config.json ship permute_n=true, but that TE host-marker selects + # a permuteN pipeline the bridge does not codegen (it is NOT a distinct + # bridged device kernel), so honoring it would mis-shuffle B. Do NOT "fix" this + # to read the config until the permuteN pipeline is bridged. + # TODO: support permute_n=True by emitting the permuteN pipeline in + # unified_gemm_codegen and flipping BRIDGE_PERMUTE_N to a config-driven value. + permute_n = BRIDGE_PERMUTE_N + + # Stream-K only: sweep reduction strategies (atomic/linear/tree). Other + # variants keep a single dummy value so the product is unaffected. + if variant == "stream_k": + sk = cfg.get("streamk_config", {}) + reductions = _expand_values(sk.get("reduction_strategy"), ["atomic"]) + else: + reductions = ["atomic"] + + la, lb, lc = layout[0], layout[1], layout[2] + # Multi-ABD carries a 4th (D) layout char; default D to C's layout otherwise. + ld = layout[3] if (variant == "multi_abd" and len(layout) >= 4) else lc + + # Multi-D: 4th layout char (if present) is the D-tensor layout; default row. + d_layout_char = layout[3] if (variant == "multi_d" and len(layout) >= 4) else "r" + d_layout_word = _LAYOUT_WORD[d_layout_char] + + # Multi-ABD (B2): the tensor counts and per-group element-wise ops are a real + # part of the swept configuration -- distinct ops produce distinct kernels + # (different epilogue math). Read them from an optional ``multi_abd_config`` + # block in the TE config JSON (lists of values), falling back to the scalar + # kwargs (which default to the Old-TE 2/2/2 all-PassThrough combo). This is + # what lets the driver actually generate + verify a non-PassThrough kernel. + # + # Allowed ops mirror the Old-TE gemm_multi_abd instance builder: + # {PassThrough, AddScale, MultiDMultiply, MultiDAdd}. + if variant == "multi_abd": + mabd = dict(cfg.get("multi_abd_config", {}) or {}) + # CLI overrides win over both the config block and the scalar defaults. + if mabd_cli_overrides: + mabd.update(mabd_cli_overrides) + + def _as_list(v, default): + if v is None: + return list(default) + return list(v) if isinstance(v, (list, tuple)) else [v] + + na_list = _as_list(mabd.get("num_a_tensors"), [num_a_tensors]) + nb_list = _as_list(mabd.get("num_b_tensors"), [num_b_tensors]) + nd_list = _as_list(mabd.get("num_d_tensors"), [num_d_tensors]) + # CK's GemmKernelMultiABD requires >=1 A and B tensors and + # DsLayout::size() > 0 (num_d_tensors >= 1); a 0 or non-integer count + # otherwise fails later with a cryptic tuple-size-0 compile error, so + # reject it here with a clear message. + for _label, _vals in ( + ("num_a_tensors", na_list), + ("num_b_tensors", nb_list), + ("num_d_tensors", nd_list), + ): + for _v in _vals: + if not isinstance(_v, int) or _v < 1: + raise ValueError( + f"multi_abd {_label} must be a positive integer (>= 1), " + f"got {_v!r}" + ) + a_ops = _as_list(mabd.get("a_elementwise_op"), [a_elementwise_op]) + b_ops = _as_list(mabd.get("b_elementwise_op"), [b_elementwise_op]) + cde_ops = _as_list(mabd.get("cde_elementwise_op"), [cde_elementwise_op]) + _ALLOWED_MABD_OPS = {"PassThrough", "AddScale", "MultiDMultiply", "MultiDAdd"} + for op in (*a_ops, *b_ops, *cde_ops): + if op not in _ALLOWED_MABD_OPS: + raise ValueError( + f"Invalid multi_abd element-wise op {op!r}; " + f"valid: {sorted(_ALLOWED_MABD_OPS)}" + ) + mabd_combos = list( + itertools.product(na_list, nb_list, nd_list, a_ops, b_ops, cde_ops) + ) + else: + # Non-multi_abd variants: a single, inert combo carrying the scalar + # kwargs (unused by those code paths' names). + mabd_combos = [ + ( + num_a_tensors, + num_b_tensors, + num_d_tensors, + a_elementwise_op, + b_elementwise_op, + cde_elementwise_op, + ) + ] + + # Multi-D expansion combos (elementwise_op, num_d); a single ("PassThrough",0) + # entry for non-multi_d variants keeps the loop below variant-agnostic. + if variant == "multi_d": + mdc = cfg.get("multi_d_config", {}) + md_ops = _expand_values(mdc.get("elementwise_ops"), ["MultiDAdd"]) + md_nds = _expand_values(mdc.get("num_d_tensors"), [2]) + md_combos = list(itertools.product(md_ops, md_nds)) + else: + md_combos = [("PassThrough", 0)] + + configs: List[GemmKernelConfig] = [] + seen: set = set() + for ( + tm, + tn, + tk, + wm, + wn, + wk, + wtm, + wtn, + wtk, + pipe, + sched, + epi, + pm, + pn, + pk, + persist, + red, + ) in itertools.product( + tile_ms, + tile_ns, + tile_ks, + wave_ms, + wave_ns, + wave_ks, + wt_ms, + wt_ns, + wt_ks, + pipelines, + schedulers, + epilogues, + pad_ms, + pad_ns, + pad_ks, + persistents, + reductions, + ): + # Tile/CShuffle correctness gate. A block tile must split evenly across + # its waves -- tile % (wave * warp_tile) == 0 -- else the kernel is + # genuinely invalid. + # + # Narrowed CShuffle-store gate (issue #9684): the CShuffle epilogue only + # mis-stores the accumulator for one specific combination -- an ODD + # per-wave repeat (>1) paired with a 32-wide warp tile in that dimension. + # GPU-verified on gfx942: the tile_m=192 / wave_m=2 / warp_tile_m=32 + # configs (MRepeat = 192/(2*32) = 3) return garbage, while EVERY other + # non-power-of-two repeat is numerically correct -- including MRepeat=3 + # with warp_tile_m=16 (192/(4*16)) and even non-pow2 repeats like 6 and + # 12. The previous "per-wave repeat must be a power of two" rule was too + # broad and needlessly dropped 90 valid configs. The "default" epilogue + # stores directly and is exempt. + m_div = wm * wtm + n_div = wn * wtn + if m_div <= 0 or n_div <= 0 or tm % m_div != 0 or tn % n_div != 0: + continue + # Parity gate: only emit warps-per-block triples Old-TE allows + # (WARP_SUPPORTED_COMBINATIONS[arch]); see _warp_config_supported. + if not _warp_config_supported(wm, wn, wk, arch): + continue + if epi == "cshuffle" and not _cshuffle_store_ok( + tm // m_div, tn // n_div, wtm, wtn + ): + continue + + for (m_na, m_nb, m_nd, m_aop, m_bop, m_cdeop) in mabd_combos: + for ew_op, md_nd in md_combos: + c = GemmKernelConfig( + dtype_a=dtype, + dtype_b=dtype, + dtype_c=_output_dtype(dtype), + dtype_acc=("int32" if dtype == "int8" else "fp32"), + layout_a=_LAYOUT_WORD[la], + layout_b=_LAYOUT_WORD[lb], + layout_c=_LAYOUT_WORD[lc], + tile_m=tm, + tile_n=tn, + tile_k=tk, + wave_m=wm, + wave_n=wn, + wave_k=wk, + warp_tile_m=wtm, + warp_tile_n=wtn, + warp_tile_k=wtk, + pipeline=pipe, + scheduler=sched, + epilogue=epi, + pad_m=bool(pm), + pad_n=bool(pn), + pad_k=bool(pk), + persistent=bool(persist), + gfx_arch=arch, + variant=variant, + reduction_strategy=red, + permute_n=permute_n, + num_a_tensors=m_na, + num_b_tensors=m_nb, + num_d_tensors=(md_nd if variant == "multi_d" else m_nd), + a_elementwise_op=m_aop, + b_elementwise_op=m_bop, + cde_elementwise_op=m_cdeop, + layout_d=_LAYOUT_WORD[ld], + elementwise_op=ew_op, + d_layout=d_layout_word, + ) + if c.name in seen: + continue + val = _cu.validate_kernel_config(c.to_ctypes_config()) + if not val.is_valid: + continue + seen.add(c.name) + configs.append(c) + + return configs \ No newline at end of file diff --git a/dispatcher/python/grouped_gemm_bquant_utils.py b/dispatcher/python/grouped_gemm_bquant_utils.py new file mode 100644 index 00000000000..be84bcc6218 --- /dev/null +++ b/dispatcher/python/grouped_gemm_bquant_utils.py @@ -0,0 +1,1214 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +GroupedGemm BQuant dispatcher utilities. + +Three-layer Python bridge for the dispatcher's BQuantGrouped GEMM path: + + BQuantKernelConfig — describes one kernel; .name is byte-exact with codegen KERNEL_NAME + BQuantDispatcherLib — thin ctypes wrapper around a compiled .so + BQuantGpuGemmRunner — high-level runner that accepts numpy arrays + +Build helpers (self-contained, do not import from gemm_utils.py): + setup_multiple_bquant_dispatchers(configs, ...) + codegen → hipcc → list of .so paths, all in parallel + +Usage (end-to-end): + configs = [BQuantKernelConfig(variant_key="fp8", layout="rcr", ...)] + so_paths = setup_multiple_bquant_dispatchers(configs, output_dir=Path("/tmp/bq")) + runner = BQuantGpuGemmRunner(so_paths[0]) + result = runner.run(A, B, BQ, BQuantGemmProblem(M=16, N=64, K=256)) +""" + +import ctypes +import json +import logging +import os +import shutil +import subprocess +import sys +import tempfile +from dataclasses import dataclass, field +from pathlib import Path +from typing import Dict, List, Optional, Tuple +import concurrent.futures + +log = logging.getLogger(__name__) + +# ============================================================================= +# Constants +# ============================================================================= + +_CODEGEN_SCRIPT = Path(__file__).parent.parent / "codegen" / "unified_grouped_gemm_bquant_codegen.py" +_CTYPES_LIB_SRC = Path(__file__).parent.parent / "bindings" / "ctypes" / "grouped_gemm_bquant_ctypes_lib.cpp" + +# Import the shared name-construction helper from codegen_common so both sides +# stay byte-exact without duplicating the logic. +_codegen_dir = str(Path(__file__).parent.parent / "codegen") +if _codegen_dir not in sys.path: + sys.path.insert(0, _codegen_dir) +from codegen_common import make_bquant_kernel_name # noqa: E402 + +_DEFAULT_HIPCC = "hipcc" +_DEFAULT_GFX_ARCH = "gfx950" + +# Flags that match the tile engine / dispatcher build flags for BQuant kernels +_HIPCC_BASE_FLAGS = [ + "-std=c++17", + "-O3", + "-fPIC", + "-shared", + "-DCK_TILE_SINGLE_KERNEL_INCLUDE", + "-w", # suppress warnings during generated-code compilation +] + + +# ============================================================================= +# BQuantKernelConfig — byte-exact naming with codegen +# ============================================================================= + + +@dataclass +class BQuantKernelConfig: + """ + Complete description of one BQuantGrouped GEMM kernel. + + The .name property produces the exact string that unified_grouped_gemm_bquant_codegen.py + emits as KERNEL_NAME, ensuring the Python side and compiled .so always agree. + """ + + variant_key: str # "fp8" or "bf8" + layout: str # "rcr" (A=RowMajor, B=ColMajor, C=RowMajor) + pipeline: str # "compv3" + epilogue: str # "cshuffle" + scheduler: str # "intrawave" + + tile_m: int + tile_n: int + tile_k: int + warp_m: int + warp_n: int + warp_k: int + warp_tile_m: int + warp_tile_n: int + warp_tile_k: int + + quant_group_m: int = 1 + quant_group_n: int = 1 + quant_group_k: int = 128 + + preshuffle_b: bool = False + preshuffle_bquant: bool = False + double_smem_buffer: bool = False + k_block_per_cu: int = 1 + + gfx_arch: str = _DEFAULT_GFX_ARCH + + @property + def name(self) -> str: + """Byte-exact match to codegen KERNEL_NAME (delegates to make_bquant_kernel_name).""" + return make_bquant_kernel_name( + variant_key=self.variant_key, + layout=self.layout, + pipeline=self.pipeline, + epilogue=self.epilogue, + scheduler=self.scheduler, + tile_m=self.tile_m, tile_n=self.tile_n, tile_k=self.tile_k, + warp_m=self.warp_m, warp_n=self.warp_n, warp_k=self.warp_k, + warp_tile_m=self.warp_tile_m, warp_tile_n=self.warp_tile_n, warp_tile_k=self.warp_tile_k, + quant_group_m=self.quant_group_m, + quant_group_n=self.quant_group_n, + quant_group_k=self.quant_group_k, + preshuffle_b=self.preshuffle_b, + preshuffle_bquant=self.preshuffle_bquant, + ) + + def to_codegen_config(self) -> dict: + """Produce the JSON config dict consumed by unified_grouped_gemm_bquant_codegen.py.""" + return { + "variant_keys": [self.variant_key], + "layouts": [self.layout], + "pipeline": self.pipeline, + "epilogue": self.epilogue, + "scheduler": self.scheduler, + "tile_configs": [{ + "tile_m": self.tile_m, + "tile_n": self.tile_n, + "tile_k": self.tile_k, + "warp_m": self.warp_m, + "warp_n": self.warp_n, + "warp_k": self.warp_k, + "warp_tile_m": self.warp_tile_m, + "warp_tile_n": self.warp_tile_n, + "warp_tile_k": self.warp_tile_k, + }], + "quant_groups": [{ + "quant_group_m": self.quant_group_m, + "quant_group_n": self.quant_group_n, + "quant_group_k": self.quant_group_k, + }], + "preshuffle_b": self.preshuffle_b, + "preshuffle_bquant": self.preshuffle_bquant, + "double_smem_buffer": self.double_smem_buffer, + "k_block_per_cu": self.k_block_per_cu, + } + + +# ============================================================================= +# BQuantGemmProblem +# ============================================================================= + + +@dataclass +class BQuantGemmProblem: + M: int + N: int + K: int + quant_group_m: int = 1 + quant_group_n: int = 1 + quant_group_k: int = 128 + k_batch: int = 1 + + @property + def QK_B(self) -> int: + """Number of K-groups: ceil(K / quant_group_k).""" + return (self.K + self.quant_group_k - 1) // self.quant_group_k + + @property + def QN_B(self) -> int: + """Number of N-groups: ceil(N / quant_group_n).""" + return (self.N + self.quant_group_n - 1) // self.quant_group_n + + +# ============================================================================= +# BQuantGemmResult +# ============================================================================= + + +@dataclass +class BQuantGemmResult: + C: object # numpy array + time_ms: float + kernel_name: str + + +# ============================================================================= +# BQuantDispatcherLib — thin ctypes wrapper +# ============================================================================= + + +class BQuantDispatcherLib: + """ + Loads a compiled bquant_gemm .so and wraps its C API. + + Expected .so exports: + int dispatcher_initialize() + int dispatcher_run_bquant_gemm(A, B, BQ, C, M, N, K, + stride_A, stride_B, stride_BQ, stride_C, + QK_B, QN_B, k_batch, *time_ms) + char* dispatcher_get_kernel_name() + int dispatcher_get_kernel_count() + void dispatcher_cleanup() + """ + + def __init__(self, so_path: Path): + self.so_path = Path(so_path) + if not self.so_path.exists(): + raise FileNotFoundError(f"BQuant .so not found: {self.so_path}") + self._lib = ctypes.CDLL(str(self.so_path)) + self._setup() + rc = self._lib.dispatcher_initialize() + if rc != 0: + raise RuntimeError(f"dispatcher_initialize() returned {rc}") + + def _setup(self): + lib = self._lib + + lib.dispatcher_initialize.restype = ctypes.c_int + lib.dispatcher_initialize.argtypes = [] + + lib.dispatcher_run_bquant_gemm.restype = ctypes.c_int + lib.dispatcher_run_bquant_gemm.argtypes = [ + ctypes.c_void_p, # A + ctypes.c_void_p, # B + ctypes.c_void_p, # BQ + ctypes.c_void_p, # C + ctypes.c_int64, # M + ctypes.c_int64, # N + ctypes.c_int64, # K + ctypes.c_int64, # stride_A + ctypes.c_int64, # stride_B + ctypes.c_int64, # stride_BQ + ctypes.c_int64, # stride_C + ctypes.c_int64, # QK_B + ctypes.c_int64, # QN_B + ctypes.c_int, # k_batch + ctypes.POINTER(ctypes.c_float), # time_ms + ] + + lib.dispatcher_get_kernel_name.restype = ctypes.c_char_p + lib.dispatcher_get_kernel_name.argtypes = [] + + lib.dispatcher_get_kernel_count.restype = ctypes.c_int + lib.dispatcher_get_kernel_count.argtypes = [] + + lib.dispatcher_cleanup.restype = None + lib.dispatcher_cleanup.argtypes = [] + + def run( + self, + A, + B, + BQ, + C, + M: int, + N: int, + K: int, + stride_A: int, + stride_B: int, + stride_BQ: int, + stride_C: int, + QK_B: int, + QN_B: int, + k_batch: int = 1, + ) -> Tuple[int, float]: + """ + Call dispatcher_run_bquant_gemm with ctypes-wrapped pointers. + + A, B, BQ, C must be numpy arrays (C-contiguous, packed). + B should be a packed (K, N) C-contiguous array — the kernel interprets + it as column-major via stride_B=K, not via numpy's Fortran-order flag. + C must be the array that will receive output; a non-contiguous C would + produce a temporary copy that is not returned to the caller. + Returns (status, time_ms). + """ + import numpy as np + + A = np.ascontiguousarray(A) + # Kernel BLayout is ColumnMajor (rcr): B[k,n] lives at offset n*K+k. + # Supply column-major bytes for 2-D B; ascontiguousarray would force + # row-major and silently transpose. Packed 1-D B (fp4) stays as-is. + B = np.asfortranarray(B) if B.ndim == 2 else np.ascontiguousarray(B) + BQ = np.ascontiguousarray(BQ) + C = np.ascontiguousarray(C) + + time_ms = ctypes.c_float(0.0) + + rc = self._lib.dispatcher_run_bquant_gemm( + A.ctypes.data_as(ctypes.c_void_p), + B.ctypes.data_as(ctypes.c_void_p), + BQ.ctypes.data_as(ctypes.c_void_p), + C.ctypes.data_as(ctypes.c_void_p), + ctypes.c_int64(M), + ctypes.c_int64(N), + ctypes.c_int64(K), + ctypes.c_int64(stride_A), + ctypes.c_int64(stride_B), + ctypes.c_int64(stride_BQ), + ctypes.c_int64(stride_C), + ctypes.c_int64(QK_B), + ctypes.c_int64(QN_B), + ctypes.c_int(k_batch), + ctypes.byref(time_ms), + ) + return rc, time_ms.value + + def get_kernel_name(self) -> str: + raw = self._lib.dispatcher_get_kernel_name() + return raw.decode("utf-8") if raw else "" + + def get_kernel_count(self) -> int: + return self._lib.dispatcher_get_kernel_count() + + def cleanup(self): + self._lib.dispatcher_cleanup() + + def __del__(self): + try: + self._lib.dispatcher_cleanup() + except Exception: + pass + + +# ============================================================================= +# BQuantGpuGemmRunner — high-level runner +# ============================================================================= + + +class BQuantGpuGemmRunner: + """ + High-level runner that loads a BQuant .so and executes GEMM on the GPU. + + Accepts numpy arrays for A, B, BQ; allocates C; returns BQuantGemmResult. + """ + + def __init__(self, so_path: Path): + self._lib = BQuantDispatcherLib(so_path) + + @property + def kernel_name(self) -> str: + return self._lib.get_kernel_name() + + def run(self, A, B, BQ, problem: BQuantGemmProblem, c_dtype=None) -> BQuantGemmResult: + """ + Run BQuantGrouped GEMM. + + A shape: (M, K) dtype: fp8/bf8 + B shape: (K, N) col-major dtype: fp8/bf8 + BQ shape: (QK_B, QN_B) dtype: float/fp8 + c_dtype numpy dtype for the output C buffer. Defaults to np.float16 + (correct for fp8/bf8/fp8i4/bf8i4 variants). Pass np.bfloat16 + for MX variants (mx_bf16bf16, mx_bf16bf8, mx_bf16fp4) whose + CDataType is bf16. + Returns BQuantGemmResult with C shape (M, N). + """ + import numpy as np + + M, N, K = problem.M, problem.N, problem.K + QK_B = problem.QK_B + QN_B = problem.QN_B + + if c_dtype is None: + c_dtype = np.float16 + + # Output buffer — dtype must match the compiled kernel's CDataType. + C = np.zeros((M, N), dtype=c_dtype) + + # Strides (in elements, row-major for A and C; col-major for B means stride = K) + stride_A = K # A is row-major [M, K] + stride_B = K # B is col-major [K, N] → leading dim = K + stride_BQ = QN_B + stride_C = N # C is row-major [M, N] + + rc, time_ms = self._lib.run( + A=A, B=B, BQ=BQ, C=C, + M=M, N=N, K=K, + stride_A=stride_A, + stride_B=stride_B, + stride_BQ=stride_BQ, + stride_C=stride_C, + QK_B=QK_B, + QN_B=QN_B, + k_batch=problem.k_batch, + ) + + if rc != 0: + raise RuntimeError( + f"dispatcher_run_bquant_gemm failed with code {rc} " + f"for kernel {self.kernel_name}" + ) + + # permute_n epilogue writes C with N-columns riffled into r groups + # (r = tile_n / warp_tile_n / warp_n). Undo it so the caller gets logical C. + _name = self.kernel_name + if 'permute_n' in _name: + import re as _re + _m = _re.search(r'_(\d+)x(\d+)x(\d+)_(\d+)x(\d+)x(\d+)_(\d+)x(\d+)x(\d+)_', _name) + if _m: + _tile_n = int(_m.group(2)); _warp_n = int(_m.group(5)); _wt_n = int(_m.group(8)) + _r = _tile_n // _wt_n // _warp_n + if _r > 1 and (N % _r) == 0: + _half = N // _r + _logical = [(c % _r) * _half + (c // _r) for c in range(N)] + _Cp = np.empty_like(C) + _Cp[:, _logical] = C + C = _Cp + return BQuantGemmResult(C=C, time_ms=time_ms, kernel_name=self.kernel_name) + + +# ============================================================================= +# Subprocess helpers (self-contained, do not call ctypes_utils.py) +# ============================================================================= + + +def _detect_gpu_arch() -> str: + """Detect current GPU arch via rocm_agent_enumerator. Falls back to gfx950.""" + try: + result = subprocess.run( + ["rocm_agent_enumerator"], + capture_output=True, text=True, timeout=10, + ) + for line in result.stdout.splitlines(): + line = line.strip() + if line.startswith("gfx") and line != "gfx000": + return line + except Exception: + pass + return _DEFAULT_GFX_ARCH + + +def _get_ck_include_dir() -> Optional[Path]: + """Attempt to locate the CK include directory relative to this file.""" + # Walk up from dispatcher/python/ to find project root + here = Path(__file__).resolve().parent + for parent in [here.parent.parent, here.parent.parent.parent]: + candidate = parent / "include" + if (candidate / "ck_tile").is_dir(): + return candidate + return None + + +def _generate_bquant_kernel( + config: BQuantKernelConfig, + output_dir: Path, +) -> Optional[Path]: + """ + Run unified_grouped_gemm_bquant_codegen.py for one config; return the .hpp path or None. + """ + config_dict = config.to_codegen_config() + config_json = json.dumps(config_dict) + + cmd = [ + sys.executable, + str(_CODEGEN_SCRIPT), + "--output-dir", str(output_dir), + "--config-json", config_json, + ] + + try: + result = subprocess.run( + cmd, + capture_output=True, text=True, timeout=120, + ) + if result.returncode != 0: + log.error("Codegen failed for %s:\n%s", config.name, result.stderr) + return None + except subprocess.TimeoutExpired: + log.error("Codegen timed out for %s", config.name) + return None + + hpp = output_dir / f"{config.name}.hpp" + if not hpp.exists(): + log.error("Codegen succeeded but %s not found", hpp) + return None + + return hpp + + +def _get_dispatcher_static_lib() -> Optional[Path]: + """Return libck_tile_dispatcher.a from the CMake build directory, or None.""" + dispatcher_root = _CTYPES_LIB_SRC.parent.parent.parent + static_lib = dispatcher_root / "build" / "libck_tile_dispatcher.a" + return static_lib if static_lib.exists() else None + + +def _compile_bquant_kernel( + hpp_path: Path, + so_path: Path, + gfx_arch: str, + hipcc: str = _DEFAULT_HIPCC, + extra_include_dirs: Optional[List[str]] = None, +) -> bool: + """ + Compile a generated .hpp into a .so via hipcc (compile then link). + + Two-step build: + 1. Compile to a .o object file. + 2. Link the .o into a shared .so (no dispatcher static lib needed; + the BQuant ctypes lib does not use the registry or dispatcher). + + Returns True on success. + """ + ck_include = _get_ck_include_dir() + static_lib = _get_dispatcher_static_lib() + + # -- Step 1: compile to object file -------------------------------------- + obj_path = so_path.with_suffix(".o") + + # Arch-specific defines: gfx950 uses OCP fp8 (not FNUZ) and native MX support. + # These mirror the CMakeLists.txt definitions that are normally injected by CMake + # but are absent in the standalone hipcc build path. + arch_defines = [] + if "gfx12" in gfx_arch or "gfx950" in gfx_arch: + arch_defines += ["-DCK_USE_OCP_FP8", "-DCK_TILE_USE_OCP_FP8"] + if "gfx950" in gfx_arch: + arch_defines += ["-DCK_USE_NATIVE_MX_SUPPORT", "-DCK_GFX950_SUPPORT"] + + compile_cmd = [hipcc, "-c", "-fPIC", "-O3", "-std=c++17", + "-DCK_TILE_SINGLE_KERNEL_INCLUDE", "-w", + f"--offload-arch={gfx_arch}", + f"-DGFX_ARCH=\"{gfx_arch}\"", + *arch_defines, + "-include", str(hpp_path), + str(_CTYPES_LIB_SRC), + "-o", str(obj_path)] + + if ck_include: + compile_cmd += [f"-I{ck_include}"] + + # NOTE: dispatcher/include is intentionally excluded here. + # It pulls in generated_tile_backend.hpp which instantiates + # SelectedKernel::launch(GemmHostArgs&), conflicting with the BQuant + # kernel's launch(QuantGemmHostArgs&). The BQuant ctypes lib only needs + # the main CK include path (ck_tile/host/tensor_shuffle_utils.hpp lives there). + + if extra_include_dirs: + for d in extra_include_dirs: + compile_cmd += [f"-I{d}"] + + log.debug("Compiling %s:\n %s", so_path.name, " ".join(compile_cmd)) + + try: + result = subprocess.run( + compile_cmd, + capture_output=True, text=True, timeout=600, + ) + if result.returncode != 0: + log.error("Compile failed for %s:\n%s", so_path.name, result.stderr[-2000:]) + return False + except subprocess.TimeoutExpired: + log.error("Compile timed out for %s", so_path.name) + return False + + # -- Step 2: link into shared library ------------------------------------ + link_cmd = [hipcc, "-shared", "-fPIC", + f"--offload-arch={gfx_arch}", "--hip-link", + str(obj_path)] + + if static_lib: + link_cmd += [str(static_lib)] + + link_cmd += ["-o", str(so_path)] + + log.debug("Linking %s:\n %s", so_path.name, " ".join(link_cmd)) + + try: + result = subprocess.run( + link_cmd, + capture_output=True, text=True, timeout=120, + ) + if result.returncode != 0: + log.error("Link failed for %s:\n%s", so_path.name, result.stderr[-2000:]) + obj_path.unlink(missing_ok=True) + return False + except subprocess.TimeoutExpired: + log.error("Link timed out for %s", so_path.name) + obj_path.unlink(missing_ok=True) + return False + + obj_path.unlink(missing_ok=True) + return True + + +# ============================================================================= +# setup_multiple_bquant_dispatchers — build pipeline +# ============================================================================= + + +def setup_multiple_bquant_dispatchers( + configs: List[BQuantKernelConfig], + output_dir: Optional[Path] = None, + hipcc: str = _DEFAULT_HIPCC, + gfx_arch: Optional[str] = None, + extra_include_dirs: Optional[List[str]] = None, + parallel: bool = True, + max_workers: Optional[int] = None, +) -> List[Optional[Path]]: + """ + For each BQuantKernelConfig: codegen → hipcc compile → .so path. + + Returns a list parallel to `configs` — each entry is the Path to the + compiled .so, or None if that config failed. + + No GPU is required to call this function. + """ + if not configs: + return [] + + arch = gfx_arch or _detect_gpu_arch() + base_dir = output_dir or Path(tempfile.mkdtemp(prefix="bquant_dispatcher_")) + base_dir.mkdir(parents=True, exist_ok=True) + + headers_dir = base_dir / "generated_kernels" + so_dir = base_dir / "libs" + headers_dir.mkdir(exist_ok=True) + so_dir.mkdir(exist_ok=True) + + log.info( + "Building %d BQuant kernel(s) for %s into %s", + len(configs), arch, base_dir, + ) + + # Deduplicate by name so we don't build the same kernel twice + seen: Dict[str, int] = {} # name → index of first occurrence + deduped: List[Tuple[int, BQuantKernelConfig]] = [] + for i, cfg in enumerate(configs): + if cfg.name not in seen: + seen[cfg.name] = i + deduped.append((i, cfg)) + + # results[i] = Path or None, aligned with input configs + results: List[Optional[Path]] = [None] * len(configs) + + def _build_one(idx: int, cfg: BQuantKernelConfig) -> Tuple[int, Optional[Path]]: + hpp = _generate_bquant_kernel(cfg, headers_dir) + if hpp is None: + return idx, None + + so = so_dir / f"lib{cfg.name}_{arch}.so" + if so.exists(): + log.info(" [cached] %s", so.name) + return idx, so + + ok = _compile_bquant_kernel( + hpp_path=hpp, + so_path=so, + gfx_arch=arch, + hipcc=hipcc, + extra_include_dirs=extra_include_dirs, + ) + return idx, so if ok else None + + if parallel and len(deduped) > 1: + workers = max_workers or min(len(deduped), os.cpu_count() or 4) + with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as ex: + futures = {ex.submit(_build_one, idx, cfg): (idx, cfg) for idx, cfg in deduped} + for fut in concurrent.futures.as_completed(futures): + try: + idx, so_path = fut.result() + results[idx] = so_path + if so_path: + log.info(" built %s", so_path.name) + else: + _, cfg = futures[fut] + log.error(" FAILED %s", cfg.name) + except Exception as e: + _, cfg = futures[fut] + log.error(" EXCEPTION for %s: %s", cfg.name, e) + else: + for idx, cfg in deduped: + _, so_path = _build_one(idx, cfg) + results[idx] = so_path + + # Fill in duplicates + for i, cfg in enumerate(configs): + if results[i] is None: + first_idx = seen.get(cfg.name) + if first_idx is not None and first_idx != i: + results[i] = results[first_idx] + + built = sum(1 for r in results if r is not None) + log.info("Built %d / %d BQuant kernels", built, len(configs)) + return results + + +# ============================================================================= +# Sweep expansion: JSON config → list of BQuantKernelConfig +# ============================================================================= + + +def expand_bquant_sweep( + config_path: str, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> List["BQuantKernelConfig"]: + """Expand a BQuant JSON sweep config into a list of BQuantKernelConfig objects. + + The JSON format mirrors unified_grouped_gemm_bquant_codegen.py's _build_specs + so the same config files work for both codegen and Python utils. Every valid + (variant, layout, tile, quant_group) combination produces one BQuantKernelConfig; + duplicates (by .name) are collapsed. + + JSON schema: + variant_keys: list of dtype variants, e.g. ["fp8", "bf8"] + layouts: list of layout strings, e.g. ["rcr"] + pipeline: pipeline name, e.g. "compv3" + epilogue: epilogue name, e.g. "cshuffle" + scheduler: scheduler name, e.g. "intrawave" + tile_configs: list of {tile_m, tile_n, tile_k, warp_m, warp_n, warp_k, + warp_tile_m, warp_tile_n, warp_tile_k} + quant_groups: list of {quant_group_m, quant_group_n, quant_group_k} + pad_m/pad_n/pad_k: bool + block_size: int (default 256) + k_block_per_cu: int (default 1) + double_smem_buffer: bool (default false) + preshuffle_b: bool (default false) + preshuffle_bquant: bool (default false) + """ + import itertools + + with open(config_path) as f: + cfg = json.load(f) + + pipeline = cfg.get("pipeline", "compv3") + epilogue = cfg.get("epilogue", "cshuffle") + scheduler = cfg.get("scheduler", "intrawave") + pad_m = cfg.get("pad_m", False) + pad_n = cfg.get("pad_n", False) + pad_k = cfg.get("pad_k", True) + block_size = cfg.get("block_size", 256) + k_block_per_cu = cfg.get("k_block_per_cu", 1) + double_smem_buffer = cfg.get("double_smem_buffer", False) + preshuffle_b = cfg.get("preshuffle_b", False) + preshuffle_bquant = cfg.get("preshuffle_bquant", False) + + configs: List[BQuantKernelConfig] = [] + seen: set = set() + + for variant_key, layout, tile_dict, qg in itertools.product( + cfg.get("variant_keys", ["fp8"]), + cfg.get("layouts", ["rcr"]), + cfg.get("tile_configs", []), + cfg.get("quant_groups", [{"quant_group_m": 1, "quant_group_n": 1, "quant_group_k": 128}]), + ): + c = BQuantKernelConfig( + variant_key=variant_key, + layout=layout, + pipeline=pipeline, + epilogue=epilogue, + scheduler=scheduler, + tile_m=tile_dict["tile_m"], + tile_n=tile_dict["tile_n"], + tile_k=tile_dict["tile_k"], + warp_m=tile_dict["warp_m"], + warp_n=tile_dict["warp_n"], + warp_k=tile_dict["warp_k"], + warp_tile_m=tile_dict["warp_tile_m"], + warp_tile_n=tile_dict["warp_tile_n"], + warp_tile_k=tile_dict["warp_tile_k"], + quant_group_m=qg.get("quant_group_m", 1), + quant_group_n=qg.get("quant_group_n", 1), + quant_group_k=qg.get("quant_group_k", 128), + preshuffle_b=preshuffle_b, + preshuffle_bquant=preshuffle_bquant, + double_smem_buffer=double_smem_buffer, + k_block_per_cu=k_block_per_cu, + gfx_arch=gfx_arch, + ) + if c.name not in seen: + seen.add(c.name) + configs.append(c) + + return configs + + +# ============================================================================= +# Convenience: default fp8 config (matches GemmConfigQuantDecode) +# ============================================================================= + + +def default_fp8_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """Return the default fp8 BQuant config (tile = 16x64x256, warp = 1x4x1). + + WarpTileK=128: on gfx950 get_k_warp_tile() returns 128 + (is_8bit_float=true, M_Warp_Tile!=32 → K_warp=128). Using 16 causes zero output. + """ + return BQuantKernelConfig( + variant_key="fp8", + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=128, + quant_group_m=1, + quant_group_n=quant_group_n, + quant_group_k=quant_group_k, + gfx_arch=gfx_arch, + ) + + +def default_bf8_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """Return the default bf8 BQuant config (tile = 16x64x256, warp = 1x4x1). + + WarpTileK=128: on gfx950 get_k_warp_tile() returns 128. + """ + return BQuantKernelConfig( + variant_key="bf8", + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=128, + quant_group_m=1, + quant_group_n=quant_group_n, + quant_group_k=quant_group_k, + gfx_arch=gfx_arch, + ) + + +def default_fp8i4_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """Return the default fp8i4 BQuant config (A=fp8, B=pk_int4, Q=fp8; tile = 16x64x256).""" + return BQuantKernelConfig( + variant_key="fp8i4", + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, + quant_group_n=quant_group_n, + quant_group_k=quant_group_k, + gfx_arch=gfx_arch, + ) + + +def default_bf8i4_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """Return the default bf8i4 BQuant config (A=bf8, B=pk_int4, Q=bf8; tile = 16x64x256).""" + return BQuantKernelConfig( + variant_key="bf8i4", + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, + quant_group_n=quant_group_n, + quant_group_k=quant_group_k, + gfx_arch=gfx_arch, + ) + + +# ============================================================================= +# Phase 3a — preshuffle_b only (WPQuantBPipelineAgBgCrV2, prefill tile 128x128x128) +# +# Tile dims from GemmConfigPreshuffleB_BQuant_Prefill: +# M=128, N=128, K=128/sizeof(PrecType) +# Warp: 1x4x1, WarpTile: 16x16x K_warp +# K_warp from get_k_warp_tile on gfx950: +# fp8/bf8 (8-bit float): K_warp = 128 → tile_k = 128 +# pk_int4 (not 8b float): K_warp = 32 → tile_k = 128 (sizeof=0.5 → 128/0.5=256 packed) +# DoubleSmemBuffer=true, kBlockPerCu=2 +# ============================================================================= + + +def _preshuffleb_config( + variant_key: str, + warp_tile_k: int, + quant_group_k: int, + quant_group_n: int, + gfx_arch: str, +) -> BQuantKernelConfig: + return BQuantKernelConfig( + variant_key=variant_key, + layout="rcr", + pipeline="preshuffleb", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=128, tile_n=128, tile_k=128, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=warp_tile_k, + quant_group_m=1, + quant_group_n=quant_group_n, + quant_group_k=quant_group_k, + preshuffle_b=True, + preshuffle_bquant=False, + double_smem_buffer=True, + k_block_per_cu=2, + gfx_arch=gfx_arch, + ) + + +def default_fp8_preshuffleb_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """fp8 preshuffle_b prefill config (GemmConfigPreshuffleB_BQuant_Prefill).""" + return _preshuffleb_config("fp8", warp_tile_k=128, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +def default_bf8_preshuffleb_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """bf8 preshuffle_b prefill config (GemmConfigPreshuffleB_BQuant_Prefill).""" + return _preshuffleb_config("bf8", warp_tile_k=128, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +def default_fp8i4_preshuffleb_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """fp8i4 preshuffle_b prefill config (GemmConfigPreshuffleB_BQuant_Prefill, B=pk_int4). + + K_warp_tile=32: pk_int4 is not an 8-bit float type so get_k_warp_tile returns 32 on gfx950. + """ + return _preshuffleb_config("fp8i4", warp_tile_k=32, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +def default_bf8i4_preshuffleb_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """bf8i4 preshuffle_b prefill config (GemmConfigPreshuffleB_BQuant_Prefill, B=pk_int4). + + K_warp_tile=32: pk_int4 is not an 8-bit float type so get_k_warp_tile returns 32 on gfx950. + """ + return _preshuffleb_config("bf8i4", warp_tile_k=32, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +# ============================================================================= +# Phase 3b — preshuffle_bquant only (BQuantGemmPipelineAgBgCrCompV3, prefill tile 128x128x128) +# +# Tile dims from GemmConfigPreshuffleBQuantPrefill (inherits GemmConfigQuantPrefill): +# M=128, N=128, K=128, Warp: 1x4x1, WarpTile: 16x16xK_warp +# K_warp from get_k_warp_tile on gfx950: +# fp8/bf8: K_warp = 128 (is_8bit_float=true, M_Warp_Tile != 32) +# pk_int4: K_warp = 32 +# DoubleSmemBuffer=false (default), kBlockPerCu=1 (default) +# Extra quant group: 1x16x128 (not in 3a) +# ============================================================================= + + +def _preshufflequant_config( + variant_key: str, + warp_tile_k: int, + quant_group_k: int, + quant_group_n: int, + gfx_arch: str, +) -> BQuantKernelConfig: + return BQuantKernelConfig( + variant_key=variant_key, + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=128, tile_n=128, tile_k=128, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=warp_tile_k, + quant_group_m=1, + quant_group_n=quant_group_n, + quant_group_k=quant_group_k, + preshuffle_b=False, + preshuffle_bquant=True, + gfx_arch=gfx_arch, + ) + + +def default_fp8_preshufflequant_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """fp8 preshuffle_bquant prefill config (GemmConfigPreshuffleBQuantPrefill).""" + return _preshufflequant_config("fp8", warp_tile_k=128, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +def default_bf8_preshufflequant_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """bf8 preshuffle_bquant prefill config (GemmConfigPreshuffleBQuantPrefill).""" + return _preshufflequant_config("bf8", warp_tile_k=128, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +def default_fp8i4_preshufflequant_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """fp8i4 preshuffle_bquant prefill config.""" + return _preshufflequant_config("fp8i4", warp_tile_k=32, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +def default_bf8i4_preshufflequant_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """bf8i4 preshuffle_bquant prefill config.""" + return _preshufflequant_config("bf8i4", warp_tile_k=32, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +# ============================================================================= +# Phase 3c — preshuffle_b + preshuffle_bquant (WPQuantBPipelineAgBgCrV2, prefill tile) +# +# Tile dims from GemmConfigPreshuffleB_PreshuffleBQuant_Prefill +# (inherits GemmConfigPreshuffleB_BQuant_Prefill): identical tile/warp dims to 3a. +# PreshuffleB=true, BPreshuffleQuant=true, DoubleSmemBuffer=true, kBlockPerCu=2 +# ============================================================================= + + +def _preshuffleb_bquant_config( + variant_key: str, + warp_tile_k: int, + quant_group_k: int, + quant_group_n: int, + gfx_arch: str, +) -> BQuantKernelConfig: + return BQuantKernelConfig( + variant_key=variant_key, + layout="rcr", + pipeline="preshuffleb", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=128, tile_n=128, tile_k=128, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=warp_tile_k, + quant_group_m=1, + quant_group_n=quant_group_n, + quant_group_k=quant_group_k, + preshuffle_b=True, + preshuffle_bquant=True, + double_smem_buffer=True, + k_block_per_cu=2, + gfx_arch=gfx_arch, + ) + + +def default_fp8_preshuffleb_bquant_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """fp8 preshuffle_b+preshuffle_bquant config (GemmConfigPreshuffleB_PreshuffleBQuant_Prefill).""" + return _preshuffleb_bquant_config("fp8", warp_tile_k=128, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +def default_bf8_preshuffleb_bquant_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """bf8 preshuffle_b+preshuffle_bquant config.""" + return _preshuffleb_bquant_config("bf8", warp_tile_k=128, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +def default_fp8i4_preshuffleb_bquant_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """fp8i4 preshuffle_b+preshuffle_bquant config.""" + return _preshuffleb_bquant_config("fp8i4", warp_tile_k=32, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +def default_bf8i4_preshuffleb_bquant_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """bf8i4 preshuffle_b+preshuffle_bquant config.""" + return _preshuffleb_bquant_config("bf8i4", warp_tile_k=32, quant_group_k=quant_group_k, + quant_group_n=quant_group_n, gfx_arch=gfx_arch) + + +# ============================================================================= +# Phase 4 — MX microscale variants (A=bf16, Q=e8m0 block scale) +# +# Pipeline for all three: MicroscaleGemmPipelineAgBgCrCompV3 +# (QDataType=e8m0_t, PreshuffleB=false → microscale branch in BQuantPipeline selection) +# Base pipeline: BaseWeightPreshufflePipelineAGmemBGmemCRegV2 +# (BQuantGrouped, PreshuffleB=false, not AQuant/ABQuant → else branch) +# +# Tile dims: +# mx_bf16bf16: GemmConfigQuantPrefill → 128x128x128, warp 1x4x1, warp_tile_k=32 +# mx_bf16bf8: GemmConfigMixedPrecision → 128x128x128, warp 1x4x1, warp_tile_k=64 +# mx_bf16fp4: GemmConfigQuantPrefill → 128x128x128, warp 1x4x1, warp_tile_k=32 +# ============================================================================= + + +def default_mx_bf16bf16_config( + quant_group_k: int = 32, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """MX bf16+bf16 config (A=bf16, B=bf16, Q=e8m0; GemmConfigQuantPrefill). + + Default quant_group_k=32 matches the smallest MX block size for bf16+bf16. + """ + return BQuantKernelConfig( + variant_key="mx_bf16bf16", + layout="rcr", + pipeline="microscale", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=128, tile_n=128, tile_k=128, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=32, + quant_group_m=1, + quant_group_n=quant_group_n, + quant_group_k=quant_group_k, + gfx_arch=gfx_arch, + ) + + +def default_mx_bf16bf8_config( + quant_group_k: int = 128, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """MX bf16+bf8 config (A=bf16, B=bf8, Q=e8m0; GemmConfigMixedPrecision). + + warp_tile_k=64 is hardcoded in GemmConfigMixedPrecision (mixed-precision KPack=16). + """ + return BQuantKernelConfig( + variant_key="mx_bf16bf8", + layout="rcr", + pipeline="microscale", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=128, tile_n=128, tile_k=128, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=64, + quant_group_m=1, + quant_group_n=quant_group_n, + quant_group_k=quant_group_k, + gfx_arch=gfx_arch, + ) + + +def default_mx_bf16fp4_config( + quant_group_k: int = 32, + quant_group_n: int = 1, + gfx_arch: str = _DEFAULT_GFX_ARCH, +) -> BQuantKernelConfig: + """MX bf16+fp4 config (A=bf16, B=pk_fp4, Q=e8m0; GemmConfigQuantPrefill). + + Default quant_group_k=32 matches the smallest MX block size for fp4. + """ + return BQuantKernelConfig( + variant_key="mx_bf16fp4", + layout="rcr", + pipeline="microscale", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=128, tile_n=128, tile_k=128, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=32, + quant_group_m=1, + quant_group_n=quant_group_n, + quant_group_k=quant_group_k, + gfx_arch=gfx_arch, + ) diff --git a/dispatcher/python/mx_gemm_utils.py b/dispatcher/python/mx_gemm_utils.py new file mode 100644 index 00000000000..2090acf2a15 --- /dev/null +++ b/dispatcher/python/mx_gemm_utils.py @@ -0,0 +1,831 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +MX-GEMM dispatcher utilities (TileEngine -> Dispatcher bridge). + +Three-layer Python bridge for the dispatcher's microscaling-GEMM path +(fp4/fp8 A.B with per-32-K e8m0 block scales, gfx950/MI350 only): + + MxGemmKernelConfig -- describes one kernel; .name is byte-exact with the + codegen KERNEL_NAME (obtained by shelling the codegen + CLI with --list-name so utils and codegen never drift) + MxGemmDispatcherLib -- thin ctypes wrapper around a compiled .so + GpuMxGemmRunner -- high-level runner: generates quantized inputs, calls the + kernel, and provides a numpy microscaled reference + +Build helper (self-contained): + setup_multiple_mx_gemm_dispatchers(configs, ...) : codegen -> hipcc -> .so paths + +Data types (verified against ck_tile headers / example/ck_tile/42_mx_gemm): + fp8 : ck_tile::fp8_t == float8_e4m3_t (OCP e4m3, bias 7, on gfx950 device) + fp4 : ck_tile::pk_fp4_t == pk_float4_e2m1_t (two e2m1 values packed per byte; + low nibble = even-K element, high nibble = odd-K element) + C : ck_tile::fp16_t + scale: ck_tile::e8m0_t (biased exponent, byte e decodes to 2^(e-127); 127 == 1.0) +""" + +import concurrent.futures +import ctypes +import functools +import json +import logging +import os +import subprocess +import sys +import tempfile +from dataclasses import dataclass, field +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +import numpy as np + +log = logging.getLogger(__name__) + +_CODEGEN_SCRIPT = Path(__file__).parent.parent / "codegen" / "unified_mx_gemm_codegen.py" +_CTYPES_LIB_SRC = ( + Path(__file__).parent.parent / "bindings" / "ctypes" / "mx_gemm_ctypes_lib.cpp" +) +# ck root == the composablekernel dir (three levels up from dispatcher/python). +_CK_ROOT = Path(__file__).parent.parent.parent +_HIPCC = os.environ.get("CK_TILE_HIPCC", "/opt/rocm/bin/hipcc") + + +def _get_arch() -> str: + """Detect GPU arch via rocminfo and validate; raise on failure. Never defaults.""" + import subprocess + arch = "" + try: + out = subprocess.check_output(["rocminfo"], text=True, stderr=subprocess.DEVNULL) + for line in out.splitlines(): + if "Name:" in line and "gfx" in line: + arch = line.split()[-1].strip(); break + except Exception: + arch = "" + if not arch: + raise RuntimeError("Could not detect GPU architecture from rocminfo; refusing to default. Pass gfx_arch explicitly.") + # mx_gemm is gfx950-ONLY: the C++ bridge (mx_gemm_ctypes_lib.cpp) has a + # static_assert(GFX_ARCH == "gfx950") because it uses the gfx950-only + # preShuffleScaleBuffer_gfx950 host helper. Validating a broader set here + # would let a gfx942/gfx90a caller past detection only to fail later at + # build/runtime with a less actionable error, so restrict it to gfx950. + _supported = ("gfx950",) + if arch not in _supported: + raise ValueError( + f"mx_gemm is gfx950-only; detected {arch!r} is not supported " + f"(supported: {list(_supported)})" + ) + return arch + +# MX GEMM scales every 32 K-elements with one e8m0 byte. +SCALE_BLOCK = 32 + +# e8m0 byte for scale == 1.0 (2^(127-127)). +E8M0_ONE = 127 + +# ============================================================================= +# fp4 (e2m1) exact value grid, byte codes match pk_fp4 e2m1_to_fp32_table. +# index -> value ; index is the 4-bit e2m1 code. +# ============================================================================= +_FP4_E2M1_VALUES = np.array( + [0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, + -0.0, -0.5, -1.0, -1.5, -2.0, -3.0, -4.0, -6.0], + dtype=np.float32, +) +# value -> 4-bit code (skip -0.0; +0.0 code 0 covers zero). +_FP4_VALUE_TO_CODE = { + 0.0: 0, 0.5: 1, 1.0: 2, 1.5: 3, 2.0: 4, 3.0: 5, 4.0: 6, 6.0: 7, + -0.5: 9, -1.0: 10, -1.5: 11, -2.0: 12, -3.0: 13, -4.0: 14, -6.0: 15, +} + +# ============================================================================= +# fp8 (e4m3, OCP) raw-byte codec for the exact grid we test on. +# +# PRECONDITION (hard): the byte codes below are OCP e4m3 (bias 7). They are ONLY +# a valid reference for a kernel compiled with CK_TILE_USE_OCP_FP8 == 1. This is +# the gfx950 default (see include/ck_tile/core/config.hpp: OCP is selected for +# __gfx950__ / __gfx12__ and the bridge compiles the lib with +# --offload-arch=gfx950 without overriding the flag). On any arch where CK +# defaults to (or is built for) FNUZ e4m3 (bias 8), the DEVICE bytes for the same +# float value differ, so this numpy reference would SILENTLY disagree with the +# kernel. Callers that target a non-OCP arch must not use this codec. +# +# The grid values are exactly representable in BOTH OCP and FNUZ, but their +# RAW BYTES are not the same between the two formats, which is why the codec is +# OCP-specific. Bytes verified against pk_fp4 e2m1_to_fp8_table (OCP branch) + +# hand-derived grid entries (sign|exp4|mant3, bias 7). +# ============================================================================= +_FP8_OCP_VALUE_TO_BYTE = { + 0.0: 0x00, 0.5: 0x30, 1.0: 0x38, 1.5: 0x3C, 2.0: 0x40, 2.5: 0x42, + 3.0: 0x44, 4.0: 0x48, 6.0: 0x4C, + -0.5: 0xB0, -1.0: 0xB8, -1.5: 0xBC, -2.0: 0xC0, -2.5: 0xC2, + -3.0: 0xC4, -4.0: 0xC8, -6.0: 0xCC, +} +_FP8_OCP_BYTE_TO_VALUE = {b: v for v, b in _FP8_OCP_VALUE_TO_BYTE.items()} +# 256-entry byte -> value LUT for vectorized dequantize_fp8. Untested bytes stay +# NaN (they cannot come from quantize_fp8, so a NaN result flags a foreign byte). +_FP8_OCP_BYTE_LUT = np.full(256, np.nan, dtype=np.float32) +for _b, _v in _FP8_OCP_BYTE_TO_VALUE.items(): + _FP8_OCP_BYTE_LUT[_b] = np.float32(_v) + + +def fp8_ocp_is_default_for_arch(arch: str) -> bool: + """True iff CK_TILE_USE_OCP_FP8 defaults to 1 for `arch`. + + Mirrors include/ck_tile/core/config.hpp: OCP e4m3 is the device default only + for gfx950 and gfx12; every other arch defaults to FNUZ e4m3. The bridge + compiles the mx_gemm lib without an explicit -DCK_TILE_USE_OCP_FP8, so the + effective fp8 format is exactly this arch default. Use this to guard the fp8 + numpy reference (see assert_fp8_ocp_supported / quantize_fp8). + """ + a = (arch or "").lower() + return a.startswith("gfx950") or a.startswith("gfx12") + + +def assert_fp8_ocp_supported(arch: Optional[str] = None) -> None: + """Fail loudly if the fp8 OCP codec would silently disagree with the device. + + The fp8 quantize/dequantize helpers emit/decode OCP e4m3 bytes; that is only + correct when the kernel is compiled with CK_TILE_USE_OCP_FP8 == 1 (see the + codec precondition above). Raise instead of producing bytes that mismatch a + FNUZ-built kernel. + """ + arch = arch or _get_arch() + if not fp8_ocp_is_default_for_arch(arch): + raise ValueError( + f"fp8 mx_gemm reference is OCP e4m3 only, but arch '{arch}' defaults to " + "FNUZ e4m3 (CK_TILE_USE_OCP_FP8 == 0). The bridge lib is compiled without " + "an explicit -DCK_TILE_USE_OCP_FP8, so its device fp8 bytes would not match " + "this numpy reference. OCP fp8 is supported for gfx950/gfx12 only." + ) + + +def e8m0_to_float(byte) -> np.ndarray: + """Decode e8m0 bytes to float: 2^(e-127); e==255 is NaN.""" + b = np.asarray(byte, dtype=np.int32) + out = np.exp2((b - 127).astype(np.float32)) + out = np.where(b == 255, np.nan, out) + return out.astype(np.float32) + + +def float_to_e8m0(scale) -> np.ndarray: + """Encode a strictly-positive power-of-two float scale to an e8m0 byte. + + The e8m0 format only encodes 2^(e-127) for e in [0, 254] (255 == NaN), so + the contract is a positive, finite input. A non-positive or non-finite value + is a caller bug (e.g. a zeroed/garbage scale); fail loudly rather than + silently substituting 1.0, which would emit a wrong scale byte. + """ + s = np.asarray(scale, dtype=np.float32) + if not np.all(np.isfinite(s)) or np.any(s <= 0.0): + raise ValueError( + "float_to_e8m0 requires strictly positive, finite scales " + "(power-of-two); got a non-positive or non-finite value" + ) + e = np.rint(np.log2(s)).astype(np.int32) + 127 + e = np.clip(e, 0, 254).astype(np.uint8) + return e + + +# ============================================================================= +# Config +# ============================================================================= + + +@dataclass +class MxGemmKernelConfig: + datatype: str = "fp8" # fp8 | fp4 + layout: str = "rcr" # a/b/c ; only rcr supported by mx_gemm + gpu_target: Optional[str] = None + pipeline: str = "comp_async" + epilogue: str = "cshuffle" + scheduler: str = "intrawave" + pad_m: bool = False + pad_n: bool = False + pad_k: bool = False + persistent: bool = False + + tile_m: int = 128 + tile_n: int = 128 + tile_k: int = 128 + warp_m: int = 2 + warp_n: int = 2 + warp_k: int = 1 + warp_tile_m: int = 16 + warp_tile_n: int = 16 + warp_tile_k: int = 128 + + k_block_per_cu: int = 1 + + # cached name so we do not re-shell the codegen repeatedly. + _name_cache: Optional[str] = field(default=None, repr=False, compare=False) + + def to_codegen_config(self) -> dict: + return { + "datatype": self.datatype, + "layout": self.layout, + "gpu_target": self.gpu_target or _get_arch(), + "pipeline": self.pipeline, + "epilogue": self.epilogue, + "scheduler": self.scheduler, + "pad_m": self.pad_m, + "pad_n": self.pad_n, + "pad_k": self.pad_k, + "persistent": self.persistent, + "tile_config": { + "tile_m": self.tile_m, "tile_n": self.tile_n, "tile_k": self.tile_k, + "warp_m": self.warp_m, "warp_n": self.warp_n, "warp_k": self.warp_k, + "warp_tile_m": self.warp_tile_m, "warp_tile_n": self.warp_tile_n, + "warp_tile_k": self.warp_tile_k, + }, + "k_block_per_cu": self.k_block_per_cu, + } + + @property + def name(self) -> str: + """Byte-exact kernel name from the codegen CLI (--list-name). + + The codegen owns the canonical name format; we never reconstruct it here + to avoid drift. Falls back to a locally computed name only if the codegen + script is not yet present (so utils stays import/unit testable before the + codegen component lands). + """ + if self._name_cache is not None: + return self._name_cache + if _CODEGEN_SCRIPT.exists(): + try: + r = subprocess.run( + [sys.executable, str(_CODEGEN_SCRIPT), + "--output-dir", tempfile.gettempdir(), + "--config-json", json.dumps(self.to_codegen_config()), + "--list-name"], + capture_output=True, text=True, timeout=120, + ) + if r.returncode == 0 and r.stdout.strip(): + self._name_cache = r.stdout.strip().splitlines()[-1].strip() + return self._name_cache + log.warning("codegen --list-name failed for %s:\n%s", + self._fallback_name(), r.stderr[-800:]) + except Exception as exc: # noqa: BLE001 + log.warning("codegen --list-name error: %s", exc) + self._name_cache = self._fallback_name() + return self._name_cache + + def _fallback_name(self) -> str: + """Local reconstruction mirroring the documented codegen name format. + + Format (per contract): + mx_gemm_{dtype}_{layout}_comp_async_cshuffle_intrawave_ + {PadM}_{PadN}_{PadK}[_{Persistent}]_ + {tileM}x{tileN}x{tileK}_{warpM}x{warpN}x{warpK}_{wtM}x{wtN}x{wtK} + Only used when the codegen script is absent (never at real build time). + """ + parts = [ + "mx_gemm", self.datatype, self.layout, + self.pipeline, self.epilogue, self.scheduler, + str(self.pad_m), str(self.pad_n), str(self.pad_k), + ] + if self.persistent: + parts.append(str(self.persistent)) + parts.append(f"{self.tile_m}x{self.tile_n}x{self.tile_k}") + parts.append(f"{self.warp_m}x{self.warp_n}x{self.warp_k}") + parts.append(f"{self.warp_tile_m}x{self.warp_tile_n}x{self.warp_tile_k}") + return "_".join(parts) + + def is_valid(self) -> bool: + if self.layout != "rcr": + return False + if self.datatype not in ("fp8", "fp4"): + return False + if not ( + self.tile_m % (self.warp_m * self.warp_tile_m) == 0 + and self.tile_n % (self.warp_n * self.warp_tile_n) == 0 + and self.tile_k % (self.warp_k * self.warp_tile_k) == 0 + ): + return False + # MX XDL uses 16x16x128 warp tiles on gfx950. + return (self.warp_tile_m, self.warp_tile_n, self.warp_tile_k) == (16, 16, 128) + + +# ============================================================================= +# Problem / result +# ============================================================================= + + +@dataclass +class MxGemmProblem: + M: int + N: int + K: int + k_batch: int = 1 + + def __post_init__(self): + if self.K % SCALE_BLOCK != 0: + raise ValueError(f"MX GEMM requires K % {SCALE_BLOCK} == 0, got K={self.K}") + + @property + def scale_k(self) -> int: + return self.K // SCALE_BLOCK + + @property + def flops(self) -> int: + return 2 * self.M * self.N * self.K + + +@dataclass +class MxGemmResult: + C: object + time_ms: float + kernel_name: str + + +# ============================================================================= +# ctypes wrapper +# ============================================================================= + + +class MxGemmDispatcherLib: + def __init__(self, so_path: Path, dtype: Optional[str] = None, arch: Optional[str] = None): + self.so_path = Path(so_path) + if not self.so_path.exists(): + raise FileNotFoundError(f"mx_gemm .so not found: {self.so_path}") + self._lib = ctypes.CDLL(str(self.so_path)) + self._dtype = dtype + self._arch = arch + self._setup() + # Contract exposes both dispatcher_initialize() and dispatcher_init(). + init = getattr(self._lib, "dispatcher_initialize", None) + if init is None: + init = self._lib.dispatcher_init + if init() != 0: + raise RuntimeError("dispatcher_initialize failed") + + def _setup(self): + lib = self._lib + for fn in ("dispatcher_initialize", "dispatcher_init"): + f = getattr(lib, fn, None) + if f is not None: + f.restype = ctypes.c_int + lib.dispatcher_get_kernel_name.restype = ctypes.c_char_p + if hasattr(lib, "dispatcher_get_kernel_count"): + lib.dispatcher_get_kernel_count.restype = ctypes.c_int + lib.dispatcher_cleanup.restype = None + lib.dispatcher_run_mx_gemm.restype = ctypes.c_int + lib.dispatcher_run_mx_gemm.argtypes = [ + ctypes.c_void_p, # A + ctypes.c_void_p, # B + ctypes.c_void_p, # C + ctypes.POINTER(ctypes.c_uint8), # scale_a + ctypes.POINTER(ctypes.c_uint8), # scale_b + ctypes.c_int, # M + ctypes.c_int, # N + ctypes.c_int, # K + ctypes.c_int, # k_batch + ctypes.POINTER(ctypes.c_float), # time_ms + ] + + def kernel_name(self) -> str: + raw = self._lib.dispatcher_get_kernel_name() + return raw.decode() if raw else "" + + def kernel_count(self) -> int: + if hasattr(self._lib, "dispatcher_get_kernel_count"): + return int(self._lib.dispatcher_get_kernel_count()) + return 1 + + def run(self, A, B, C, scale_a, scale_b, prob: MxGemmProblem) -> float: + # Guard: fp8 OCP bytes only match the device on gfx950/gfx12. If the lib + # was constructed with dtype="fp8", fail loudly now rather than silently + # diverging from the numpy reference on an FNUZ arch. + if self._dtype == "fp8": + assert_fp8_ocp_supported(self._arch or _get_arch()) + A = np.ascontiguousarray(A) + B = np.ascontiguousarray(B) + # C is the OUTPUT buffer: the kernel writes results into it in place via a + # raw pointer. ascontiguousarray() would silently redirect the write into a + # throwaway copy and leave the caller's array unchanged -- a surprising bug + # for an output API. Require a contiguous, writeable ndarray instead. + if not isinstance(C, np.ndarray): + raise TypeError(f"C output must be a numpy.ndarray, got {type(C).__name__}") + if not C.flags["C_CONTIGUOUS"]: + raise ValueError("C output must be C-contiguous (results are written in place)") + if not C.flags["WRITEABLE"]: + raise ValueError("C output must be writeable (results are written in place)") + sa = np.ascontiguousarray(scale_a, dtype=np.uint8) + sb = np.ascontiguousarray(scale_b, dtype=np.uint8) + tms = ctypes.c_float(0.0) + rc = self._lib.dispatcher_run_mx_gemm( + A.ctypes.data_as(ctypes.c_void_p), + B.ctypes.data_as(ctypes.c_void_p), + C.ctypes.data_as(ctypes.c_void_p), + sa.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8)), + sb.ctypes.data_as(ctypes.POINTER(ctypes.c_uint8)), + int(prob.M), int(prob.N), int(prob.K), int(prob.k_batch), + ctypes.byref(tms), + ) + if rc != 0: + raise RuntimeError(f"dispatcher_run_mx_gemm rc={rc} " + f"({'unsupported' if rc == -2 else 'error'})") + return tms.value + + def cleanup(self): + try: + self._lib.dispatcher_cleanup() + except Exception: # noqa: BLE001 + pass + + def __del__(self): + self.cleanup() + + +# ============================================================================= +# Quantization helpers (host-side; produce the exact bytes the kernel expects) +# ============================================================================= + + +# Tolerance for on-grid membership in _map_grid_to_bytes. The quantization grid +# entries are all exactly representable in float32 (0, +/-0.5, +/-1.0, ...), so +# grid-exact inputs match to the bit; this epsilon only absorbs the last few ULPs +# of float-repr noise (e.g. a value stored via float64 -> float32). Any input +# farther than this from the nearest grid point is a genuine off-grid value and +# is rejected. Values like 0.5004 (0.0004 off the 0.5 grid point) exceed this and +# now raise, matching the documented "rejects off-grid values" contract. +_GRID_MATCH_EPS = np.float32(1e-4) + + +def _map_grid_to_bytes(vals: np.ndarray, value_to_byte: dict, grid_name: str) -> np.ndarray: + """Vectorized exact-grid float -> byte code lookup (uint8, flattened). + + The inputs are drawn from a small fixed grid (see make_inputs), so instead of + a per-element Python loop -- which dominates runtime for realistic M*K -- we + snap each input to the nearest grid point via a single searchsorted and index + a sorted LUT. An input is accepted only if it lies within _GRID_MATCH_EPS + (1e-4) of that nearest grid point; anything farther off (e.g. 0.5004) is a + caller contract violation and raises (mirrors the old dict-KeyError) rather + than silently snapping to a neighbour. + """ + keys = np.array(sorted(value_to_byte), dtype=np.float32) + byts = np.array([value_to_byte[float(k)] for k in keys], dtype=np.uint8) + + v = np.asarray(vals, dtype=np.float32) + np.float32(0.0) # collapse -0.0 -> +0.0 + flat = v.reshape(-1) + + # Nearest grid key for each value: searchsorted gives the insertion point; + # the closer of the two straddling keys is the nearest grid point. + pos = np.clip(np.searchsorted(keys, flat), 1, keys.size - 1) + left = keys[pos - 1] + right = keys[pos] + nearest = np.where(np.abs(flat - left) <= np.abs(flat - right), left, right) + + if not np.all(np.abs(flat - nearest) <= _GRID_MATCH_EPS): + off = np.abs(flat - nearest) > _GRID_MATCH_EPS + bad = flat[off] + raise KeyError( + f"{grid_name}: value(s) not on the exact quantization grid " + f"(tolerance {float(_GRID_MATCH_EPS):g}): {np.unique(bad)[:8].tolist()}" + ) + idx = np.searchsorted(keys, nearest) + return byts[idx] + + +def quantize_fp8(vals: np.ndarray) -> np.ndarray: + """Grid float values -> raw OCP e4m3 bytes (uint8), one per element. + + Values MUST come from the exact e4m3 grid (see _FP8_OCP_VALUE_TO_BYTE) so the + mapping is lossless; that keeps the numpy reference unambiguous. + + PRECONDITION: OCP e4m3 only. These bytes match the device only for a kernel + compiled with CK_TILE_USE_OCP_FP8 == 1 (gfx950/gfx12 default). See the codec + comment above and assert_fp8_ocp_supported(); GpuMxGemmRunner enforces this. + """ + return _map_grid_to_bytes(vals, _FP8_OCP_VALUE_TO_BYTE, "fp8 e4m3").reshape(vals.shape) + + +def dequantize_fp8(bytes_arr: np.ndarray) -> np.ndarray: + """Raw OCP e4m3 bytes (uint8) -> float grid values, preserving shape. + + Vectorized LUT-gather (consistent with dequantize_fp4_packed) instead of a + per-element Python loop, so this stays fast if ever applied to large buffers. + Bytes outside the tested grid map to NaN (they cannot appear from quantize_fp8, + which only emits grid codes, so a NaN here flags a corrupt/foreign buffer). + """ + b = np.asarray(bytes_arr, dtype=np.uint8) + return _FP8_OCP_BYTE_LUT[b] + + +def quantize_fp4_packed(vals: np.ndarray) -> np.ndarray: + """[M,K] grid floats -> packed pk_fp4 bytes [M,K//2]. + + Low nibble holds the even-K element, high nibble the odd-K element, matching + pk_fp4 _pack(x0,x1) = (x1<<4)|(x0&0xF) and the reference unpack<0>=lo. + + Returns the physically-packed pk_fp4 buffer ([M, K//2] bytes, one byte == two + fp4). mx_gemm_ctypes_lib sizes the A/B device buffer via + HostTensor::get_element_space_size_in_bytes(), which divides the logical + element count by numeric_traits::PackedSize==2, so this packed layout + is exactly what it expects (fp8 with PackedSize==1 is the 1 byte/element case). + """ + M, K = vals.shape + assert K % 2 == 0, "fp4 packs two K elements per byte" + codes = _map_grid_to_bytes(vals, _FP4_VALUE_TO_CODE, "fp4 e2m1").reshape(M, K) + lo = codes[:, 0::2] + hi = codes[:, 1::2] + return ((hi << 4) | (lo & 0x0F)).astype(np.uint8) + + +def dequantize_fp4_packed(packed: np.ndarray, K: int) -> np.ndarray: + """Packed pk_fp4 bytes [M,K//2] -> [M,K] float grid values.""" + p = np.asarray(packed, dtype=np.uint8) + M = p.shape[0] + lo = (p & 0x0F).astype(np.int32) + hi = ((p >> 4) & 0x0F).astype(np.int32) + out = np.empty((M, K), dtype=np.float32) + out[:, 0::2] = _FP4_E2M1_VALUES[lo] + out[:, 1::2] = _FP4_E2M1_VALUES[hi] + return out + + +# ============================================================================= +# Numpy microscaled reference +# ============================================================================= + + +def mx_gemm_reference(A_deq, B_deq, scale_a_byte, scale_b_byte, prob: MxGemmProblem): + """C[m,n] = sum_kb sa[m,kb]*sb[n,kb] * sum_{j in block} A[m,kb*32+j]*B[kb*32+j,n]. + + A_deq: [M,K] dequantized floats (logical, unscaled A values). + B_deq: [K,N] dequantized floats (logical, unscaled B values). + scale_a_byte: e8m0 bytes [M, K/32] ; scale_b_byte: e8m0 bytes [N, K/32]. + Accumulated in fp32, returned as fp16 (kernel output dtype). + """ + M, N, K = prob.M, prob.N, prob.K + nkb = prob.scale_k + A = np.asarray(A_deq, dtype=np.float32).reshape(M, K) + B = np.asarray(B_deq, dtype=np.float32).reshape(K, N) + sa = e8m0_to_float(scale_a_byte).reshape(M, nkb) # [M, K/32] + sb = e8m0_to_float(scale_b_byte).reshape(N, nkb) # [N, K/32] + + # Scale A per (m, K-block) and B per (n, K-block). Expand block scales to K. + sa_k = np.repeat(sa, SCALE_BLOCK, axis=1) # [M, K] + sb_k = np.repeat(sb, SCALE_BLOCK, axis=1) # [N, K] + A_scaled = A * sa_k # [M, K] + B_scaled = (B.T * sb_k).T # [K, N] + C = A_scaled.astype(np.float32) @ B_scaled.astype(np.float32) # [M, N] + return C.astype(np.float16) + + +# ============================================================================= +# Runner +# ============================================================================= + + +class GpuMxGemmRunner: + def __init__(self, so_path: Path, dtype: str = "fp8", arch: Optional[str] = None): + # The fp8 numpy reference (quantize_fp8/dequantize_fp8) emits OCP e4m3 + # bytes; that only matches the device when the lib was compiled with + # CK_TILE_USE_OCP_FP8 == 1 (the gfx950 default). Guard loudly so an + # FNUZ arch can't silently diverge from the reference. + arch = arch or _get_arch() + if dtype == "fp8": + assert_fp8_ocp_supported(arch) + self._lib = MxGemmDispatcherLib(so_path) + self.dtype = dtype + self.arch = arch + + @property + def kernel_name(self) -> str: + return self._lib.kernel_name() + + def make_inputs(self, prob: MxGemmProblem, scale: float = 1.0, seed: int = 0): + """Generate grid-exact A/B and e8m0 scales. + + Returns (A_deq[M,K], B_deq[K,N], A_bytes, B_bytes, sa_bytes[M,K/32], + sb_bytes[N,K/32]). A_bytes/B_bytes are the raw device buffers. + scale is a single power-of-two applied uniformly (1.0 == e8m0 byte 127). + """ + M, N, K = prob.M, prob.N, prob.K + rng = np.random.default_rng(seed) + # Draw from a small grid that is exact in both fp8 e4m3 and fp4 e2m1. + grid = np.array([-2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0], + dtype=np.float32) + A_deq = rng.choice(grid, size=(M, K)).astype(np.float32) + B_deq = rng.choice(grid, size=(K, N)).astype(np.float32) + + if self.dtype == "fp8": + A_bytes = quantize_fp8(A_deq) # [M,K] uint8 + # B stored col-major (rcr) => [N,K] row-major bytes. + B_bytes = quantize_fp8(B_deq.T) # [N,K] uint8 + elif self.dtype == "fp4": + A_bytes = quantize_fp4_packed(A_deq) # [M,K//2] uint8 + B_bytes = quantize_fp4_packed(B_deq.T) # [N,K//2] uint8 + else: + raise ValueError(f"unsupported dtype {self.dtype}") + + sbyte = int(float_to_e8m0(np.float32(scale))) + sa_bytes = np.full((M, prob.scale_k), sbyte, dtype=np.uint8) + sb_bytes = np.full((N, prob.scale_k), sbyte, dtype=np.uint8) + return A_deq, B_deq, A_bytes, B_bytes, sa_bytes, sb_bytes + + def run(self, prob: MxGemmProblem, A_bytes, B_bytes, sa_bytes, sb_bytes): + C = np.zeros((prob.M, prob.N), dtype=np.float16) + t = self._lib.run(A_bytes, B_bytes, C, sa_bytes, sb_bytes, prob) + return MxGemmResult(C=C, time_ms=t, kernel_name=self.kernel_name) + + @staticmethod + def reference(A_deq, B_deq, sa_bytes, sb_bytes, prob: MxGemmProblem): + return mx_gemm_reference(A_deq, B_deq, sa_bytes, sb_bytes, prob) + + +# ============================================================================= +# Build pipeline +# ============================================================================= + + +def _generate_kernel(cfg: MxGemmKernelConfig, headers_dir: Path) -> Optional[Path]: + cmd = [ + sys.executable, str(_CODEGEN_SCRIPT), "--output-dir", str(headers_dir), + "--config-json", json.dumps(cfg.to_codegen_config()), + ] + r = subprocess.run(cmd, capture_output=True, text=True, timeout=180) + if r.returncode != 0: + log.error("codegen failed for %s:\n%s", cfg.name, r.stderr[-1500:]) + return None + hpp = headers_dir / f"{cfg.name}.hpp" + return hpp if hpp.exists() else None + + +# AMDGPU codegen / optimization flags that Old-TE compiles the mx_gemm device +# kernel with. They MUST match Old-TE flag-for-flag: the generated device-kernel +# header is byte-identical, so any flag difference (inlining, register +# allocation, occupancy) shows up as a large perf gap. Compiling with only +# "-O3 -std=c++17" made bridge fp8 kernels run ~30% slower than Old-TE. +# +# Source of truth: projects/composablekernel/CMakeLists.txt add_compile_options() +# (inherited by tile_engine/ops/gemm/mx_gemm) + mx_gemm/CMakeLists.txt's +# --offload-compress. This mirrors gemm_utils._tile_engine_codegen_flags so the +# two bridges stay consistent. +# +# Unconditional set (CK CMake adds these on every supported toolchain): +_MX_CODEGEN_FLAGS = ( + "-mllvm", "-amdgpu-early-inline-all=true", + "-mllvm", "-amdgpu-function-calls=false", + "-mllvm", "--lsr-drop-solution=1", + "-mllvm", "-enable-post-misched=0", + "-fno-offload-uniform-block", + "--offload-compress", +) +# Probe-gated set: CK's CMake only adds these when check_cxx_compiler_flag +# passes (newer -mllvm options some clang builds reject, e.g. ROCm 7.2 does not +# know -amdgpu-coerce-illegal-types). Mirror that probe so the bridge matches +# Old-TE wherever the compiler accepts it and stays buildable where it does not. +_MX_PROBED_CODEGEN_FLAGS = ( + ("-mllvm", "-amdgpu-coerce-illegal-types=1"), +) + + +@functools.lru_cache(maxsize=None) +def _hipcc_accepts(flag_tuple: Tuple[str, ...]) -> bool: + """Mirror CMake check_cxx_compiler_flag: does hipcc compile a trivial TU with + these flags? Cached so the probe runs at most once per distinct flag set.""" + try: + with tempfile.TemporaryDirectory() as d: + src = Path(d) / "probe.cpp" + src.write_text("int main(){}\n") + r = subprocess.run( + [_HIPCC, *flag_tuple, "-c", str(src), "-o", str(Path(d) / "probe.o")], + capture_output=True, timeout=120, + ) + return r.returncode == 0 + except Exception: + return False + + +@functools.lru_cache(maxsize=1) +def _mx_codegen_flags() -> Tuple[str, ...]: + """Old-TE's mx_gemm codegen flags plus any probe-gated flags the compiler + accepts -- the exact backend flag set the TE benchmark TU is built with.""" + flags = list(_MX_CODEGEN_FLAGS) + for pair in _MX_PROBED_CODEGEN_FLAGS: + if _hipcc_accepts(pair): + flags = list(pair) + flags + return tuple(flags) + + +def _compile_kernel(hpp: Path, so: Path, arch: str) -> bool: + inc = [ + f"-I{_CK_ROOT}/include", f"-I{_CK_ROOT}", + f"-I{_CK_ROOT}/tile_engine/ops", + f"-I{_CK_ROOT}/tile_engine/ops/gemm", + f"-I{_CK_ROOT}/tile_engine/ops/gemm/mx_gemm", + ] + cmd = [ + # -std=c++20 matches CK_CXX_STANDARD; codegen flags match Old-TE (see + # _mx_codegen_flags above). Without them the byte-identical fp8 device + # kernel ran ~30% slower than Old-TE. + _HIPCC, "-shared", "-fPIC", "-O3", "-std=c++20", + *_mx_codegen_flags(), + *inc, + "-DCK_TILE_SINGLE_KERNEL_INCLUDE", f"-include{hpp}", + "-D__HIP_PLATFORM_AMD__", f"--offload-arch={arch}", f'-DGFX_ARCH="{arch}"', + "-Wno-undefined-func-template", "-Wno-float-equal", + str(_CTYPES_LIB_SRC), "-o", str(so), + ] + r = subprocess.run(cmd, capture_output=True, text=True, timeout=1800) + if r.returncode != 0: + log.error("compile failed for %s:\n%s", so.name, r.stderr[-3000:]) + return False + return True + + +def setup_multiple_mx_gemm_dispatchers( + configs: List[MxGemmKernelConfig], + output_dir: Optional[Path] = None, + gfx_arch: Optional[str] = None, + parallel: bool = True, + max_workers: Optional[int] = None, +) -> List[Optional[Path]]: + """codegen -> hipcc -> .so for each config. Returns paths aligned with + `configs` (None on failure). Dedups by .name; per-arch .so cache.""" + if not configs: + return [] + arch = gfx_arch or _get_arch() + # When an explicit gfx_arch is passed, pin every config to it BEFORE computing + # cfg.name / running codegen. Otherwise cfg.to_codegen_config() falls back to + # `self.gpu_target or _get_arch()`, so codegen (and the cached name) would use + # the host-detected arch (or fail if rocminfo is missing) while the .so is + # compiled for `arch` -- an arch mismatch between the header and the binary. + # Resetting _name_cache forces the name to be recomputed for the chosen arch. + if gfx_arch is not None: + # mx_gemm is gfx950-only (the C++ bridge static_asserts GFX_ARCH==gfx950); + # reject any other explicit arch here so a build that can never succeed + # fails early with a clear message instead of at compile/runtime. + _supported = ("gfx950",) + if gfx_arch not in _supported: + raise ValueError( + f"mx_gemm is gfx950-only; requested {gfx_arch!r} is not supported " + f"(supported: {list(_supported)})" + ) + for c in configs: + if c.gpu_target != gfx_arch: + c.gpu_target = gfx_arch + c._name_cache = None + base = Path(output_dir) if output_dir else Path(tempfile.mkdtemp(prefix="mx_gemm_bridge_")) + headers = base / "generated_kernels" + libs = base / "libs" + headers.mkdir(parents=True, exist_ok=True) + libs.mkdir(parents=True, exist_ok=True) + + seen: Dict[str, int] = {} + deduped: List[Tuple[int, MxGemmKernelConfig]] = [] + for i, c in enumerate(configs): + if c.name not in seen: + seen[c.name] = i + deduped.append((i, c)) + results: List[Optional[Path]] = [None] * len(configs) + + def build_one(idx: int, cfg: MxGemmKernelConfig): + so = libs / f"lib_{cfg.name}_{arch}.so" + if so.exists(): + return idx, so + hpp = _generate_kernel(cfg, headers) + if hpp is None: + return idx, None + return idx, (so if _compile_kernel(hpp, so, arch) else None) + + if parallel and len(deduped) > 1: + workers = max_workers or min(len(deduped), os.cpu_count() or 4) + with concurrent.futures.ThreadPoolExecutor(max_workers=workers) as ex: + futs = {ex.submit(build_one, i, c): i for i, c in deduped} + for f in concurrent.futures.as_completed(futs): + idx, so = f.result() + results[idx] = so + else: + for i, c in deduped: + _, so = build_one(i, c) + results[i] = so + + # Propagate deduped results to duplicate slots. + for i, c in enumerate(configs): + if results[i] is None and seen.get(c.name, i) != i: + results[i] = results[seen[c.name]] + built = sum(1 for r in results if r) + log.info("built %d/%d mx_gemm kernels for %s", built, len(configs), arch) + return results + + +def default_fp8_config(gfx_arch: Optional[str] = None) -> MxGemmKernelConfig: + return MxGemmKernelConfig( + datatype="fp8", layout="rcr", gpu_target=gfx_arch, + pipeline="comp_async", epilogue="cshuffle", scheduler="intrawave", + tile_m=128, tile_n=128, tile_k=128, warp_m=2, warp_n=2, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=128, + ) + + +def default_fp4_config(gfx_arch: Optional[str] = None) -> MxGemmKernelConfig: + cfg = default_fp8_config(gfx_arch) + cfg.datatype = "fp4" + cfg._name_cache = None + return cfg diff --git a/dispatcher/scripts/generate_profiler_kernels.py b/dispatcher/scripts/generate_profiler_kernels.py index 4b610b9d3be..27d2d272348 100755 --- a/dispatcher/scripts/generate_profiler_kernels.py +++ b/dispatcher/scripts/generate_profiler_kernels.py @@ -5,19 +5,17 @@ # Generates dispatcher-based kernels for the CK Profiler (all directions). # # This script: -# 1. Reads JSON config files -# 2. Calls load_configs_from_json + UnifiedGroupedConvCodegen.generate_all() for each JSON +# 1. Generates GEMM + depthwise configs from tile_math rules via get_default_configs() +# 2. Calls UnifiedGroupedConvCodegen.generate_all() to emit C++ kernel headers # 3. Generates include_all_grouped_conv__kernels.hpp # 4. Generates chunked register_*_chunk_N.cpp files + register_all_grouped_conv_kernels.cpp # # Usage: # python3 generate_profiler_kernels.py \ # --variant {fwd,bwd_data,bwd_weight} \ -# --config-dir \ -# --codegen \ # --output-dir \ # --arch gfx950 \ -# [--config-set tests|profiler] +# [--mode tests|profiler] import argparse import sys @@ -55,26 +53,18 @@ }, } +VARIANT_MAP = { + "fwd": "FORWARD", + "bwd_data": "BACKWARD_DATA", + "bwd_weight": "BACKWARD_WEIGHT", +} -def generate_kernels_from_config(config_file, output_dir, arch): - """Generate kernels for a single JSON config via direct Python API.""" - import json - from unified_grouped_conv_codegen import UnifiedGroupedConvCodegen, load_configs_from_json - try: - configs = load_configs_from_json(config_file, arch=arch) - # Extract datatype from JSON config (matches old --config-file behavior) - with open(config_file, "r") as f: - config_data = json.load(f) - datatype = config_data["datatype"] - # The JSON configs are valid for all architectures. - # Hence, disable the arch_filter. - codegen = UnifiedGroupedConvCodegen(output_dir=output_dir, gpu_target=arch, enable_arch_filter=False) - codegen.generate_all(configs, datatypes=[datatype]) - return True - except Exception as e: - print(f"ERROR generating from {config_file}: {e}", file=sys.stderr) - return False +def _ensure_codegen_importable(): + """Ensure the codegen directory is on sys.path.""" + codegen_dir = str(Path(__file__).resolve().parent.parent / "codegen") + if codegen_dir not in sys.path: + sys.path.insert(0, codegen_dir) def collect_kernel_headers(output_dir, glob_pattern): @@ -106,47 +96,58 @@ def main(): description="Generate dispatcher-based kernels for CK Profiler." ) parser.add_argument("--variant", required=True, choices=list(VARIANT_CONFIG.keys())) - parser.add_argument("--config-dir", required=True) - parser.add_argument("--codegen", required=True) parser.add_argument("--output-dir", required=True) parser.add_argument("--arch", default="gfx950") - parser.add_argument("--config-set", default="tests", choices=["tests", "profiler"]) + parser.add_argument("--rule-set", default="tests", + choices=["profiler", "tests", "full", "full-tests", "tiny", "default"], + help="Rule set: 'profiler'/'tests' (CK Builder " + "profiler/tests instance sets generated in memory " + "from the .conf configs), 'full' (full rule-derived " + "per-(variant,ndim,datatype) set), 'full-tests' " + "(~20% stratified subset of 'full'), 'tiny' " + "(minimal >=10-config subset of 'full-tests'), or " + "'default' (original hand-curated heuristics)") args = parser.parse_args() cfg = VARIANT_CONFIG[args.variant] - config_dir = Path(args.config_dir) / args.config_set - codegen_path = Path(args.codegen) output_dir = Path(args.output_dir) output_dir.mkdir(parents=True, exist_ok=True) - # Add the codegen directory to sys.path so unified_grouped_conv_codegen - # and its siblings are importable regardless of working directory. - codegen_dir = str(codegen_path.parent.resolve()) - if codegen_dir not in sys.path: - sys.path.insert(0, codegen_dir) - - if not config_dir.exists(): - print(f"ERROR: Config directory not found: {config_dir}", file=sys.stderr) - sys.exit(1) + _ensure_codegen_importable() + from unified_grouped_conv_codegen import ( + UnifiedGroupedConvCodegen, + GroupedConvVariant, + get_default_configs, + ) - json_configs = sorted(config_dir.glob("*.json")) - if not json_configs: - print(f"ERROR: No JSON config files in {config_dir}", file=sys.stderr) - sys.exit(1) + variant_enum = GroupedConvVariant[VARIANT_MAP[args.variant]] + datatypes = ["fp16", "bf16", "fp32"] - print(f"Found {len(json_configs)} config files in {config_dir}") + # --- Step 1: Generate configs from rules --- + print(f"Generating configs from rules (variant={args.variant}, " + f"arch={args.arch}, rule_set={args.rule_set})...") - success = True - for config_file in json_configs: - print(f"Generating from {config_file.name}...") - if not generate_kernels_from_config(config_file, output_dir, args.arch): - success = False + configs = get_default_configs( + arch=args.arch, + variants=[variant_enum], + ndims=[2, 3], + datatypes=datatypes, + rule_set=args.rule_set, + ) + print(f"Generated {len(configs)} configs from rules") - if not success: - print("ERROR: Some kernel generations failed", file=sys.stderr) + if not configs: + print("ERROR: No configs generated from rules", file=sys.stderr) sys.exit(1) + # --- Step 2: Generate kernel headers --- + codegen = UnifiedGroupedConvCodegen( + output_dir=output_dir, gpu_target=args.arch, enable_arch_filter=False, + ) + codegen.generate_all(configs, datatypes=datatypes) + + # --- Step 3: Collect headers and generate registration --- headers = collect_kernel_headers(output_dir, cfg["glob_pattern"]) print(f"Found {len(headers)} generated kernel headers") diff --git a/dispatcher/scripts/registration_codegen.py b/dispatcher/scripts/registration_codegen.py index 184fd559186..8b18c3e301e 100644 --- a/dispatcher/scripts/registration_codegen.py +++ b/dispatcher/scripts/registration_codegen.py @@ -163,7 +163,7 @@ def parse_kernel_metadata(kname): return { "ndim": ndim, "dtype": dtype, - "layout": "nhwgc", + "layout": "ndhwgc" if "_ndhwgc_" in kname else "nhwgc", "tile_m": tile_m, "tile_n": tile_n, "tile_k": tile_k, "wave_m": wave_m, "wave_n": wave_n, "wave_k": wave_k, "warp_m": warp_m, "warp_n": warp_n, "warp_k": warp_k, diff --git a/dispatcher/src/dispatcher.cpp b/dispatcher/src/dispatcher.cpp index 133485b2487..3aad515c3db 100644 --- a/dispatcher/src/dispatcher.cpp +++ b/dispatcher/src/dispatcher.cpp @@ -3,6 +3,7 @@ #include "ck_tile/dispatcher/dispatcher.hpp" #include "ck_tile/dispatcher/dispatcher_error.hpp" +#include #include #include @@ -17,6 +18,54 @@ Dispatcher::Dispatcher(Registry* registry, const std::string& gfx_arch) { } +Dispatcher::~Dispatcher() +{ + if(workspace_) + { + (void)hipFree(workspace_); + workspace_ = nullptr; + workspace_bytes_ = 0; + } +} + +void Dispatcher::ensure_workspace(std::size_t bytes, void* stream) const +{ + // Not thread-safe: mutates the Dispatcher-owned buffer. Safe because a + // Dispatcher is used from a single stream/thread (see the concurrency + // contract in dispatcher.hpp) -- there is no shared-buffer contention to + // guard against, so no lock is needed. + if(bytes > workspace_bytes_) + { + if(workspace_) + { + (void)hipFree(workspace_); + workspace_ = nullptr; + workspace_bytes_ = 0; + } + + if(hipMalloc(&workspace_, bytes) != hipSuccess) + { + workspace_ = nullptr; + workspace_bytes_ = 0; + throw DispatcherError("Dispatcher: failed to allocate Stream-K reduction workspace"); + } + workspace_bytes_ = bytes; + } + + // Zero the region the kernel will use. Linear/Tree reductions accumulate into + // this buffer and read it before writing, so a stale/garbage buffer corrupts + // results. Doing it here makes correctness independent of whether the backend's + // per-iteration preprocess reset runs (e.g. on the non-benchmarking nrepeat=1 + // path), mirroring the internal DeviceMem::SetZero() the standalone launch does. + // Zeroed on the caller's stream so the reset is ordered against the kernel + // launch that follows (same stream) without an implicit device-wide sync. + if(bytes > 0 && + hipMemsetAsync(workspace_, 0, bytes, static_cast(stream)) != hipSuccess) + { + throw DispatcherError("Dispatcher: failed to zero Stream-K reduction workspace"); + } +} + void Dispatcher::set_heuristic(HeuristicFunction heuristic) { heuristic_ = heuristic; @@ -66,7 +115,21 @@ float Dispatcher::run_fused(const void* a_ptr, } kernel->set_benchmarking(benchmarking_); - return kernel->run(a_ptr, b_ptr, c_ptr, d_ptrs, problem, stream); + + // Size and own the reduction workspace (0 for non-Stream-K and for Atomic). + // For Linear/Tree the Dispatcher owns and reuses the buffer; no lock is taken + // because a Dispatcher is single-stream (see the concurrency contract in + // dispatcher.hpp). The buffer is zeroed on the caller's stream and the kernel + // launches on the same stream, so the reset is correctly ordered. + const std::size_t ws_bytes = kernel->get_workspace_size(problem); + if(ws_bytes > 0) + { + ensure_workspace(ws_bytes, stream); // grows if needed AND zeroes ws_bytes on `stream` + return kernel->run(a_ptr, b_ptr, c_ptr, d_ptrs, workspace_, problem, stream); + } + + // No workspace needed (non-Stream-K / Atomic): nothing to size or zero. + return kernel->run(a_ptr, b_ptr, c_ptr, d_ptrs, nullptr, problem, stream); } float Dispatcher::run_explicit(const std::string& kernel_id, @@ -92,7 +155,21 @@ float Dispatcher::run_explicit(const std::string& kernel_id, } kernel->set_benchmarking(benchmarking_); - return kernel->run(a_ptr, b_ptr, c_ptr, d_ptrs, problem, stream); + + // Size and own the reduction workspace (0 for non-Stream-K and for Atomic). + // For Linear/Tree the Dispatcher owns and reuses the buffer; no lock is taken + // because a Dispatcher is single-stream (see the concurrency contract in + // dispatcher.hpp). The buffer is zeroed on the caller's stream and the kernel + // launches on the same stream, so the reset is correctly ordered. + const std::size_t ws_bytes = kernel->get_workspace_size(problem); + if(ws_bytes > 0) + { + ensure_workspace(ws_bytes, stream); // grows if needed AND zeroes ws_bytes on `stream` + return kernel->run(a_ptr, b_ptr, c_ptr, d_ptrs, workspace_, problem, stream); + } + + // No workspace needed (non-Stream-K / Atomic): nothing to size or zero. + return kernel->run(a_ptr, b_ptr, c_ptr, d_ptrs, nullptr, problem, stream); } bool Dispatcher::validate(const void* a_ptr, diff --git a/dispatcher/tests/CMakeLists.txt b/dispatcher/tests/CMakeLists.txt index a18663f76d5..6f562ee9609 100644 --- a/dispatcher/tests/CMakeLists.txt +++ b/dispatcher/tests/CMakeLists.txt @@ -27,6 +27,33 @@ set_tests_properties(dispatcher_test_autocorrect PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/../python:${CMAKE_CURRENT_SOURCE_DIR}/../codegen:${CMAKE_CURRENT_SOURCE_DIR}/../scripts" ) +# Operator tile-constraints table regression test +add_test( + NAME dispatcher_test_arch_filter_constraints + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_arch_filter_constraints.py + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/.. +) + +set_tests_properties(dispatcher_test_arch_filter_constraints PROPERTIES + LABELS "dispatcher;python;validation" + TIMEOUT 60 + ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/../python:${CMAKE_CURRENT_SOURCE_DIR}/../codegen:${CMAKE_CURRENT_SOURCE_DIR}/../scripts" +) + +# gemm_utils host-helper + runner-shape regression test. Also acts as an import +# canary: a merge that truncates python/gemm_utils.py (see #9308) makes this fail. +add_test( + NAME dispatcher_test_gemm_utils + COMMAND ${Python3_EXECUTABLE} -m unittest discover -s ${CMAKE_CURRENT_SOURCE_DIR} -p test_gemm_utils.py -v + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +set_tests_properties(dispatcher_test_gemm_utils PROPERTIES + LABELS "dispatcher;python;gemm;validation" + TIMEOUT 60 + ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/../python:${CMAKE_CURRENT_SOURCE_DIR}/../codegen:${CMAKE_CURRENT_SOURCE_DIR}/../scripts" +) + # Verbose version of the test add_test( NAME dispatcher_test_autocorrect_verbose @@ -126,6 +153,36 @@ set_tests_properties(dispatcher_test_fmha_parity PROPERTIES ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/../python:${CMAKE_CURRENT_SOURCE_DIR}/../codegen:${CMAKE_CURRENT_SOURCE_DIR}/../scripts" ) +# Stream-K deep-core registry test (requires GPU + hipcc; SKIPs otherwise). +# Pass the gfx target CMake already configured with so the test does not have to +# detect it at runtime (no rocminfo dependency); it falls back to ROCm env vars +# / amdgpu-arch if none is set here. +set(_streamk_test_arch "") +if(GPU_TARGETS) + list(GET GPU_TARGETS 0 _streamk_test_arch) +elseif(CMAKE_HIP_ARCHITECTURES) + list(GET CMAKE_HIP_ARCHITECTURES 0 _streamk_test_arch) +elseif(AMDGPU_TARGETS) + list(GET AMDGPU_TARGETS 0 _streamk_test_arch) +endif() +set(_streamk_arch_arg "") +if(_streamk_test_arch) + set(_streamk_arch_arg --arch ${_streamk_test_arch}) +endif() + +add_test( + NAME dispatcher_test_streamk_registry + COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_streamk_registry.py ${_streamk_arch_arg} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/.. +) + +set_tests_properties(dispatcher_test_streamk_registry PROPERTIES + LABELS "dispatcher;python;streamk;gpu" + TIMEOUT 900 + SKIP_RETURN_CODE 77 + ENVIRONMENT "PYTHONPATH=${CMAKE_CURRENT_SOURCE_DIR}/../python:${CMAKE_CURRENT_SOURCE_DIR}/../codegen:${CMAKE_CURRENT_SOURCE_DIR}/../scripts" +) + # Stress Test Script add_test( NAME dispatcher_stress_test diff --git a/dispatcher/tests/test_arch_filter_constraints.py b/dispatcher/tests/test_arch_filter_constraints.py new file mode 100644 index 00000000000..333721a1a81 --- /dev/null +++ b/dispatcher/tests/test_arch_filter_constraints.py @@ -0,0 +1,80 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +Regression tests for OPERATOR_TILE_CONSTRAINTS in arch_filter.py. + +Guards against a malformed constraints table (e.g. an operator entry left +without a body/closing brace), which raises a SyntaxError on import and +breaks all GEMM codegen -- and therefore every downstream build/test that +imports unified_gemm_codegen. + +Can be run as: + python3 tests/test_arch_filter_constraints.py + ctest -R test_arch_filter_constraints +""" + +import sys +import unittest +from pathlib import Path + +# Setup paths +SCRIPT_DIR = Path(__file__).parent.resolve() +DISPATCHER_DIR = SCRIPT_DIR.parent +sys.path.insert(0, str(DISPATCHER_DIR / "codegen")) + +# Importing at all fails if arch_filter.py has a syntax error. +from arch_filter import OPERATOR_TILE_CONSTRAINTS, OperatorType # noqa: E402 + +REQUIRED_KEYS = { + "min_tile_m", + "min_tile_n", + "min_tile_k", + "tile_m_alignment", + "tile_n_alignment", + "tile_k_alignment", +} + + +class TestOperatorTileConstraints(unittest.TestCase): + """Validate the OPERATOR_TILE_CONSTRAINTS table is well-formed.""" + + def test_every_operator_has_an_entry(self): + """Every OperatorType must have a constraints entry.""" + for op in OperatorType: + self.assertIn( + op, + OPERATOR_TILE_CONSTRAINTS, + f"{op} is missing from OPERATOR_TILE_CONSTRAINTS", + ) + + def test_every_entry_is_a_well_formed_dict(self): + """Each entry must be a dict with the required integer keys.""" + for op, constraints in OPERATOR_TILE_CONSTRAINTS.items(): + self.assertIsInstance( + constraints, dict, f"{op} constraints should be a dict" + ) + self.assertEqual( + REQUIRED_KEYS, + set(constraints.keys()), + f"{op} constraints keys mismatch", + ) + for key, value in constraints.items(): + self.assertIsInstance( + value, int, f"{op}[{key}] should be an int, got {type(value)}" + ) + self.assertGreater(value, 0, f"{op}[{key}] should be positive") + + def test_gemm_grouped_entry_present(self): + """Regression: GEMM_GROUPED must have its own distinct constraints dict.""" + self.assertIn(OperatorType.GEMM_GROUPED, OPERATOR_TILE_CONSTRAINTS) + grouped = OPERATOR_TILE_CONSTRAINTS[OperatorType.GEMM_GROUPED] + self.assertEqual(REQUIRED_KEYS, set(grouped.keys())) + # GEMM_GROUPED and GEMM_STREAMK are separate entries, not a merged one. + self.assertIn(OperatorType.GEMM_STREAMK, OPERATOR_TILE_CONSTRAINTS) + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/dispatcher/tests/test_bquant_gpu_correctness.py b/dispatcher/tests/test_bquant_gpu_correctness.py new file mode 100644 index 00000000000..34ad85b847c --- /dev/null +++ b/dispatcher/tests/test_bquant_gpu_correctness.py @@ -0,0 +1,416 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +GPU correctness tests for BQuant GEMM dispatcher — C4 and H3 coverage. + +Requires a gfx950 GPU (MI350X / MI355X) and hipcc in PATH. + +Tests: + C4 — fp8, bf8: GPU output is non-zero and within 5% max-relative-error + vs. a fp32 CPU reference. + H3 — mx_bf16bf16, mx_bf16bf8, mx_bf16fp4: same non-zero / rel-error checks, + plus verify QuantType::BQuantGrouped + e8m0 pipeline compiles and runs. + M2 — timing: time_ms is non-zero when timing is requested. + +Run: + python3 test_bquant_gpu_correctness.py + python3 test_bquant_gpu_correctness.py -v # verbose hipcc output + python3 test_bquant_gpu_correctness.py --gfx gfx950 +""" + +import argparse +import logging +import math +import sys +import tempfile +from pathlib import Path + +import numpy as np + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "python")) + +from grouped_gemm_bquant_utils import ( + BQuantGemmProblem, + BQuantGpuGemmRunner, + setup_multiple_bquant_dispatchers, + default_fp8_config, + default_bf8_config, + default_mx_bf16bf16_config, + default_mx_bf16bf8_config, + default_mx_bf16fp4_config, +) + +log = logging.getLogger(__name__) + +TOLERANCE = 0.05 # 5% max relative error — fp8/bf8 precision floor + + +# --------------------------------------------------------------------------- +# Dtype helpers +# --------------------------------------------------------------------------- + +def _encode_fp8(arr: np.ndarray, dtype: str) -> np.ndarray: + """Encode float32 → fp8 bytes (uint8 view). Uses ml_dtypes when available.""" + try: + import ml_dtypes + # fp8 = OCP e4m3fn (bias=7); bf8 = OCP e5m2. + # CK kernels on gfx950 are compiled with -DCK_TILE_USE_OCP_FP8 so they + # use the same OCP format — bit patterns are compatible. + ml_t = ml_dtypes.float8_e4m3fn if dtype == "fp8" else ml_dtypes.float8_e5m2 + return arr.astype(ml_t).view(np.uint8) + except ImportError: + return (np.clip(arr, -2.0, 2.0) * 64).astype(np.int8).view(np.uint8) + + +def _decode_fp8(arr: np.ndarray, dtype: str) -> np.ndarray: + try: + import ml_dtypes + ml_t = ml_dtypes.float8_e4m3fn if dtype == "fp8" else ml_dtypes.float8_e5m2 + return arr.view(ml_t).astype(np.float32) + except ImportError: + return arr.view(np.int8).astype(np.float32) / 64.0 + + +def _encode_bf8(arr: np.ndarray) -> np.ndarray: + return _encode_fp8(arr, "bf8") + +def _decode_bf8(arr: np.ndarray) -> np.ndarray: + return _decode_fp8(arr, "bf8") + + +def _encode_e8m0(arr: np.ndarray) -> np.ndarray: + """Encode float32 scale values → e8m0 uint8 (MX block scale format). + + e8m0 stores a power-of-two exponent: byte b represents 2^(b - 127). + Scales must be positive; zero maps to 0 (subnormal/zero in e8m0). + """ + arr = np.asarray(arr, dtype=np.float32) + # Clamp to representable range: 2^-127 … 2^127 + arr = np.clip(arr, 0.0, np.float32(2.0 ** 127)) + nonzero = arr > 0.0 + out = np.zeros(arr.shape, dtype=np.uint8) + # biased exponent = floor(log2(s)) + 127, clamped to [0, 254] + exp = np.floor(np.log2(arr[nonzero])).astype(np.int32) + 127 + out[nonzero] = np.clip(exp, 0, 254).astype(np.uint8) + return out + + +def _decode_e8m0(arr: np.ndarray) -> np.ndarray: + """Decode e8m0 uint8 → float32 scale values (2^(b - 127)).""" + arr = np.asarray(arr, dtype=np.uint8) + return np.exp2(arr.astype(np.float32) - 127.0) + + +# OCP FP4 E2M1 lookup table (from pk_fp4.hpp e2m1_to_fp32_table). +# Index i (0-15) gives the float32 value for the 4-bit code i. +_FP4_E2M1_LUT: np.ndarray = np.array([ + 0.0, 0.5, 1.0, 1.5, 2.0, 3.0, 4.0, 6.0, + -0.0, -0.5, -1.0, -1.5, -2.0, -3.0, -4.0, -6.0, +], dtype=np.float32) + + +def _decode_fp4(packed: np.ndarray, K: int, N: int) -> np.ndarray: + """Unpack K*N OCP FP4 E2M1 values from K*N/2 packed bytes. + + pk_fp4_t packing (from pk_fp4.hpp _pack/_unpack): + byte = (element1 << 4) | (element0 & 0xF) + Low nibble = element at flat index 2i; high nibble = element at flat index 2i+1. + The flat layout is row-major [K, N], so each byte contains two consecutive N-elements. + """ + flat = packed.flatten() + lo = (flat & 0x0F).astype(np.uint8) + hi = ((flat >> 4) & 0x0F).astype(np.uint8) + out = np.empty(K * N, dtype=np.float32) + out[0::2] = _FP4_E2M1_LUT[lo] + out[1::2] = _FP4_E2M1_LUT[hi] + return out.reshape(K, N) + + +def _bf16_raw_to_f32(arr: np.ndarray) -> np.ndarray: + """Reinterpret a uint16 array of bf16 bit patterns as float32.""" + u16 = arr.flatten().astype(np.uint16) + words = np.zeros(len(u16) * 2, dtype=np.uint16) + words[1::2] = u16 # bf16 occupies upper 2 bytes of float32 (little-endian) + return words.view(np.float32).reshape(arr.shape) + + +# --------------------------------------------------------------------------- +# CPU reference +# --------------------------------------------------------------------------- + +def _reference_gemm(A_f32: np.ndarray, B_f32: np.ndarray, + BQ: np.ndarray, problem: BQuantGemmProblem, + c_dtype=np.float16) -> np.ndarray: + """C = A @ dequant(B, BQ) in fp32, cast to c_dtype.""" + gK, gN = problem.quant_group_k, problem.quant_group_n + B_dq = B_f32.copy() + for qi in range(problem.QK_B): + for qj in range(problem.QN_B): + k0, k1 = qi * gK, min((qi + 1) * gK, problem.K) + n0, n1 = qj * gN, min((qj + 1) * gN, problem.N) + B_dq[k0:k1, n0:n1] *= float(BQ[qi, qj]) + return (A_f32.astype(np.float32) @ B_dq.astype(np.float32)).astype(c_dtype) + + +def _max_rel_err(C_gpu: np.ndarray, C_ref: np.ndarray) -> float: + C_gpu_f = C_gpu.astype(np.float32) + C_ref_f = C_ref.astype(np.float32) + num = np.abs(C_gpu_f - C_ref_f) + # Use 1% of the global max magnitude as the denominator floor to avoid + # inflating the relative error when individual elements are near zero + # (a common occurrence with random inputs that partially cancel in GEMM). + ref_max = float(np.abs(C_ref_f).max()) + den = np.abs(C_ref_f) + max(ref_max * 1e-2, 1e-6) + return float(np.max(num / den)) + + +# --------------------------------------------------------------------------- +# Core test helper +# --------------------------------------------------------------------------- + +PASS = "PASS" +FAIL = "FAIL" + + +def _run_one(label: str, config, M: int, N: int, K: int, + A_raw: np.ndarray, A_f32: np.ndarray, + B_raw: np.ndarray, B_f32: np.ndarray, + BQ: np.ndarray, + out_dir: Path, + c_dtype=np.float16, + c_decode_fn=None, + BQ_ref: np.ndarray = None, + gfx_arch: str = "gfx950") -> tuple[str, str]: + """ + Build, run, and verify one kernel. + + BQ -- raw buffer passed to the GPU kernel (may be e8m0 uint8 for MX variants) + BQ_ref -- float32 scales used for the CPU reference; defaults to BQ if not given + (caller should supply the decoded float32 version when BQ is e8m0) + c_decode_fn -- optional fn(raw_C_array) -> float32 array, used when c_dtype is uint16 + (bf16 raw output) to convert before comparison + + Returns (PASS|FAIL, detail_message). + """ + if BQ_ref is None: + BQ_ref = BQ.astype(np.float32) + + problem = BQuantGemmProblem( + M=M, N=N, K=K, + quant_group_m=config.quant_group_m, + quant_group_n=config.quant_group_n, + quant_group_k=config.quant_group_k, + ) + + so_paths = setup_multiple_bquant_dispatchers( + configs=[config], + output_dir=out_dir, + gfx_arch=gfx_arch, + ) + if not so_paths or so_paths[0] is None: + return FAIL, f"{label}: kernel build failed" + + runner = BQuantGpuGemmRunner(so_paths[0]) + + # Run once (timing is collected internally by the runner) + result = runner.run(A=A_raw, B=B_raw, BQ=BQ, problem=problem, c_dtype=c_dtype) + C_gpu_raw = result.C + # Convert raw output to float32 for validation (needed for bf16 output via uint16 buffer) + C_gpu = c_decode_fn(C_gpu_raw) if c_decode_fn is not None else C_gpu_raw.astype(np.float32) + + # Non-zero check (C4 / H3 smoke) + if np.all(C_gpu == 0): + return FAIL, f"{label}: GPU output is all-zero" + nan_mask = ~np.isfinite(C_gpu.astype(np.float32)) + if np.any(nan_mask): + nan_frac = nan_mask.mean() + sample = C_gpu.astype(np.float32).flat[:8].tolist() + log.debug("%s: NaN/Inf fraction=%.3f, first 8 elements=%s", label, nan_frac, sample) + return FAIL, f"{label}: GPU output contains NaN/Inf (frac={nan_frac:.3f})" + + # Correctness check vs. CPU reference (always in float32) + C_ref = _reference_gemm(A_f32, B_f32, BQ_ref, problem, np.float32) + mre = _max_rel_err(C_gpu, C_ref) + if mre > TOLERANCE: + return FAIL, (f"{label}: max_rel_err={mre:.4f} > tol={TOLERANCE:.4f} " + f"(shape M={M} N={N} K={K})") + + # Timing check (M2 sanity) + result_timed = runner.run(A=A_raw, B=B_raw, BQ=BQ, problem=problem, + c_dtype=c_dtype) + if result_timed.time_ms <= 0.0: + return FAIL, f"{label}: time_ms={result_timed.time_ms:.4f} is not positive" + + return PASS, (f"{label}: max_rel_err={mre:.4f}, " + f"time_ms={result_timed.time_ms:.3f}") + + +# --------------------------------------------------------------------------- +# Individual test cases +# --------------------------------------------------------------------------- + +def _make_fp8_inputs(M, N, K, gK, gN, dtype="fp8", seed=42): + rng = np.random.default_rng(seed) + QK_B = math.ceil(K / gK) + QN_B = math.ceil(N / gN) + A_f32 = rng.uniform(-2.0, 2.0, (M, K)).astype(np.float32) + B_f32 = rng.uniform(-2.0, 2.0, (K, N)).astype(np.float32) + BQ = rng.uniform(0.5, 2.0, (QK_B, QN_B)).astype(np.float32) + A_raw = _encode_fp8(A_f32, dtype) + B_raw = _encode_fp8(B_f32, dtype) + A_dec = _decode_fp8(A_raw, dtype) + B_dec = _decode_fp8(B_raw, dtype) + return A_raw, A_dec, B_raw, B_dec, BQ + + +def _to_bf16_raw(x: np.ndarray) -> np.ndarray: + """Encode float32 array → uint16 array of bfloat16 bit patterns.""" + packed = np.frombuffer(x.astype(np.float32).tobytes(), dtype=np.uint16) + # Little-endian: bf16 occupies the upper 2 bytes of each float32, + # which are at odd indices (1, 3, 5, ...) in the uint16 view. + return packed[1::2].reshape(x.shape) + + +def _make_bf16_inputs(M, N, K, gK, gN, seed=42): + rng = np.random.default_rng(seed) + QK_B = math.ceil(K / gK) + QN_B = math.ceil(N / gN) + A = rng.uniform(-1.0, 1.0, (M, K)).astype(np.float32) + B = rng.uniform(-1.0, 1.0, (K, N)).astype(np.float32) + # BQ for MX: scales stored as e8m0 (uint8, one byte per group). + # Generate float32 scales in [0.5, 1.5], encode to e8m0, then decode back + # to float32 for the CPU reference (so reference uses the same quantised values). + BQ_f32 = rng.uniform(0.5, 1.5, (QK_B, QN_B)).astype(np.float32) + BQ_e8m0 = _encode_e8m0(BQ_f32) # uint8, matches kernel's e8m0_t + BQ_f32_dec = _decode_e8m0(BQ_e8m0) # float32 after e8m0 round-trip + # A and B as uint16 bfloat16; decode back for reference + A_raw = _to_bf16_raw(A) + B_raw = _to_bf16_raw(B) + A_dec = _bf16_raw_to_f32(A_raw) + B_dec = _bf16_raw_to_f32(B_raw) + return A_raw, A_dec, B_raw, B_dec, BQ_e8m0, BQ_f32_dec + + +def test_c4_fp8(out_dir: Path, gfx_arch: str) -> tuple[str, str]: + # K=768 = 3*TileK(256): use num_loop=3 (TailNumber::Odd) for better coverage. + # num_loop=2 works but exercises only the no-hot-loop/Even tail path; 3 gives + # the no-hot-loop/Odd tail path and exercises the BQ scale prefetch more robustly. + M, N, K, gK, gN = 16, 64, 768, 128, 1 + cfg = default_fp8_config(quant_group_k=gK, quant_group_n=gN, gfx_arch=gfx_arch) + A_raw, A_dec, B_raw, B_dec, BQ = _make_fp8_inputs(M, N, K, gK, gN, "fp8") + return _run_one("C4/fp8", cfg, M, N, K, + A_raw, A_dec, B_raw, B_dec, BQ, + out_dir, c_dtype=np.float16, gfx_arch=gfx_arch) + + +def test_c4_bf8(out_dir: Path, gfx_arch: str) -> tuple[str, str]: + # K=768 = 3*TileK(256): use num_loop=3 for the same reason as test_c4_fp8. + M, N, K, gK, gN = 16, 64, 768, 128, 1 + cfg = default_bf8_config(quant_group_k=gK, quant_group_n=gN, gfx_arch=gfx_arch) + A_raw, A_dec, B_raw, B_dec, BQ = _make_fp8_inputs(M, N, K, gK, gN, "bf8") + return _run_one("C4/bf8", cfg, M, N, K, + A_raw, A_dec, B_raw, B_dec, BQ, + out_dir, c_dtype=np.float16, gfx_arch=gfx_arch) + + +def test_h3_mx_bf16bf16(out_dir: Path, gfx_arch: str) -> tuple[str, str]: + # K=256 = 2*TileK(128): MicroscaleCompV3 needs num_loop>=2 to avoid OOB second prefetch + M, N, K, gK, gN = 128, 128, 256, 32, 1 + cfg = default_mx_bf16bf16_config(quant_group_k=gK, quant_group_n=gN, gfx_arch=gfx_arch) + # C is bf16_t (2 bytes); use uint16 buffer + decode fn so size matches exactly. + A_raw, A_dec, B_raw, B_dec, BQ_e8m0, BQ_f32 = _make_bf16_inputs(M, N, K, gK, gN) + return _run_one("H3/mx_bf16bf16", cfg, M, N, K, + A_raw, A_dec, B_raw, B_dec, BQ_e8m0, + out_dir, c_dtype=np.uint16, c_decode_fn=_bf16_raw_to_f32, + BQ_ref=BQ_f32, gfx_arch=gfx_arch) + + +def test_h3_mx_bf16bf8(out_dir: Path, gfx_arch: str) -> tuple[str, str]: + # K=384 = 3*TileK(128): use num_loop=3 (TailNumber::Odd) for broader pipeline coverage. + M, N, K, gK, gN = 128, 128, 384, 128, 1 + cfg = default_mx_bf16bf8_config(quant_group_k=gK, quant_group_n=gN, gfx_arch=gfx_arch) + A_raw, A_dec, _, _, BQ_e8m0, BQ_f32 = _make_bf16_inputs(M, N, K, gK, gN) + # B is bf8: encode K*N float32 values as bf8 bytes + B_f32 = np.random.default_rng(43).uniform(-1.0, 1.0, (K, N)).astype(np.float32) + B_raw_bf8 = _encode_fp8(B_f32, "bf8") + B_dec_bf8 = _decode_fp8(B_raw_bf8, "bf8") + return _run_one("H3/mx_bf16bf8", cfg, M, N, K, + A_raw, A_dec, B_raw_bf8, B_dec_bf8, BQ_e8m0, + out_dir, c_dtype=np.uint16, c_decode_fn=_bf16_raw_to_f32, + BQ_ref=BQ_f32, gfx_arch=gfx_arch) + + +def test_h3_mx_bf16fp4(out_dir: Path, gfx_arch: str) -> tuple[str, str]: + # pk_fp4: 2 fp4 values per byte → B buffer is K*N/2 bytes. + # K=256 = 2*TileK(128): MicroscaleCompV3 needs num_loop>=2 to avoid OOB second prefetch. + M, N, K, gK, gN = 128, 128, 256, 32, 1 + cfg = default_mx_bf16fp4_config(quant_group_k=gK, quant_group_n=gN, gfx_arch=gfx_arch) + A_raw, A_dec, _, _, BQ_e8m0, BQ_f32 = _make_bf16_inputs(M, N, K, gK, gN) + rng = np.random.default_rng(44) + # rcr kernel reads pk_fp4 B COLUMN-MAJOR: consecutive K-elements share a byte + # (low nibble = k even, high nibble = k odd), per reference_mx_gemm_bquant's (k&1) + # branch. Generate logical (K,N) fp4 codes, pack column-major, LUT-decode reference. + codes = rng.integers(0, 16, size=(K, N), dtype=np.uint8) + B_f32_approx = _FP4_E2M1_LUT[codes] # reference values (K,N) + _flat = codes.flatten(order='F').astype(np.uint8) # col-major: idx = n*K + k + _lo = _flat[0::2] & 0x0F # k even -> low nibble + _hi = _flat[1::2] & 0x0F # k odd -> high nibble + B_raw = (_lo | (_hi << 4)).astype(np.uint8) + return _run_one("H3/mx_bf16fp4", cfg, M, N, K, + A_raw, A_dec, B_raw, B_f32_approx, BQ_e8m0, + out_dir, c_dtype=np.uint16, c_decode_fn=_bf16_raw_to_f32, + BQ_ref=BQ_f32, gfx_arch=gfx_arch) + + +# --------------------------------------------------------------------------- +# Main +# --------------------------------------------------------------------------- + +TESTS = [ + ("C4/fp8", test_c4_fp8), + ("C4/bf8", test_c4_bf8), + ("H3/mx_bf16bf16", test_h3_mx_bf16bf16), + ("H3/mx_bf16bf8", test_h3_mx_bf16bf8), + ("H3/mx_bf16fp4", test_h3_mx_bf16fp4), +] + + +def main(): + parser = argparse.ArgumentParser(description="BQuant GPU correctness tests (C4 + H3)") + parser.add_argument("--gfx", default="gfx950", help="GPU arch (default: gfx950)") + parser.add_argument("-v", "--verbose", action="store_true") + parser.add_argument("--output-dir", type=Path, default=None) + args = parser.parse_args() + + logging.basicConfig( + level=logging.DEBUG if args.verbose else logging.INFO, + format="%(levelname)s: %(message)s", + ) + + out_dir = args.output_dir or Path(tempfile.mkdtemp(prefix="bquant_gpu_test_")) + log.info("Kernel output dir: %s", out_dir) + + results = [] + for name, fn in TESTS: + log.info("--- Running %s ---", name) + try: + status, detail = fn(out_dir, args.gfx) + except Exception as exc: + status, detail = FAIL, f"{name}: exception: {exc}" + results.append((name, status, detail)) + log.info("[%s] %s", status, detail) + + print("\n=== Summary ===") + passed = sum(1 for _, s, _ in results if s == PASS) + for name, status, detail in results: + print(f" [{status:4s}] {detail}") + print(f"\n{passed}/{len(results)} passed") + + return 0 if passed == len(results) else 1 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/dispatcher/tests/test_depthwise_tile_math.py b/dispatcher/tests/test_depthwise_tile_math.py new file mode 100644 index 00000000000..17a712d256d --- /dev/null +++ b/dispatcher/tests/test_depthwise_tile_math.py @@ -0,0 +1,227 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +Unit tests for depthwise convolution rules in codegen/tile_math.py. + +Ground truth: all 20 profiler depthwise configs extracted from +configs/grouped_conv/forward/profiler/ngchw_fp16.json (identical +across fp16/bf16/fp32). + +Run: + cd projects/composablekernel/dispatcher + python3 -m unittest tests/test_depthwise_tile_math.py -v +""" + +import sys +import unittest +from pathlib import Path + +SCRIPT_DIR = Path(__file__).parent.resolve() +DISPATCHER_DIR = SCRIPT_DIR.parent +sys.path.insert(0, str(DISPATCHER_DIR / "codegen")) + +from grouped_conv.tile_math import ( # noqa: E402 + DepthwiseConfig, + is_valid_depthwise_config, + get_valid_depthwise_configs, +) + +# ============================================================================= +# Reference configs from JSON ground truth +# ============================================================================= +# Tuple order: (tile_h, tile_w, filt, str_h, str_w, pad_h, pad_w, +# nbatch, sub_h, sub_w, in_vec, out_vec) + +DEPTHWISE_PROFILER_CONFIGS = [ + (8, 8, 3, 1, 1, 1, 1, 8, 2, 2, 2, 2), + (16, 16, 3, 1, 1, 1, 1, 8, 1, 4, 8, 8), + (16, 16, 3, 1, 1, 1, 1, 1, 2, 2, 2, 2), + (28, 28, 3, 1, 1, 1, 1, 1, 4, 4, 8, 8), + (32, 32, 3, 1, 1, 1, 1, 1, 4, 4, 8, 8), + (16, 16, 3, 2, 2, 1, 1, 2, 1, 4, 8, 8), + (16, 16, 3, 2, 2, 1, 1, 1, 1, 4, 8, 8), + (16, 16, 3, 2, 2, 1, 1, 1, 2, 2, 8, 8), + (16, 16, 3, 2, 2, 1, 1, 1, 2, 2, 2, 2), + (14, 28, 3, 2, 2, 1, 1, 1, 2, 4, 8, 8), + (32, 32, 3, 2, 2, 1, 1, 2, 4, 4, 8, 8), + (32, 32, 3, 2, 2, 1, 1, 1, 4, 4, 4, 4), + (32, 32, 3, 2, 2, 1, 1, 1, 4, 4, 8, 8), + (32, 32, 3, 2, 2, 1, 1, 1, 2, 8, 8, 8), + (8, 8, 5, 1, 1, 2, 2, 1, 1, 1, 1, 1), + (8, 8, 5, 1, 1, 2, 2, 8, 2, 2, 2, 2), + (16, 16, 5, 1, 1, 2, 2, 1, 1, 4, 8, 8), + (16, 16, 5, 1, 1, 2, 2, 8, 1, 4, 8, 8), + (28, 28, 5, 1, 1, 2, 2, 8, 4, 4, 8, 8), + (32, 32, 5, 1, 1, 2, 2, 4, 4, 4, 8, 8), +] + +DEPTHWISE_TEST_CONFIGS = [ + (8, 8, 3, 1, 1, 1, 1, 8, 2, 2, 2, 2), + (32, 32, 3, 1, 1, 1, 1, 1, 4, 4, 8, 8), + (16, 16, 3, 2, 2, 1, 1, 2, 1, 4, 8, 8), + (32, 32, 3, 2, 2, 1, 1, 1, 2, 8, 8, 8), + (8, 8, 5, 1, 1, 2, 2, 1, 1, 1, 1, 1), + (32, 32, 5, 1, 1, 2, 2, 4, 4, 4, 8, 8), +] + +# Tile/filter/stride space matching grouped_config_rules_default.py +TILE_SIZES = [(8, 8), (14, 28), (16, 16), (28, 28), (32, 32)] +FILTER_SIZES = [3, 5] +STRIDES = [(1, 1), (2, 2)] + + +def _tuple_to_cfg(t): + """Convert a 12-tuple to a DepthwiseConfig.""" + return DepthwiseConfig(*t) + + +def _cfg_to_tuple(c): + """Convert a DepthwiseConfig to a 12-tuple.""" + return (c.tile_h, c.tile_w, c.filt, c.str_h, c.str_w, + c.pad_h, c.pad_w, c.nbatch, c.sub_h, c.sub_w, + c.in_vec, c.out_vec) + + +# ============================================================================= +# Tests +# ============================================================================= + +class TestIsValidDepthwiseConfig(unittest.TestCase): + """Tests for is_valid_depthwise_config().""" + + def test_all_reference_configs_valid(self): + """Every JSON reference config must pass validation.""" + for t in DEPTHWISE_PROFILER_CONFIGS: + cfg = _tuple_to_cfg(t) + self.assertTrue( + is_valid_depthwise_config(cfg), + f"Reference config should be valid: {t}", + ) + + def test_all_reference_configs_valid_fp32(self): + """Reference configs must also be valid with fp32 dtype_size=4.""" + for t in DEPTHWISE_PROFILER_CONFIGS: + cfg = _tuple_to_cfg(t) + self.assertTrue(is_valid_depthwise_config(cfg, dtype_size=4)) + + def test_odd_filter_required(self): + """Even filter size must be rejected.""" + cfg = DepthwiseConfig(8, 8, 4, 1, 1, 1, 1, 8, 2, 2, 2, 2) + self.assertFalse(is_valid_depthwise_config(cfg)) + + def test_pad_w_must_be_positive(self): + """PadW=0 must be rejected.""" + cfg = DepthwiseConfig(8, 8, 3, 1, 1, 1, 0, 8, 2, 2, 2, 2) + self.assertFalse(is_valid_depthwise_config(cfg)) + + def test_subtile_exceeds_tile(self): + """sub_h > tile_h must be rejected.""" + cfg = DepthwiseConfig(8, 8, 3, 1, 1, 1, 1, 8, 16, 2, 2, 2) + self.assertFalse(is_valid_depthwise_config(cfg)) + + def test_total_subtiles_exceeds_64(self): + """Config with too many subtiles must be rejected.""" + # sub_h=1, sub_w=1 on tile 16x16 → 256 subtiles > 64 + cfg = DepthwiseConfig(16, 16, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1) + self.assertFalse(is_valid_depthwise_config(cfg)) + + def test_nbatch_divisibility(self): + """nbatch must be divisible by tile_per_wave.""" + # tile_h=8, tile_w=8, sub_h=2, sub_w=2 → 4×4=16 subtiles + # tile_per_wave = 64//16 = 4, so nbatch=3 is invalid + cfg = DepthwiseConfig(8, 8, 3, 1, 1, 1, 1, 3, 2, 2, 2, 2) + self.assertFalse(is_valid_depthwise_config(cfg)) + + def test_vec_not_power_of_2(self): + """Non-power-of-2 vector size must be rejected.""" + cfg = DepthwiseConfig(8, 8, 3, 1, 1, 1, 1, 8, 2, 2, 3, 2) + self.assertFalse(is_valid_depthwise_config(cfg)) + + def test_stride_w_constraint(self): + """Odd StrideW != 1 must be rejected.""" + cfg = DepthwiseConfig(8, 8, 3, 1, 3, 1, 1, 8, 2, 2, 2, 2) + self.assertFalse(is_valid_depthwise_config(cfg)) + + +class TestGetValidDepthwiseConfigs(unittest.TestCase): + """Tests for get_valid_depthwise_configs().""" + + @classmethod + def setUpClass(cls): + """Generate configs once for all tests.""" + cls.generated = get_valid_depthwise_configs( + TILE_SIZES, FILTER_SIZES, STRIDES, + ) + cls.generated_set = {_cfg_to_tuple(c) for c in cls.generated} + + def test_no_false_negatives(self): + """Every JSON profiler reference config must be generated by rules.""" + missing = [] + for ref in DEPTHWISE_PROFILER_CONFIGS: + if ref not in self.generated_set: + missing.append(ref) + if missing: + lines = [f" {m}" for m in missing] + self.fail( + f"{len(missing)}/20 profiler configs missing:\n" + + "\n".join(lines) + ) + + def test_test_configs_are_subset(self): + """Test configs must also be in the generated set.""" + for ref in DEPTHWISE_TEST_CONFIGS: + self.assertIn(ref, self.generated_set, + f"Test config missing: {ref}") + + def test_all_generated_are_valid(self): + """Every generated config must pass all constraint checks.""" + invalid = [] + for cfg in self.generated: + if not is_valid_depthwise_config(cfg): + invalid.append(_cfg_to_tuple(cfg)) + if invalid: + self.fail(f"{len(invalid)} generated configs are invalid") + + def test_no_duplicates(self): + """Generated list must not contain duplicates.""" + self.assertEqual( + len(self.generated), len(self.generated_set), + "Duplicate configs found in generated list", + ) + + def test_generates_nonzero_configs(self): + """Must generate at least the 20 reference configs.""" + self.assertGreaterEqual(len(self.generated), 20) + + def test_coverage_rate(self): + """Log coverage statistics (informational).""" + n_ref = len(DEPTHWISE_PROFILER_CONFIGS) + n_covered = sum(1 for r in DEPTHWISE_PROFILER_CONFIGS + if r in self.generated_set) + n_total = len(self.generated) + print(f"\n[depthwise coverage] {n_covered}/{n_ref} reference covered, " + f"{n_total} total generated") + self.assertEqual(n_covered, n_ref, + f"Coverage {n_covered}/{n_ref} < 100%") + + def test_empty_input(self): + """Empty tile_sizes should return no configs.""" + self.assertEqual( + get_valid_depthwise_configs([], [3], [(1, 1)]), + [], + ) + + def test_smem_constraint_rejects_huge_tile_fp32(self): + """Very large tiles with fp32 should produce fewer configs due to SmemSize.""" + # fp32 (dtype_size=4) doubles SmemSize, pruning more configs + fp16 = get_valid_depthwise_configs([(32, 32)], [5], [(1, 1)], dtype_size=2) + fp32 = get_valid_depthwise_configs([(32, 32)], [5], [(1, 1)], dtype_size=4) + self.assertLess(len(fp32), len(fp16), + "fp32 should produce fewer valid configs than fp16") + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/dispatcher/tests/test_gemm_parity.py b/dispatcher/tests/test_gemm_parity.py new file mode 100644 index 00000000000..b9d1cd1cd9a --- /dev/null +++ b/dispatcher/tests/test_gemm_parity.py @@ -0,0 +1,313 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +"""GEMM bridge parity regression: Dispatcher GPU output vs NumPy reference. + +This is the in-tree, reproducible version of the ad-hoc ``parity/`` sweep used to +validate the Tile Engine -> Dispatcher GEMM bridge. For each (dtype, layout) the +bridge supports it codegens + hipcc-compiles a kernel, runs it through +``GpuGemmRunner``, and compares the result to a NumPy reference across a square, a +rectangular, and an awkward (non-tile-aligned) problem shape. + +Parity is checked as a GLOBAL relative error -- ``max|gpu - ref| / max|ref|`` -- +not per-element: K-length accumulation of zero-mean inputs produces near-zero +entries whose per-element ratios explode and carry no signal. + +The whole suite is GPU-gated: it skips cleanly (not fails) when hipcc, the +dispatcher static lib, or a GPU is unavailable, so CPU-only CI stays green while +GPU runners get real end-to-end coverage. The pure host-side helpers are covered +separately and cheaply by ``test_gemm_utils.py``. + +Run: + python3 -m pytest tests/test_gemm_parity.py -v # discovery / CI + python3 tests/test_gemm_parity.py # readable table +""" + +import os +import sys +import shutil +import unittest +from pathlib import Path + +SCRIPT_DIR = Path(__file__).parent.resolve() +DISPATCHER_DIR = SCRIPT_DIR.parent +sys.path.insert(0, str(DISPATCHER_DIR / "python")) + +import numpy as np # noqa: E402 + +from gemm_utils import ( # noqa: E402 + GemmKernelConfig, + GemmProblem, + GpuGemmRunner, + setup_multiple_gemm_dispatchers, + _fp32_to_bf16_u16, + _bf16_u16_to_fp32, + _fp32_to_fp8_u8, + _fp8_u8_to_fp32, + _fp32_to_bf8_u8, + _bf8_u8_to_fp32, + _output_dtype, +) +from ctypes_utils import detect_gpu_arch, get_build_dir # noqa: E402 + +# (dtype, layout) surface the regular bridge supports. Column-major C is rejected +# by ck_tile's universal GEMM at build, so every layout keeps row-major C, which +# leaves exactly the four A/B combinations below. Every dtype covers all four. +# +# fp16/bf16 are the PR #8479 surface; fp8 (E4M3), bf8 (E5M2) and int8 are the +# remaining dtypes TE's plain GEMM has MFMA warp tiles for (fp8/bf8 -> fp16 out, +# int8 -> int32 out). int8 only has warp tiles on gfx942; on other arches its +# kernels simply fail to build and the case skips (handled below). +_FLOAT_DTYPES = ("fp16", "bf16", "fp8", "bf8") +_INT_DTYPES = ("int8",) +_LAYOUTS = ("rcr", "rrr", "ccr", "crr") +_CASES = [ + (dt, lay) for dt in (*_FLOAT_DTYPES, *_INT_DTYPES) for lay in _LAYOUTS +] + +# Padded default algorithm: pad_* all True so M/N need not divide the tile, which +# is what lets the awkward shape below pass. K must still be a multiple of 8 for +# the fp16/bf16 vectorized contiguous-reduction load, so every K here is divisible +# by 8. +_ALGO = dict( + tile_m=128, tile_n=128, tile_k=32, + wave_m=2, wave_n=2, wave_k=1, + warp_tile_m=32, warp_tile_n=32, warp_tile_k=16, + pipeline="compv4", scheduler="intrawave", epilogue="cshuffle", + pad_m=True, pad_n=True, pad_k=True, +) + +# (name, M, N, K). 'awkward' deliberately uses M, N that do not divide the 128 +# tile to exercise padding; K stays divisible by 8. +_SHAPES = [ + ("square", 512, 512, 512), + ("rectangular", 1024, 512, 256), + ("awkward", 257, 129, 512), +] + +# Global-relative-error gates. fp16 measured ~3-4e-4 and bf16 ~8e-3 on gfx942. +# fp8/bf8 are far coarser (3- and 2-bit mantissa) so their gates are looser; int8 +# is an exact integer accumulation so it must match bit-for-bit. The fp8/bf8 +# gates are first-cut headroom values and may want tightening once measured on a +# GPU. +_TOL = { + "fp16": 2e-3, + "bf16": 1.5e-2, + "fp8": 1.5e-1, + "bf8": 3.0e-1, + "int8": 0.0, +} + +_LAYOUT_WORD = {"r": "row", "c": "col"} + + +def _emulate_input(x: np.ndarray, dtype: str) -> np.ndarray: + """Round an fp32 operand to the kernel's storage dtype so the CPU reference + multiplies exactly what the GPU does. int8 inputs are already integral.""" + if dtype == "bf16": + return _bf16_u16_to_fp32(_fp32_to_bf16_u16(x)) + if dtype == "fp8": + return _fp8_u8_to_fp32(_fp32_to_fp8_u8(x)) + if dtype == "bf8": + return _bf8_u8_to_fp32(_fp32_to_bf8_u8(x)) + if dtype == "int8": + return x.astype(np.float64) # exact; widened to avoid product overflow + return x.astype(np.float16).astype(np.float32) + + +def _emulate_output(c: np.ndarray, out_dtype: str) -> np.ndarray: + """Round the fp32 accumulator to the kernel's C storage dtype.""" + if out_dtype == "bf16": + return _bf16_u16_to_fp32(_fp32_to_bf16_u16(c)) + if out_dtype == "int32": + return c # integer accumulation is exact + return c.astype(np.float16).astype(np.float32) # fp16 + + +def _make_inputs(dtype, M, N, K, rng): + """Random A (MxK), B (KxN) for a dtype: floats for the float dtypes, small + integers for int8 (kept small so the int32 accumulation cannot overflow).""" + if dtype == "int8": + A = rng.integers(-4, 5, size=(M, K)).astype(np.float32) + B = rng.integers(-4, 5, size=(K, N)).astype(np.float32) + return A, B + A = (rng.standard_normal((M, K)) * 0.1).astype(np.float32) + B = (rng.standard_normal((K, N)) * 0.1).astype(np.float32) + return A, B + + +def _reference(A, B, dtype): + """NumPy reference matching the kernel: round inputs to the storage dtype, + accumulate (fp32 for floats / exact int for int8), then round to C dtype.""" + out_dtype = _output_dtype(dtype) + acc = _emulate_input(A, dtype) @ _emulate_input(B, dtype) + ref = _emulate_output(acc, out_dtype) + return ref.astype(np.int32) if out_dtype == "int32" else ref + + +def _config(dtype: str, layout: str, arch: str) -> GemmKernelConfig: + la, lb, lc = layout + return GemmKernelConfig( + dtype_a=dtype, dtype_b=dtype, + dtype_c=_output_dtype(dtype), + dtype_acc=("int32" if dtype == "int8" else "fp32"), + layout_a=_LAYOUT_WORD[la], layout_b=_LAYOUT_WORD[lb], layout_c=_LAYOUT_WORD[lc], + gfx_arch=arch, **_ALGO, + ) + + +def _max_rel(out: np.ndarray, ref: np.ndarray) -> float: + denom = float(np.max(np.abs(ref))) + 1e-12 + return float(np.max(np.abs(out - ref))) / denom + + +def _gpu_environment_reason(): + """Return None if the bridge can build+run here, else a human-readable reason + to skip.""" + if not Path("/opt/rocm/bin/hipcc").exists(): + return "hipcc not found at /opt/rocm/bin/hipcc" + if not (get_build_dir() / "libck_tile_dispatcher.a").exists(): + return "dispatcher static lib (libck_tile_dispatcher.a) not built" + if shutil.which("rocminfo") is None: + return "rocminfo not found (no ROCm runtime / GPU)" + return None + + +class GemmBridgeParity(unittest.TestCase): + """End-to-end GPU-vs-NumPy parity across the bridge's dtype/layout surface.""" + + arch = None + built = {} # (dtype, layout) -> Path(.so) + build_failures = {} + + @classmethod + def setUpClass(cls): + reason = _gpu_environment_reason() + if reason: + raise unittest.SkipTest(reason) + cls.arch = detect_gpu_arch() + + configs = [_config(dt, lay, cls.arch) for dt, lay in _CASES] + so_paths = setup_multiple_gemm_dispatchers(configs, verbose=False) + for (dt, lay), so in zip(_CASES, so_paths): + if so is None: + cls.build_failures[(dt, lay)] = "codegen/hipcc returned no .so" + else: + cls.built[(dt, lay)] = so + + if not cls.built: + raise unittest.SkipTest( + f"no bridge kernels built on {cls.arch} " + f"(failures: {cls.build_failures})" + ) + + def _run_case(self, dtype, layout, shape): + so = self.built.get((dtype, layout)) + if so is None: + self.skipTest( + f"{dtype}/{layout} did not build on {self.arch}: " + f"{self.build_failures.get((dtype, layout))}" + ) + + _, M, N, K = shape + problem = GemmProblem(M=M, N=N, K=K) + rng = np.random.default_rng(42) + A, B = _make_inputs(dtype, M, N, K, rng) + + runner = GpuGemmRunner(lib_path=so) + # The .so is the contract endpoint: the name it reports must be the config + # name that drove codegen + the force-include build. The kernel name keys + # off the input dtype (dtype_a), not the C/acc dtype. + self.assertEqual(runner.kernel_name, _config(dtype, layout, self.arch).name) + + result = runner.run(A, B, problem) + self.assertTrue( + result.success, + f"{dtype}/{layout} {shape[0]} run failed (status {result.status})", + ) + + ref = _reference(A, B, dtype) + max_rel = _max_rel(result.output.astype(np.float64), ref.astype(np.float64)) + self.assertLessEqual( + max_rel, _TOL[dtype], + f"{dtype}/{layout} {shape[0]} max_rel={max_rel:.2e} > {_TOL[dtype]:.0e}", + ) + + +def _add_parity_tests(): + """Generate one test method per (case, shape) so failures pinpoint exactly + which dtype/layout/shape regressed.""" + for dtype, layout in _CASES: + for shape in _SHAPES: + shape_name = shape[0] + + def _method(self, dtype=dtype, layout=layout, shape=shape): + self._run_case(dtype, layout, shape) + + _method.__name__ = f"test_{dtype}_{layout}_{shape_name}" + _method.__doc__ = f"{dtype} {layout} {shape_name} {shape[1:]} parity" + setattr(GemmBridgeParity, _method.__name__, _method) + + +_add_parity_tests() + + +def _main() -> int: + """Readable table run (mirrors test_fmha_parity.py's report style).""" + reason = _gpu_environment_reason() + if reason: + print(f"SKIP: {reason}") + return 0 + + arch = detect_gpu_arch() + print("=" * 78) + print(f"GEMM Bridge Parity: Dispatcher (GPU {arch}) vs NumPy reference") + print("=" * 78) + + configs = [_config(dt, lay, arch) for dt, lay in _CASES] + print(f" Building {len(configs)} bridge kernels (codegen + hipcc)...") + so_paths = setup_multiple_gemm_dispatchers(configs, verbose=False) + + print(f"\n {'case':<12} {'shape':<12} {'tflops':>9} {'max_rel':>10} {'tol':>8} {'':>6}") + print(" " + "-" * 60) + + rng = np.random.default_rng(42) + total = 0 + passed = 0 + for (dtype, layout), so in zip(_CASES, so_paths): + tag = f"{dtype}/{layout}" + if so is None: + print(f" {tag:<12} {'-':<12} {'BUILD FAILED':>35}") + total += len(_SHAPES) + continue + runner = GpuGemmRunner(lib_path=so) + for sname, M, N, K in _SHAPES: + total += 1 + problem = GemmProblem(M=M, N=N, K=K) + A, B = _make_inputs(dtype, M, N, K, rng) + result = runner.run(A, B, problem) + if not result.success: + print(f" {tag:<12} {sname:<12} {'RUN FAILED':>9} status={result.status}") + continue + ref = _reference(A, B, dtype) + mr = _max_rel(result.output.astype(np.float64), ref.astype(np.float64)) + ok = mr <= _TOL[dtype] + passed += ok + print(f" {tag:<12} {sname:<12} {result.tflops:>9.1f} " + f"{mr:>10.2e} {_TOL[dtype]:>8.0e} {'PASS' if ok else 'FAIL':>6}") + + print("\n" + "=" * 78) + print(f" {passed}/{total} parity checks passed") + print("=" * 78) + return 0 if passed == total else 1 + + +if __name__ == "__main__": + # Default to the readable table; `-m pytest` / `unittest` use the generated + # test methods instead. + if os.environ.get("GEMM_PARITY_UNITTEST"): + unittest.main() + else: + sys.exit(_main()) diff --git a/dispatcher/tests/test_gemm_utils.py b/dispatcher/tests/test_gemm_utils.py new file mode 100644 index 00000000000..3dd2f50ace8 --- /dev/null +++ b/dispatcher/tests/test_gemm_utils.py @@ -0,0 +1,255 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +"""CPU-only unit tests for python/gemm_utils.py. + +Locks in the bit-level helpers that the TE -> Dispatcher GEMM bridge relies on: + * bf16 <-> uint16 encoding (round-to-nearest-even), since numpy has no native + bf16 and the runner carries bf16 as a uint16 bit pattern. + * fp8 (E4M3) / bf8 (E5M2) FNUZ <-> uint8 encoding, used for the gfx942 8-bit + float surface. The decode must be exact to the device format; the encode + only needs to land on the nearest representable byte. + * dtype / layout parsing from the compiled kernel name, which drives how the + runner lays out host buffers. + +No GPU is touched -- all functions under test are pure host-side logic. +Run: python3 -m pytest tests/test_gemm_utils.py -v +""" + +import sys +import unittest +from pathlib import Path + +SCRIPT_DIR = Path(__file__).parent.resolve() +DISPATCHER_DIR = SCRIPT_DIR.parent +sys.path.insert(0, str(DISPATCHER_DIR / "python")) + +import numpy as np # noqa: E402 + +from gemm_utils import ( # noqa: E402 + GemmKernelConfig, + _fp32_to_bf16_u16, + _bf16_u16_to_fp32, + _fp32_to_fp8_u8, + _fp8_u8_to_fp32, + _fp32_to_bf8_u8, + _bf8_u8_to_fp32, + _fnuz_decode_table, + _output_dtype, + _dtype_from_kernel_name, + _layout_from_kernel_name, +) + + +class TestBf16Encoding(unittest.TestCase): + """bf16 = top 16 bits of fp32 with round-to-nearest-even.""" + + def test_exactly_representable_roundtrip(self): + # Values whose low 16 fp32 mantissa bits are zero are exact in bf16. + exact = np.array([0.0, 1.0, -1.0, 2.0, 0.5, -0.5, 4.0, 256.0], + dtype=np.float32) + out = _bf16_u16_to_fp32(_fp32_to_bf16_u16(exact)) + np.testing.assert_array_equal(out, exact) + + def test_roundtrip_within_bf16_tolerance(self): + rng = np.random.default_rng(0) + x = (rng.standard_normal(10000) * 100.0).astype(np.float32) + out = _bf16_u16_to_fp32(_fp32_to_bf16_u16(x)) + # bf16 has 8 bits of significand -> relative error <= 2^-8. + rel = np.abs(out - x) / (np.abs(x) + 1e-30) + self.assertLessEqual(float(rel.max()), 2.0 ** -8) + + def test_round_to_nearest_even_ties(self): + # Tie halfway between bf16 1.0 (0x3F80, even) and 0x3F81 (odd): + # fp32 0x3F808000 must round DOWN to the even neighbor 0x3F80. + tie_down = np.array([0x3F808000], dtype=np.uint32).view(np.float32) + self.assertEqual(int(_fp32_to_bf16_u16(tie_down)[0]), 0x3F80) + # Tie halfway between 0x3F81 (odd) and 0x3F82 (even): + # fp32 0x3F818000 must round UP to the even neighbor 0x3F82. + tie_up = np.array([0x3F818000], dtype=np.uint32).view(np.float32) + self.assertEqual(int(_fp32_to_bf16_u16(tie_up)[0]), 0x3F82) + + def test_special_values(self): + inf = np.array([np.inf, -np.inf], dtype=np.float32) + out = _bf16_u16_to_fp32(_fp32_to_bf16_u16(inf)) + self.assertTrue(np.isinf(out[0]) and out[0] > 0) + self.assertTrue(np.isinf(out[1]) and out[1] < 0) + + nan = np.array([np.nan], dtype=np.float32) + out_nan = _bf16_u16_to_fp32(_fp32_to_bf16_u16(nan)) + self.assertTrue(np.isnan(out_nan[0])) + + def test_dtype_and_size(self): + u16 = _fp32_to_bf16_u16(np.zeros(4, dtype=np.float32)) + self.assertEqual(u16.dtype, np.uint16) + self.assertEqual(u16.itemsize, 2) # must match sizeof(bf16_t) on device + + +class TestFp8Bf8Encoding(unittest.TestCase): + """fp8 E4M3 / bf8 E5M2 in the FNUZ format used by gfx942. + + The decode is the load-bearing half (it must equal the device value for a + byte); the encode must land on the nearest representable byte and saturate. + """ + + def test_format_ranges(self): + # FNUZ maxima: E4M3 -> 2^7 * 1.875 = 240; E5M2 -> 2^15 * 1.75 = 57344. + t43 = _fnuz_decode_table(4, 3) + t52 = _fnuz_decode_table(5, 2) + self.assertEqual(float(np.nanmax(t43)), 240.0) + self.assertEqual(float(np.nanmin(t43)), -240.0) + self.assertEqual(float(np.nanmax(t52)), 57344.0) + self.assertEqual(float(np.nanmin(t52)), -57344.0) + + def test_zero_and_nan_slots(self): + # 0x00 is +0; the negative-zero slot 0x80 is the lone NaN (FNUZ). + for tab in (_fnuz_decode_table(4, 3), _fnuz_decode_table(5, 2)): + self.assertEqual(float(tab[0x00]), 0.0) + self.assertTrue(np.isnan(tab[0x80])) + + def test_exactly_representable_roundtrip(self): + exact = np.array([0.0, 0.5, 1.0, -1.0, 2.0, -2.0, 1.5, -0.25, 4.0, 8.0], + dtype=np.float32) + np.testing.assert_array_equal( + _fp8_u8_to_fp32(_fp32_to_fp8_u8(exact)), exact) + np.testing.assert_array_equal( + _bf8_u8_to_fp32(_fp32_to_bf8_u8(exact)), exact) + + def test_decode_is_consistent_with_encode(self): + # The parity contract: ref multiplies decode(encode(x)), so the pair must + # be self-consistent and every encoded byte must decode finite. + rng = np.random.default_rng(1) + x = (rng.standard_normal(5000) * 0.1).astype(np.float32) + for enc, dec in ((_fp32_to_fp8_u8, _fp8_u8_to_fp32), + (_fp32_to_bf8_u8, _bf8_u8_to_fp32)): + d = dec(enc(x)) + self.assertTrue(np.all(np.isfinite(d))) + + def test_saturates_no_inf(self): + # FNUZ has no infinity: huge magnitudes clamp to the finite max. + big = np.array([1e30, -1e30], dtype=np.float32) + self.assertEqual(float(_fp8_u8_to_fp32(_fp32_to_fp8_u8(big))[0]), 240.0) + self.assertEqual(float(_bf8_u8_to_fp32(_fp32_to_bf8_u8(big))[1]), -57344.0) + + def test_dtype_and_size(self): + for enc in (_fp32_to_fp8_u8, _fp32_to_bf8_u8): + u8 = enc(np.zeros(4, dtype=np.float32)) + self.assertEqual(u8.dtype, np.uint8) + self.assertEqual(u8.itemsize, 1) # must match sizeof(fp8_t/bf8_t) + + +class TestOutputDtype(unittest.TestCase): + """Output (C) element dtype must mirror the codegen's get_output_dtype.""" + + def test_mapping(self): + self.assertEqual(_output_dtype("fp16"), "fp16") + self.assertEqual(_output_dtype("bf16"), "bf16") + self.assertEqual(_output_dtype("fp8"), "fp16") + self.assertEqual(_output_dtype("bf8"), "fp16") + self.assertEqual(_output_dtype("int8"), "int32") + + +class TestKernelNameParsing(unittest.TestCase): + """The runner reads dtype + layout straight from the compiled .so name.""" + + _NAME = ("gemm_bf16_rcr_compv3_cshuffle_intrawave_" + "False_False_False_False_64x64x64_4x1x1_16x16x16") + + def test_dtype_from_name(self): + self.assertEqual(_dtype_from_kernel_name(self._NAME), "bf16") + self.assertEqual( + _dtype_from_kernel_name("gemm_fp16_rrr_compv4_cshuffle_intrawave"), + "fp16", + ) + + def test_dtype_fallback(self): + # Malformed / single-token name falls back to fp16. + self.assertEqual(_dtype_from_kernel_name("gemm"), "fp16") + + def test_layout_from_name(self): + self.assertEqual(_layout_from_kernel_name(self._NAME), "rcr") + for lay in ("rrr", "ccr", "crr", "rcc"): + name = f"gemm_fp16_{lay}_compv3_cshuffle_intrawave" + self.assertEqual(_layout_from_kernel_name(name), lay) + + def test_layout_fallback(self): + # A token that is not a 3-char r/c string falls back to rcr. + self.assertEqual( + _layout_from_kernel_name("gemm_fp16_xyz_compv3"), "rcr" + ) + self.assertEqual(_layout_from_kernel_name("gemm"), "rcr") + + +class TestConfigNameContract(unittest.TestCase): + """GemmKernelConfig.name is the single source of truth tying config -> + codegen -> runtime; parsing it back must recover dtype and layout.""" + + def test_name_roundtrips_through_parsers(self): + for dtype in ("fp16", "bf16", "fp8", "bf8", "int8"): + for la, lb, lc in (("row", "col", "row"), + ("row", "row", "row"), + ("col", "col", "row"), + ("col", "row", "row")): + cfg = GemmKernelConfig( + dtype_a=dtype, dtype_b=dtype, dtype_c=_output_dtype(dtype), + dtype_acc=("int32" if dtype == "int8" else "fp32"), + layout_a=la, layout_b=lb, layout_c=lc, + ) + name = cfg.name + self.assertEqual(_dtype_from_kernel_name(name), dtype) + self.assertEqual(_layout_from_kernel_name(name), cfg.layout) + + +class TestModuleImportsAndRunnerShape(unittest.TestCase): + """Guards against a merge truncating gemm_utils (regression: #9308 dropped + the tail of GpuMultiDGemmRunner.run, leaving an unterminated + ``MultiDGemmResult(`` that made the whole module fail to import). + + Importing this test file already exercises ``import gemm_utils``; these + assertions additionally pin the multi_d / multi_abd runner shapes so the + method can't silently land in the wrong class again. + """ + + def test_module_imports(self): + import gemm_utils # noqa: F401 (import must not raise) + + def test_codegen_module_parses(self): + # unified_gemm_codegen.py was truncated by the same #9308 merge (an + # unterminated f-string in _multi_d_single_include). Parse it directly so + # a syntax-level truncation is caught even without importing its deps. + import ast + + codegen = DISPATCHER_DIR / "codegen" / "unified_gemm_codegen.py" + ast.parse(codegen.read_text(), filename=str(codegen)) + + def test_multi_d_runner_has_run_returning_multi_d_result(self): + import inspect + import gemm_utils as g + + self.assertTrue( + callable(getattr(g.GpuMultiDGemmRunner, "run", None)), + "GpuMultiDGemmRunner must expose run()", + ) + src = inspect.getsource(g.GpuMultiDGemmRunner.run) + self.assertIn("return MultiDGemmResult(", src) + # The return must be complete (all dataclass fields present). + for field in ("output=", "time_ms=", "status=", "tflops=", "kernel_name="): + self.assertIn(field, src, f"multi_d run() missing {field} in result") + + def test_multi_abd_runner_has_no_stray_multi_d_code(self): + import inspect + import gemm_utils as g + + src = inspect.getsource(g.GpuMultiABDRunner) + self.assertIn("_parse_layout4", src) + self.assertNotIn( + "MultiDGemmResult", + src, + "GpuMultiABDRunner must not contain multi_d result code (merge slip)", + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/dispatcher/tests/test_grouped_conv_codegen.py b/dispatcher/tests/test_grouped_conv_codegen.py index acfa5abd8f1..dc5077da031 100644 --- a/dispatcher/tests/test_grouped_conv_codegen.py +++ b/dispatcher/tests/test_grouped_conv_codegen.py @@ -542,13 +542,17 @@ def test_generate_contains_launch_kernel_time_mask(self): code = gen.generate(config) self.assertIn("launch_kernel_time_mask", code) - def test_generate_forces_vector_size_c_to_1(self): + def test_two_stage_uses_fp32_workspace_vector_size_c(self): + # Two-stage writes the GEMM result to an fp32 workspace, so it uses the + # configured VectorSizeC directly instead of forcing it to 1. config = _make_two_stage_config() gen = CKTileGroupedConvKernelGenerator( "fp16", GroupedConvVariant.BACKWARD_WEIGHT ) code = gen.generate(config) - self.assertIn("VectorSizeC_TwoStage = 1", code) + self.assertIn("WorkspaceDataType = float", code) + self.assertIn("Config::VectorSizeC", code) + self.assertNotIn("VectorSizeC_TwoStage", code) def test_generate_contains_workspace_memset(self): config = _make_two_stage_config() @@ -567,7 +571,6 @@ def test_single_stage_does_not_contain_workspace(self): code = gen.generate(config) self.assertNotIn("WorkspaceDataType", code) self.assertNotIn("ElementWiseKernel", code) - self.assertNotIn("launch_kernel_time_mask", code) def test_default_configs_include_two_stage(self): from unified_grouped_conv_codegen import get_default_configs diff --git a/dispatcher/tests/test_grouped_gemm_bquant_utils.py b/dispatcher/tests/test_grouped_gemm_bquant_utils.py new file mode 100644 index 00000000000..1f96dd70f9b --- /dev/null +++ b/dispatcher/tests/test_grouped_gemm_bquant_utils.py @@ -0,0 +1,726 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +CPU-only unit tests for grouped_gemm_bquant_utils.py. + +Tests kernel name generation, config serialization, and problem dimension helpers. +No GPU or hipcc required. + +Run: + python3 -m pytest dispatcher/tests/test_grouped_gemm_bquant_utils.py -v +""" + +import math +import sys +from pathlib import Path + +import pytest + +sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "python")) + +from grouped_gemm_bquant_utils import ( + BQuantKernelConfig, + BQuantGemmProblem, + default_fp8_config, + default_bf8_config, + default_fp8i4_config, + default_bf8i4_config, + default_fp8_preshuffleb_config, + default_bf8_preshuffleb_config, + default_fp8i4_preshuffleb_config, + default_bf8i4_preshuffleb_config, + default_fp8_preshufflequant_config, + default_bf8_preshufflequant_config, + default_fp8i4_preshufflequant_config, + default_bf8i4_preshufflequant_config, + default_fp8_preshuffleb_bquant_config, + default_bf8_preshuffleb_bquant_config, + default_fp8i4_preshuffleb_bquant_config, + default_bf8i4_preshuffleb_bquant_config, + default_mx_bf16bf16_config, + default_mx_bf16bf8_config, + default_mx_bf16fp4_config, +) + + +# ============================================================================= +# BQuantKernelConfig.name — byte-exact match with codegen KERNEL_NAME +# ============================================================================= + + +class TestKernelName: + + def test_fp8_rcr_default_name(self): + cfg = BQuantKernelConfig( + variant_key="fp8", + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, quant_group_n=1, quant_group_k=128, + ) + assert cfg.name == ( + "grouped_gemm_bquant_fp8_rcr_compv3_cshuffle_intrawave_" + "16x64x256_1x4x1_16x16x16_qg1x1x128" + ) + + def test_bf8_rcr_default_name(self): + cfg = BQuantKernelConfig( + variant_key="bf8", + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, quant_group_n=1, quant_group_k=128, + ) + assert cfg.name == ( + "grouped_gemm_bquant_bf8_rcr_compv3_cshuffle_intrawave_" + "16x64x256_1x4x1_16x16x16_qg1x1x128" + ) + + def test_different_quant_groups_produce_different_names(self): + def make(gk, gn): + return BQuantKernelConfig( + variant_key="fp8", layout="rcr", + pipeline="compv3", epilogue="cshuffle", scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, quant_group_n=gn, quant_group_k=gk, + ).name + + names = [make(64, 1), make(128, 1), make(128, 8), make(128, 128)] + assert len(names) == len(set(names)), "All quant-group variants must have unique names" + + def test_preshuffle_b_suffix(self): + cfg = BQuantKernelConfig( + variant_key="fp8", layout="rcr", + pipeline="compv3", epilogue="cshuffle", scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, quant_group_n=1, quant_group_k=128, + preshuffle_b=True, + ) + assert cfg.name.endswith("_preshuffleb") + + def test_preshuffle_bquant_suffix(self): + cfg = BQuantKernelConfig( + variant_key="fp8", layout="rcr", + pipeline="compv3", epilogue="cshuffle", scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, quant_group_n=1, quant_group_k=128, + preshuffle_b=True, preshuffle_bquant=True, + ) + assert "_preshuffleb_preshufflebq" in cfg.name + + def test_preshuffle_bquant_only_suffix(self): + cfg = BQuantKernelConfig( + variant_key="fp8", layout="rcr", + pipeline="compv3", epilogue="cshuffle", scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, quant_group_n=1, quant_group_k=128, + preshuffle_bquant=True, + ) + # preshuffle_bquant without preshuffle_b: _preshufflebq present but not _preshuffleb_ + # Use word-boundary check: the suffix "_preshuffleb" must not appear as a standalone token + name = cfg.name + assert "_preshufflebq" in name + # "_preshuffleb" is a prefix of "_preshufflebq" — check it's not a standalone suffix + assert not name.endswith("_preshuffleb") + + def test_name_no_spaces(self): + cfg = default_fp8_config() + assert " " not in cfg.name + + def test_name_only_valid_chars(self): + import re + cfg = default_fp8_config() + assert re.match(r'^[a-z0-9_]+$', cfg.name), f"Invalid chars in name: {cfg.name}" + + def test_default_fp8_config_name(self): + cfg = default_fp8_config(quant_group_k=128) + assert "fp8" in cfg.name + assert "qg1x1x128" in cfg.name + + def test_default_bf8_config_name(self): + cfg = default_bf8_config(quant_group_k=128) + assert "bf8" in cfg.name + assert "qg1x1x128" in cfg.name + + def test_fp8i4_rcr_default_name(self): + cfg = BQuantKernelConfig( + variant_key="fp8i4", + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, quant_group_n=1, quant_group_k=128, + ) + assert cfg.name == ( + "grouped_gemm_bquant_fp8i4_rcr_compv3_cshuffle_intrawave_" + "16x64x256_1x4x1_16x16x16_qg1x1x128" + ) + + def test_bf8i4_rcr_default_name(self): + cfg = BQuantKernelConfig( + variant_key="bf8i4", + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, quant_group_n=1, quant_group_k=128, + ) + assert cfg.name == ( + "grouped_gemm_bquant_bf8i4_rcr_compv3_cshuffle_intrawave_" + "16x64x256_1x4x1_16x16x16_qg1x1x128" + ) + + def test_default_fp8i4_config_name(self): + cfg = default_fp8i4_config(quant_group_k=128) + assert "fp8i4" in cfg.name + assert "qg1x1x128" in cfg.name + + def test_default_bf8i4_config_name(self): + cfg = default_bf8i4_config(quant_group_k=128) + assert "bf8i4" in cfg.name + assert "qg1x1x128" in cfg.name + + def test_fp8i4_quant_group64_name(self): + cfg = default_fp8i4_config(quant_group_k=64) + assert "qg1x1x64" in cfg.name + + def test_bf8i4_quant_groupn8_name(self): + cfg = default_bf8i4_config(quant_group_k=128, quant_group_n=8) + assert "qg1x8x128" in cfg.name + + +# ============================================================================= +# BQuantKernelConfig.to_codegen_config — round-trip shape +# ============================================================================= + + +class TestCodegenConfig: + + def test_codegen_config_contains_correct_variant(self): + cfg = default_fp8_config() + d = cfg.to_codegen_config() + assert d["variant_keys"] == ["fp8"] + + def test_codegen_config_tile_roundtrip(self): + cfg = BQuantKernelConfig( + variant_key="fp8", layout="rcr", + pipeline="compv3", epilogue="cshuffle", scheduler="intrawave", + tile_m=32, tile_n=128, tile_k=64, + warp_m=2, warp_n=2, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, quant_group_n=4, quant_group_k=64, + ) + d = cfg.to_codegen_config() + tc = d["tile_configs"][0] + assert tc["tile_m"] == 32 + assert tc["tile_n"] == 128 + assert tc["tile_k"] == 64 + assert tc["warp_m"] == 2 + qg = d["quant_groups"][0] + assert qg["quant_group_k"] == 64 + assert qg["quant_group_n"] == 4 + + def test_codegen_config_single_layout(self): + cfg = default_fp8_config() + d = cfg.to_codegen_config() + assert d["layouts"] == ["rcr"] + + +# ============================================================================= +# BQuantGemmProblem dimension helpers +# ============================================================================= + + +class TestBQuantGemmProblem: + + def test_QK_B_exact_multiple(self): + p = BQuantGemmProblem(M=16, N=64, K=256, quant_group_k=128) + assert p.QK_B == 2 # 256 / 128 + + def test_QK_B_ceil(self): + p = BQuantGemmProblem(M=16, N=64, K=300, quant_group_k=128) + assert p.QK_B == math.ceil(300 / 128) # == 3 + + def test_QN_B_exact_multiple(self): + p = BQuantGemmProblem(M=16, N=64, K=256, quant_group_n=32) + assert p.QN_B == 2 # 64 / 32 + + def test_QN_B_default_one_group(self): + p = BQuantGemmProblem(M=16, N=64, K=256) + assert p.QN_B == 64 # default quant_group_n=1 → every column is its own group + + def test_QN_B_ceil(self): + p = BQuantGemmProblem(M=16, N=65, K=256, quant_group_n=32) + assert p.QN_B == math.ceil(65 / 32) # == 3 + + def test_default_k_batch(self): + p = BQuantGemmProblem(M=16, N=64, K=256) + assert p.k_batch == 1 + + +# ============================================================================= +# Phase 3 infrastructure — preshuffle fields and new pipeline key +# ============================================================================= + + +class TestPhase3Infrastructure: + + def test_double_smem_buffer_defaults_false(self): + cfg = default_fp8_config() + assert cfg.double_smem_buffer is False + + def test_k_block_per_cu_defaults_one(self): + cfg = default_fp8_config() + assert cfg.k_block_per_cu == 1 + + def test_preshuffleb_pipeline_accepted(self): + cfg = BQuantKernelConfig( + variant_key="fp8", layout="rcr", + pipeline="preshuffleb", epilogue="cshuffle", scheduler="intrawave", + tile_m=128, tile_n=128, tile_k=128, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=32, + quant_group_m=1, quant_group_n=1, quant_group_k=128, + preshuffle_b=True, double_smem_buffer=True, k_block_per_cu=2, + ) + assert "preshuffleb" in cfg.name + assert cfg.double_smem_buffer is True + assert cfg.k_block_per_cu == 2 + + def test_codegen_config_carries_preshuffle_fields(self): + cfg = BQuantKernelConfig( + variant_key="fp8", layout="rcr", + pipeline="preshuffleb", epilogue="cshuffle", scheduler="intrawave", + tile_m=128, tile_n=128, tile_k=128, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=32, + quant_group_m=1, quant_group_n=1, quant_group_k=128, + preshuffle_b=True, double_smem_buffer=True, k_block_per_cu=2, + ) + d = cfg.to_codegen_config() + assert d["preshuffle_b"] is True + assert d["preshuffle_bquant"] is False + assert d["double_smem_buffer"] is True + assert d["k_block_per_cu"] == 2 + + def test_codegen_config_default_preshuffle_fields_false(self): + d = default_fp8_config().to_codegen_config() + assert d["preshuffle_b"] is False + assert d["preshuffle_bquant"] is False + assert d["double_smem_buffer"] is False + assert d["k_block_per_cu"] == 1 + + +# ============================================================================= +# Phase 3a/b/c — preshuffle convenience configs +# ============================================================================= + + +class TestPhase3Configs: + + # ---- 3a: preshuffle_b only ---- + + def test_fp8_preshuffleb_name(self): + cfg = default_fp8_preshuffleb_config() + assert cfg.name == ( + "grouped_gemm_bquant_fp8_rcr_preshuffleb_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x128_qg1x1x128_preshuffleb" + ) + + def test_bf8_preshuffleb_name(self): + cfg = default_bf8_preshuffleb_config() + assert cfg.name == ( + "grouped_gemm_bquant_bf8_rcr_preshuffleb_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x128_qg1x1x128_preshuffleb" + ) + + def test_fp8i4_preshuffleb_name(self): + cfg = default_fp8i4_preshuffleb_config() + assert cfg.name == ( + "grouped_gemm_bquant_fp8i4_rcr_preshuffleb_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x32_qg1x1x128_preshuffleb" + ) + + def test_bf8i4_preshuffleb_name(self): + cfg = default_bf8i4_preshuffleb_config() + assert cfg.name == ( + "grouped_gemm_bquant_bf8i4_rcr_preshuffleb_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x32_qg1x1x128_preshuffleb" + ) + + def test_preshuffleb_flags(self): + cfg = default_fp8_preshuffleb_config() + assert cfg.preshuffle_b is True + assert cfg.preshuffle_bquant is False + assert cfg.double_smem_buffer is True + assert cfg.k_block_per_cu == 2 + assert cfg.pipeline == "preshuffleb" + + def test_preshuffleb_i4_warp_tile_k(self): + # pk_int4 is not 8-bit float → K_warp_tile=32 on gfx950 + cfg = default_fp8i4_preshuffleb_config() + assert cfg.warp_tile_k == 32 + + def test_preshuffleb_fp8_warp_tile_k(self): + cfg = default_fp8_preshuffleb_config() + assert cfg.warp_tile_k == 128 + + # ---- 3b: preshuffle_bquant only ---- + + def test_fp8_preshufflequant_name(self): + cfg = default_fp8_preshufflequant_config() + assert cfg.name == ( + "grouped_gemm_bquant_fp8_rcr_compv3_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x128_qg1x1x128_preshufflebq" + ) + + def test_bf8_preshufflequant_name(self): + cfg = default_bf8_preshufflequant_config() + assert cfg.name == ( + "grouped_gemm_bquant_bf8_rcr_compv3_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x128_qg1x1x128_preshufflebq" + ) + + def test_fp8i4_preshufflequant_name(self): + cfg = default_fp8i4_preshufflequant_config() + assert cfg.name == ( + "grouped_gemm_bquant_fp8i4_rcr_compv3_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x32_qg1x1x128_preshufflebq" + ) + + def test_preshufflequant_flags(self): + cfg = default_fp8_preshufflequant_config() + assert cfg.preshuffle_b is False + assert cfg.preshuffle_bquant is True + assert cfg.double_smem_buffer is False + assert cfg.k_block_per_cu == 1 + assert cfg.pipeline == "compv3" + + def test_preshufflequant_16n_group(self): + # 1x16x128 is the extra quant group for 3b — verify config accepts it + cfg = default_fp8_preshufflequant_config(quant_group_n=16) + assert "qg1x16x128" in cfg.name + + # ---- 3c: preshuffle_b + preshuffle_bquant ---- + + def test_fp8_preshuffleb_bquant_name(self): + cfg = default_fp8_preshuffleb_bquant_config() + assert cfg.name == ( + "grouped_gemm_bquant_fp8_rcr_preshuffleb_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x128_qg1x1x128_preshuffleb_preshufflebq" + ) + + def test_bf8i4_preshuffleb_bquant_name(self): + cfg = default_bf8i4_preshuffleb_bquant_config() + assert cfg.name == ( + "grouped_gemm_bquant_bf8i4_rcr_preshuffleb_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x32_qg1x1x128_preshuffleb_preshufflebq" + ) + + def test_preshuffleb_bquant_flags(self): + cfg = default_fp8_preshuffleb_bquant_config() + assert cfg.preshuffle_b is True + assert cfg.preshuffle_bquant is True + assert cfg.double_smem_buffer is True + assert cfg.k_block_per_cu == 2 + assert cfg.pipeline == "preshuffleb" + + def test_all_preshuffle_names_unique(self): + configs = [ + default_fp8_preshuffleb_config(), + default_bf8_preshuffleb_config(), + default_fp8i4_preshuffleb_config(), + default_bf8i4_preshuffleb_config(), + default_fp8_preshufflequant_config(), + default_bf8_preshufflequant_config(), + default_fp8i4_preshufflequant_config(), + default_bf8i4_preshufflequant_config(), + default_fp8_preshuffleb_bquant_config(), + default_bf8_preshuffleb_bquant_config(), + default_fp8i4_preshuffleb_bquant_config(), + default_bf8i4_preshuffleb_bquant_config(), + ] + names = [c.name for c in configs] + assert len(names) == len(set(names)), f"Duplicate: {[n for n in names if names.count(n) > 1]}" + + +# ============================================================================= +# Phase 4 — MX microscale variants +# ============================================================================= + + +class TestPhase4MXConfigs: + + def test_mx_bf16bf16_name(self): + cfg = default_mx_bf16bf16_config(quant_group_k=32) + assert cfg.name == ( + "grouped_gemm_bquant_mx_bf16bf16_rcr_microscale_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x32_qg1x1x32" + ) + + def test_mx_bf16bf8_name(self): + cfg = default_mx_bf16bf8_config(quant_group_k=128) + assert cfg.name == ( + "grouped_gemm_bquant_mx_bf16bf8_rcr_microscale_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x64_qg1x1x128" + ) + + def test_mx_bf16fp4_name(self): + cfg = default_mx_bf16fp4_config(quant_group_k=32) + assert cfg.name == ( + "grouped_gemm_bquant_mx_bf16fp4_rcr_microscale_permute_n_intrawave_" + "128x128x128_1x4x1_16x16x32_qg1x1x32" + ) + + def test_mx_bf16bf16_warp_tile_k(self): + # GemmConfigQuantPrefill: get_k_warp_tile on gfx950 = 32 + assert default_mx_bf16bf16_config().warp_tile_k == 32 + + def test_mx_bf16bf8_warp_tile_k(self): + # GemmConfigMixedPrecision: hardcoded K_Warp_Tile = 64 + assert default_mx_bf16bf8_config().warp_tile_k == 64 + + def test_mx_bf16fp4_warp_tile_k(self): + # GemmConfigQuantPrefill: same as bf16bf16 + assert default_mx_bf16fp4_config().warp_tile_k == 32 + + def test_mx_all_use_microscale_pipeline(self): + for cfg in [ + default_mx_bf16bf16_config(), + default_mx_bf16bf8_config(), + default_mx_bf16fp4_config(), + ]: + assert cfg.pipeline == "microscale", f"{cfg.variant_key} should use microscale" + + def test_mx_no_preshuffle_flags(self): + for cfg in [ + default_mx_bf16bf16_config(), + default_mx_bf16bf8_config(), + default_mx_bf16fp4_config(), + ]: + assert cfg.preshuffle_b is False + assert cfg.preshuffle_bquant is False + assert cfg.double_smem_buffer is False + + def test_mx_bf16bf16_quant_group_k64(self): + cfg = default_mx_bf16bf16_config(quant_group_k=64) + assert "qg1x1x64" in cfg.name + + def test_mx_bf16fp4_quant_group_k128(self): + cfg = default_mx_bf16fp4_config(quant_group_k=128) + assert "qg1x1x128" in cfg.name + + def test_mx_all_names_unique(self): + configs = [ + default_mx_bf16bf16_config(quant_group_k=32), + default_mx_bf16bf16_config(quant_group_k=64), + default_mx_bf16bf8_config(quant_group_k=64), + default_mx_bf16bf8_config(quant_group_k=128), + default_mx_bf16fp4_config(quant_group_k=32), + default_mx_bf16fp4_config(quant_group_k=64), + default_mx_bf16fp4_config(quant_group_k=128), + ] + names = [c.name for c in configs] + assert len(names) == len(set(names)) + + +# ============================================================================= +# Name uniqueness across a small sweep +# ============================================================================= + + +class TestNameUniqueness: + + def _make_configs(self): + configs = [] + for variant in ("fp8", "bf8", "fp8i4", "bf8i4"): + for gk in (64, 128): + for gn in (1, 8): + configs.append(BQuantKernelConfig( + variant_key=variant, + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + quant_group_m=1, quant_group_n=gn, quant_group_k=gk, + )) + return configs + + def test_all_names_unique(self): + configs = self._make_configs() + names = [c.name for c in configs] + assert len(names) == len(set(names)), f"Duplicate names: {[n for n in names if names.count(n) > 1]}" + + +# ============================================================================= +# Codegen GroupSizeK — generated headers must export the quantization group size +# ============================================================================= + + +class TestCodegenGroupSizeK: + + def _generate_header(self, quant_group_k=128): + """Generate a kernel header string via the codegen and return it.""" + sys.path.insert(0, str(Path(__file__).resolve().parents[1] / "codegen")) + from unified_grouped_gemm_bquant_codegen import ( + BQuantKernelHeaderGenerator, + BQuantKernelSpec, + BQuantTileConfig, + ) + tile = BQuantTileConfig( + tile_m=16, tile_n=64, tile_k=256, + warp_m=1, warp_n=4, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=16, + ) + spec = BQuantKernelSpec( + variant_key="fp8", + layout="rcr", + pipeline="compv3", + epilogue="cshuffle", + scheduler="intrawave", + tile=tile, + quant_group_m=1, + quant_group_n=1, + quant_group_k=quant_group_k, + ) + gen = BQuantKernelHeaderGenerator() + return gen.generate(spec) + + def test_group_size_k_emitted_in_struct(self): + header = self._generate_header(quant_group_k=128) + assert "static constexpr ck_tile::index_t GroupSizeK = 128;" in header, ( + "GroupSizeK is missing from the generated SelectedKernel struct. " + "gemm_bquant_benchmark_single.cpp references SelectedKernel::GroupSizeK " + "and will fail to compile without it." + ) + + def test_group_size_k_matches_config(self): + for gk in (64, 128, 256): + header = self._generate_header(quant_group_k=gk) + expected = f"static constexpr ck_tile::index_t GroupSizeK = {gk};" + assert expected in header, ( + f"Expected '{expected}' in generated header for quant_group_k={gk}" + ) + + def test_group_size_k_exported_in_single_kernel_include(self): + header = self._generate_header(quant_group_k=128) + # The CK_TILE_SINGLE_KERNEL_INCLUDE block must also export GroupSizeK + # so force-include users see it at global scope. + assert "constexpr ck_tile::index_t GroupSizeK = " in header, ( + "GroupSizeK is not exported in the CK_TILE_SINGLE_KERNEL_INCLUDE block" + ) + + +# ============================================================================= +# expand_bquant_sweep — JSON config -> BQuantKernelConfig list +# ============================================================================= + + +class TestExpandBquantSweep: + + def _write_config(self, tmp_path, config_dict): + import json as _json + p = tmp_path / "test_config.json" + p.write_text(_json.dumps(config_dict)) + return str(p) + + def test_basic_expansion(self, tmp_path): + from grouped_gemm_bquant_utils import expand_bquant_sweep + cfg = { + "variant_keys": ["fp8", "bf8"], + "layouts": ["rcr"], + "pipeline": "compv3", + "epilogue": "cshuffle", + "scheduler": "intrawave", + "tile_configs": [ + {"tile_m": 128, "tile_n": 128, "tile_k": 128, + "warp_m": 2, "warp_n": 2, "warp_k": 1, + "warp_tile_m": 32, "warp_tile_n": 32, "warp_tile_k": 16} + ], + "quant_groups": [ + {"quant_group_m": 1, "quant_group_n": 1, "quant_group_k": 128} + ], + } + p = self._write_config(tmp_path, cfg) + configs = expand_bquant_sweep(p, gfx_arch="gfx950") + assert len(configs) == 2 # fp8 + bf8 + names = {c.name for c in configs} + assert any("fp8" in n for n in names) + assert any("bf8" in n for n in names) + + def test_deduplication(self, tmp_path): + from grouped_gemm_bquant_utils import expand_bquant_sweep + # Two identical configs should collapse to one + tile = {"tile_m": 128, "tile_n": 128, "tile_k": 128, + "warp_m": 2, "warp_n": 2, "warp_k": 1, + "warp_tile_m": 32, "warp_tile_n": 32, "warp_tile_k": 16} + cfg = { + "variant_keys": ["fp8"], + "layouts": ["rcr"], + "pipeline": "compv3", + "epilogue": "cshuffle", + "scheduler": "intrawave", + "tile_configs": [tile, tile], # duplicate + "quant_groups": [{"quant_group_m": 1, "quant_group_n": 1, "quant_group_k": 128}], + } + p = self._write_config(tmp_path, cfg) + configs = expand_bquant_sweep(p) + assert len(configs) == 1 + + def test_name_matches_kernel_config_name(self, tmp_path): + from grouped_gemm_bquant_utils import expand_bquant_sweep, BQuantKernelConfig + cfg = { + "variant_keys": ["fp8"], + "layouts": ["rcr"], + "pipeline": "compv3", + "epilogue": "cshuffle", + "scheduler": "intrawave", + "tile_configs": [ + {"tile_m": 128, "tile_n": 128, "tile_k": 128, + "warp_m": 2, "warp_n": 2, "warp_k": 1, + "warp_tile_m": 32, "warp_tile_n": 32, "warp_tile_k": 16} + ], + "quant_groups": [{"quant_group_m": 1, "quant_group_n": 1, "quant_group_k": 128}], + } + p = self._write_config(tmp_path, cfg) + configs = expand_bquant_sweep(p) + assert len(configs) == 1 + # The name produced by expand_bquant_sweep must equal what a manually + # constructed BQuantKernelConfig would produce. + manual = BQuantKernelConfig( + variant_key="fp8", layout="rcr", + pipeline="compv3", epilogue="cshuffle", scheduler="intrawave", + tile_m=128, tile_n=128, tile_k=128, + warp_m=2, warp_n=2, warp_k=1, + warp_tile_m=32, warp_tile_n=32, warp_tile_k=16, + quant_group_m=1, quant_group_n=1, quant_group_k=128, + ) + assert configs[0].name == manual.name diff --git a/dispatcher/tests/test_grouped_gemm_codegen.py b/dispatcher/tests/test_grouped_gemm_codegen.py new file mode 100644 index 00000000000..4dd2891f638 --- /dev/null +++ b/dispatcher/tests/test_grouped_gemm_codegen.py @@ -0,0 +1,130 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +"""CPU-only unit tests for the grouped GEMM variant of the TE -> Dispatcher bridge. + +Grouped GEMM has a genuinely different ABI from regular GEMM (a list of +sub-problems, a launch(descs, stream) signature, and an internally-owned device +workspace), so it is generated by a dedicated path in the unified GEMM codegen +and launched by grouped_gemm_ctypes_lib.cpp. These tests lock in the host-side +contract of that path without touching a GPU: + + * the GROUPED variant generates the grouped launch/kernel with fully-qualified + ck_tile:: types (so the header does not silently depend on a using-directive); + * the grouped ctypes bridge includes the standard headers it uses directly + rather than relying on transitive includes from the force-included kernel; + * the FNUZ decode table shared by the fp8/bf8 path is cached and read-only. + +No GPU is touched -- codegen is pure string formatting and the helpers are pure. +Run: python3 -m pytest tests/test_grouped_gemm_codegen.py -v +""" + +import sys +import unittest +from pathlib import Path + +SCRIPT_DIR = Path(__file__).parent.resolve() +DISPATCHER_DIR = SCRIPT_DIR.parent +sys.path.insert(0, str(DISPATCHER_DIR / "codegen")) +sys.path.insert(0, str(DISPATCHER_DIR / "python")) + +from codegen_common import TileConfig # noqa: E402 + +from unified_gemm_codegen import ( # noqa: E402 + GemmVariant, + KernelConfig, + TraitConfig, + CKTileKernelGenerator, +) + +from gemm_utils import _fnuz_decode_table # noqa: E402 + +GROUPED_CTYPES_LIB = ( + DISPATCHER_DIR / "bindings" / "ctypes" / "grouped_gemm_ctypes_lib.cpp" +) + + +def _grouped_config() -> KernelConfig: + """A minimal valid grouped-GEMM kernel config (fp16/rcr, cshuffle).""" + tile = TileConfig( + tile_m=128, tile_n=128, tile_k=32, + warp_m=2, warp_n=2, warp_k=1, + warp_tile_m=32, warp_tile_n=32, warp_tile_k=16, + ) + trait = TraitConfig( + pipeline="compv3", epilogue="cshuffle", scheduler="intrawave", + pad_m=False, pad_n=False, pad_k=False, persistent=False, + ) + return KernelConfig(tile=tile, trait=trait, variant=GemmVariant.GROUPED) + + +class TestGroupedVariant(unittest.TestCase): + def test_enum_value(self): + self.assertEqual(GemmVariant.GROUPED.value, "grouped") + + +class TestGroupedCodegen(unittest.TestCase): + """The generated grouped header must be self-contained and correctly typed.""" + + def setUp(self): + gen = CKTileKernelGenerator("fp16", "rcr") + self.src = gen.generate(_grouped_config()) + + def test_generates_grouped_launch_and_kernel(self): + # The grouped path emits the (descs, stream) launch and the grouped kernel. + self.assertIn( + "launch(const std::vector>&", self.src + ) + self.assertIn("ck_tile::GroupedGemmKernel<", self.src) + + def test_device_memory_is_ck_tile_qualified(self): + # DeviceMem lives in the ck_tile namespace; the workspace allocation must + # be fully qualified so the header does not depend on a using-directive. + self.assertIn("ck_tile::DeviceMem workspace_dev", self.src) + # And no bare, unqualified `DeviceMem ` declaration should remain. + import re + + self.assertIsNone( + re.search(r"(?{} descriptors are built here; must be direct. + self.assertIn("std::array", text) + self.assertIn("#include ", text) + + +class TestFnuzTableCaching(unittest.TestCase): + """The 256-entry FNUZ decode table is pure per (exp_bits, mant_bits): it must + be cached and handed out read-only so callers cannot mutate the shared copy.""" + + def test_table_is_cached_same_object(self): + self.assertIs(_fnuz_decode_table(4, 3), _fnuz_decode_table(4, 3)) + self.assertIs(_fnuz_decode_table(5, 2), _fnuz_decode_table(5, 2)) + + def test_table_is_read_only(self): + table = _fnuz_decode_table(4, 3) + self.assertFalse(table.flags.writeable) + with self.assertRaises(ValueError): + table[0] = 1.0 + + +if __name__ == "__main__": + unittest.main() diff --git a/dispatcher/tests/test_multi_abd_bridge.py b/dispatcher/tests/test_multi_abd_bridge.py new file mode 100644 index 00000000000..9f503a1fb5f --- /dev/null +++ b/dispatcher/tests/test_multi_abd_bridge.py @@ -0,0 +1,262 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +"""CPU-only unit tests for the multi_abd GEMM bridge. + +The Tile Engine -> Dispatcher multi_abd bridge relies on one hard invariant: +``GemmKernelConfig.name`` must reproduce, byte-for-byte, the kernel stem that +``unified_gemm_codegen.py`` bakes into the generated kernel (and that the .so +reports at runtime). For multi_abd that stem carries the 4-char (A,B,E,D) +layout plus a ``_multiabd_a{na}_b{nb}_d{nd}_{aop}_{bop}_{cdeop}`` suffix, so +distinct tensor counts / element-wise ops can never collapse onto one kernel. + +These tests exercise only pure host-side logic (name generation, the codegen +JSON projection, and the shipped configs/*.json). No GPU, hipcc, or build is +required, so the suite runs green in CPU-only CI. + +Run: python3 -m pytest tests/test_multi_abd_bridge.py -v +""" + +import ctypes +import json +import sys +import unittest +from pathlib import Path +from unittest import mock + +import numpy as np + +SCRIPT_DIR = Path(__file__).parent.resolve() +DISPATCHER_DIR = SCRIPT_DIR.parent +REPO_ROOT = DISPATCHER_DIR.parent +sys.path.insert(0, str(DISPATCHER_DIR / "python")) + +from gemm_utils import ( # noqa: E402 + GemmKernelConfig, + MultiABDDispatcherLib, + _output_dtype, + _dtype_from_kernel_name, +) + +# The shipped multi_abd sweep configs the bridge codegens from. +_CONFIG_DIR = ( + REPO_ROOT + / "tile_engine" + / "ops" + / "gemm" + / "gemm_multi_abd" + / "configs" +) + + +def _make_config(**overrides): + """A canonical multi_abd config; overrides tweak individual fields.""" + kw = dict( + dtype_a="fp16", + dtype_b="fp16", + dtype_c="fp16", + dtype_acc="fp32", + layout_a="row", + layout_b="col", + layout_c="row", + layout_d="row", + variant="multi_abd", + num_a_tensors=2, + num_b_tensors=2, + num_d_tensors=2, + ) + kw.update(overrides) + return GemmKernelConfig(**kw) + + +class TestMultiAbdName(unittest.TestCase): + """The multi_abd kernel-name contract (the byte-parity invariant).""" + + def test_name_carries_multiabd_suffix(self): + cfg = _make_config() + name = cfg.name + # 4-char (A,B,E,D) layout, not the 3-char C layout. + self.assertIn("_rcrr_", name) + # multiabd tensor-count + op suffix, exactly as codegen emits it. + self.assertTrue( + name.endswith( + "_multiabd_a2_b2_d2_PassThrough_PassThrough_PassThrough" + ), + name, + ) + + def test_full_stem_is_stable(self): + # Pin the entire stem so any drift in the naming scheme is caught. + cfg = _make_config( + tile_m=128, tile_n=128, tile_k=32, + wave_m=2, wave_n=2, wave_k=1, + warp_tile_m=32, warp_tile_n=32, warp_tile_k=16, + pipeline="compv4", scheduler="intrawave", epilogue="cshuffle", + pad_m=True, pad_n=True, pad_k=True, persistent=False, + ) + expected = ( + "gemm_fp16_rcrr_compv4_cshuffle_intrawave" + "_True_True_True_False" + "_128x128x32_2x2x1_32x32x16" + "_multiabd_a2_b2_d2_PassThrough_PassThrough_PassThrough" + ) + self.assertEqual(cfg.name, expected) + + def test_tensor_counts_change_the_name(self): + # Distinct tensor counts must not collapse onto one kernel name. + base = _make_config().name + more = _make_config(num_a_tensors=3, num_d_tensors=1).name + self.assertNotEqual(base, more) + self.assertIn("_a3_", more) + self.assertIn("_d1_", more) + + def test_elementwise_ops_change_the_name(self): + base = _make_config().name + scaled = _make_config(cde_elementwise_op="AddScale").name + self.assertNotEqual(base, scaled) + self.assertTrue(scaled.endswith("_PassThrough_PassThrough_AddScale")) + + def test_dtype_recovers_from_name(self): + # The runner reads the input dtype straight out of the compiled .so + # name, so every dtype the bridge builds must round-trip. + for dtype in ("fp16", "bf16"): + cfg = _make_config( + dtype_a=dtype, dtype_b=dtype, dtype_c=_output_dtype(dtype), + ) + self.assertEqual(_dtype_from_kernel_name(cfg.name), dtype) + + def test_name_carries_four_char_layout(self): + # multi_abd uses the 4-char (A,B,E,D) layout code in the stem; the D + # char must reflect layout_d independently of the C layout. + for la, lb, lc, ld in ( + ("row", "col", "row", "row"), + ("row", "row", "row", "col"), + ("col", "col", "row", "row"), + ): + cfg = _make_config( + layout_a=la, layout_b=lb, layout_c=lc, layout_d=ld, + ) + self.assertIn(f"_{cfg.layout4}_", cfg.name) + + +class TestMultiAbdCodegenJson(unittest.TestCase): + """The codegen JSON projection must carry the multi_abd block.""" + + def test_codegen_json_has_multi_abd_block(self): + cfg = _make_config( + num_a_tensors=2, num_b_tensors=2, num_d_tensors=2, + cde_elementwise_op="AddScale", + ) + j = cfg.to_codegen_json() + self.assertIn("multi_abd_config", j) + mabd = j["multi_abd_config"] + self.assertEqual(mabd["num_a_tensors"], 2) + self.assertEqual(mabd["num_b_tensors"], 2) + self.assertEqual(mabd["num_d_tensors"], 2) + self.assertEqual(mabd["cde_elementwise_op"], "AddScale") + + def test_codegen_json_core_blocks(self): + j = _make_config().to_codegen_json() + self.assertIn("tile_config", j) + self.assertIn("trait_config", j) + # dispatcher wave_* is projected onto codegen warp_* (warps per block). + self.assertEqual(j["tile_config"]["warp_m"], [2]) + + +class TestMultiAbdShippedConfigs(unittest.TestCase): + """The configs/*.json the bridge codegens from must be well-formed sweeps.""" + + def test_config_dir_exists(self): + self.assertTrue(_CONFIG_DIR.is_dir(), _CONFIG_DIR) + + def test_configs_are_valid_sweeps(self): + configs = sorted(_CONFIG_DIR.glob("*.json")) + self.assertGreater(len(configs), 0, "no multi_abd configs shipped") + for path in configs: + with self.subTest(config=path.name): + with open(path) as f: + data = json.load(f) + self.assertIn("tile_config", data) + self.assertIn("trait_config", data) + tc = data["tile_config"] + for key in ( + "tile_m", "tile_n", "tile_k", + "warp_m", "warp_n", "warp_k", + "warp_tile_m", "warp_tile_n", "warp_tile_k", + ): + self.assertIn(key, tc, f"{path.name} missing {key}") + tr = data["trait_config"] + for key in ("pipeline", "scheduler", "epilogue"): + self.assertIn(key, tr, f"{path.name} missing {key}") + + +class TestMultiAbdAbiMarshalling(unittest.TestCase): + """GPU-free tests of the C-ABI marshalling in ``MultiABDDispatcherLib``. + + The ``.so`` is mocked (``ctypes.CDLL`` patched), so no generated kernel or + GPU is needed. These cover the highest-risk-but-previously-untested surface: + the declared ABI, the pointer/stride array packing, the positional argument + order, and status forwarding. + """ + + def _make_lib(self, status=0): + fake = mock.MagicMock() + fake.dispatcher_run_multi_abd.return_value = status + with mock.patch("ctypes.CDLL", return_value=fake): + lib = MultiABDDispatcherLib(Path("/nonexistent/multi_abd.so")) + return lib, fake + + def test_run_abi_argtypes(self): + # The declared argtypes must match, in count and key types, the + # positional arguments run() actually passes (19). + _, fake = self._make_lib() + argt = fake.dispatcher_run_multi_abd.argtypes + self.assertEqual(len(argt), 19) + for i in range(3): # A/B/D host-pointer arrays + self.assertEqual(argt[i], ctypes.POINTER(ctypes.c_void_p)) + self.assertEqual(argt[3], ctypes.c_void_p) # E host pointer + for i in (4, 5, 6): # A/B/D leading-stride arrays + self.assertEqual(argt[i], ctypes.POINTER(ctypes.c_int64)) + self.assertEqual(argt[-1], ctypes.POINTER(ctypes.c_float)) # time_ms + + def test_run_marshals_pointer_arrays_counts_and_order(self): + lib, fake = self._make_lib(status=0) + na, nb, nd = 2, 2, 2 + as_arrays = [np.zeros(4, np.float16) for _ in range(na)] + bs_arrays = [np.zeros(4, np.float16) for _ in range(nb)] + ds_arrays = [np.zeros(4, np.float16) for _ in range(nd)] + e = np.zeros(4, np.float16) + status, _ = lib.run( + as_arrays, bs_arrays, ds_arrays, e, + M=2, N=2, K=2, elem_a=2, elem_b=2, elem_d=2, elem_e=2, + stride_as=[2, 2], stride_bs=[2, 2], stride_ds=[2, 2], stride_e=2, + ) + self.assertEqual(status, 0) + fake.dispatcher_run_multi_abd.assert_called_once() + args = fake.dispatcher_run_multi_abd.call_args[0] + self.assertEqual(len(args), 19) + # A/B/D host-pointer arrays carry exactly one entry per tensor. + self.assertEqual(len(args[0]), na) + self.assertEqual(len(args[1]), nb) + self.assertEqual(len(args[2]), nd) + # Tensor counts occupy positions 12/13/14; M/N/K positions 15/16/17. + self.assertEqual((args[12], args[13], args[14]), (na, nb, nd)) + self.assertEqual((args[15], args[16], args[17]), (2, 2, 2)) + + def test_run_forwards_nonzero_status(self): + # A thin shim must surface the C error code (e.g. -3 tensor-count + # mismatch) verbatim rather than swallowing it. + lib, fake = self._make_lib(status=-3) + a = [np.zeros(4, np.float16)] + status, _ = lib.run( + a, a, a, np.zeros(4, np.float16), + M=1, N=1, K=1, elem_a=2, elem_b=2, elem_d=2, elem_e=2, + stride_as=[1], stride_bs=[1], stride_ds=[1], stride_e=1, + ) + self.assertEqual(status, -3) + + +if __name__ == "__main__": + unittest.main() diff --git a/dispatcher/tests/test_multi_d_bridge.py b/dispatcher/tests/test_multi_d_bridge.py new file mode 100644 index 00000000000..61ebf4e0663 --- /dev/null +++ b/dispatcher/tests/test_multi_d_bridge.py @@ -0,0 +1,175 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +"""CPU-only unit tests for the multi_d GEMM bridge. + +Multi-D GEMM fuses one or more extra D operands into the epilogue +(E = elementwise_op(A@B, D0, D1, ...)). Its kernel therefore differs from plain +GEMM by a 4-char (A,B,C,D) layout code plus a +``_multid_{elementwise_op}_d{num_d_tensors}`` name suffix. That suffix is the +byte-parity invariant tying config -> codegen -> the compiled kernel name the +runtime reports, so distinct D-counts / element-wise ops never collapse onto one +kernel. The same two knobs are surfaced in the codegen JSON's +``multi_d_config`` block, which is where unified_gemm_codegen expands them. + +Everything under test is pure host-side logic (name generation, the codegen +JSON projection, and the shipped configs/*.json). No GPU, hipcc, or dispatcher +build is required. + +Run: python3 -m pytest projects/composablekernel/dispatcher/tests/test_multi_d_bridge.py -v +""" + +import json +import sys +import unittest +from pathlib import Path + +SCRIPT_DIR = Path(__file__).parent.resolve() +DISPATCHER_DIR = SCRIPT_DIR.parent +REPO_ROOT = DISPATCHER_DIR.parent +sys.path.insert(0, str(DISPATCHER_DIR / "python")) + +from gemm_utils import ( # noqa: E402 + GemmKernelConfig, + _output_dtype, + _dtype_from_kernel_name, +) + +_CONFIG_DIR = ( + REPO_ROOT + / "tile_engine" + / "ops" + / "gemm" + / "gemm_multi_d" + / "configs" +) + + +def _make_config(**overrides): + kw = dict( + dtype_a="fp16", + dtype_b="fp16", + dtype_c="fp16", + dtype_acc="fp32", + layout_a="row", + layout_b="col", + layout_c="row", + d_layout="row", + variant="multi_d", + elementwise_op="MultiDAdd", + num_d_tensors=1, + ) + kw.update(overrides) + return GemmKernelConfig(**kw) + + +class TestMultiDName(unittest.TestCase): + """The multi_d kernel-name contract (the byte-parity invariant).""" + + def test_name_carries_multid_suffix(self): + cfg = _make_config() + self.assertTrue( + cfg.name.endswith("_multid_MultiDAdd_d1"), cfg.name + ) + + def test_name_uses_four_char_layout(self): + # multi_d appends the D layout char after the 3-char A,B,C code. + for la, lb, lc, ld in ( + ("row", "col", "row", "row"), + ("row", "row", "row", "col"), + ("col", "col", "row", "row"), + ): + cfg = _make_config( + layout_a=la, layout_b=lb, layout_c=lc, d_layout=ld, + ) + four = cfg.layout + ("r" if ld == "row" else "c") + self.assertIn(f"_{four}_", cfg.name) + + def test_full_stem_is_stable(self): + cfg = _make_config( + tile_m=128, tile_n=128, tile_k=32, + wave_m=2, wave_n=2, wave_k=1, + warp_tile_m=32, warp_tile_n=32, warp_tile_k=16, + pipeline="compv4", scheduler="intrawave", epilogue="cshuffle", + pad_m=True, pad_n=True, pad_k=True, persistent=False, + elementwise_op="MultiDAdd", num_d_tensors=2, + ) + expected = ( + "gemm_fp16_rcrr_compv4_cshuffle_intrawave" + "_True_True_True_False" + "_128x128x32_2x2x1_32x32x16" + "_multid_MultiDAdd_d2" + ) + self.assertEqual(cfg.name, expected) + + def test_d_count_changes_the_name(self): + one = _make_config(num_d_tensors=1).name + two = _make_config(num_d_tensors=2).name + self.assertNotEqual(one, two) + self.assertTrue(one.endswith("_d1")) + self.assertTrue(two.endswith("_d2")) + + def test_elementwise_op_changes_the_name(self): + add = _make_config(elementwise_op="MultiDAdd").name + mul = _make_config(elementwise_op="MultiDMultiply").name + self.assertNotEqual(add, mul) + self.assertIn("_multid_MultiDMultiply_", mul) + + def test_dtype_recovers_from_name(self): + for dtype in ("fp16", "bf16"): + cfg = _make_config( + dtype_a=dtype, dtype_b=dtype, dtype_c=_output_dtype(dtype), + ) + self.assertEqual(_dtype_from_kernel_name(cfg.name), dtype) + + +class TestMultiDCodegenJson(unittest.TestCase): + """The codegen JSON must carry the multi_d_config block.""" + + def test_codegen_json_has_multi_d_block(self): + cfg = _make_config(elementwise_op="MultiDAdd", num_d_tensors=2) + j = cfg.to_codegen_json() + self.assertIn("multi_d_config", j) + md = j["multi_d_config"] + self.assertEqual(md["elementwise_ops"], ["MultiDAdd"]) + self.assertEqual(md["num_d_tensors"], [2]) + + def test_codegen_json_core_blocks(self): + j = _make_config().to_codegen_json() + self.assertIn("tile_config", j) + self.assertIn("trait_config", j) + # dispatcher wave_* is projected onto codegen warp_* (warps per block). + self.assertEqual(j["tile_config"]["warp_m"], [2]) + + +class TestMultiDShippedConfigs(unittest.TestCase): + """The configs/*.json the bridge codegens from must be well-formed sweeps.""" + + def test_config_dir_exists(self): + self.assertTrue(_CONFIG_DIR.is_dir(), _CONFIG_DIR) + + def test_configs_are_valid_sweeps(self): + configs = sorted(_CONFIG_DIR.glob("*.json")) + self.assertGreater(len(configs), 0, "no multi_d configs shipped") + for path in configs: + with self.subTest(config=path.name): + with open(path) as f: + data = json.load(f) + self.assertIn("tile_config", data) + self.assertIn("trait_config", data) + tc = data["tile_config"] + for key in ( + "tile_m", "tile_n", "tile_k", + "warp_m", "warp_n", "warp_k", + "warp_tile_m", "warp_tile_n", "warp_tile_k", + ): + self.assertIn(key, tc, f"{path.name} missing {key}") + tr = data["trait_config"] + for key in ("pipeline", "scheduler", "epilogue"): + self.assertIn(key, tr, f"{path.name} missing {key}") + + +if __name__ == "__main__": + unittest.main() diff --git a/dispatcher/tests/test_mx_gemm_bridge.py b/dispatcher/tests/test_mx_gemm_bridge.py new file mode 100644 index 00000000000..4eb5da021e1 --- /dev/null +++ b/dispatcher/tests/test_mx_gemm_bridge.py @@ -0,0 +1,266 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +"""CPU-only unit tests for the microscaling (mx) GEMM TileEngine -> Dispatcher bridge. + +Locks the config name format, the codegen-JSON projection, the dtype/layout/warp-tile +validity gate, the e8m0 scale codec, the fp8/fp4 quantization round-trips, and the numpy +microscaled reference. No GPU, no hipcc, no Old-TE builder import required. +""" + +import sys +import unittest +from pathlib import Path + +import numpy as np + +_DISP = Path(__file__).resolve().parent.parent +sys.path.insert(0, str(_DISP / "python")) +sys.path.insert(0, str(_DISP / "codegen")) + +from mx_gemm_utils import ( # noqa: E402 + SCALE_BLOCK, + E8M0_ONE, + MxGemmKernelConfig, + MxGemmProblem, + default_fp8_config, + default_fp4_config, + e8m0_to_float, + float_to_e8m0, + quantize_fp8, + dequantize_fp8, + quantize_fp4_packed, + dequantize_fp4_packed, + mx_gemm_reference, +) + + +class TestConfigName(unittest.TestCase): + def test_fallback_name_prefix(self): + cfg = default_fp8_config() + self.assertTrue(cfg._fallback_name().startswith("mx_gemm_fp8_rcr_")) + + def test_fallback_name_encodes_tiles(self): + cfg = MxGemmKernelConfig( + datatype="fp4", tile_m=64, tile_n=128, tile_k=256, + warp_m=1, warp_n=2, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=128, + ) + name = cfg._fallback_name() + self.assertIn("_fp4_rcr_", name) + self.assertIn("64x128x256", name) + self.assertIn("1x2x1", name) + self.assertIn("16x16x128", name) + self.assertNotIn(" ", name) + + def test_persistent_suffix_only_when_set(self): + self.assertNotIn("True", default_fp8_config()._fallback_name()) + cfg = default_fp8_config() + cfg.persistent = True + self.assertIn("True", cfg._fallback_name()) + + +class TestCodegenJson(unittest.TestCase): + def test_projection_roundtrip(self): + cfg = MxGemmKernelConfig( + datatype="fp8", tile_m=128, tile_n=128, tile_k=128, + warp_m=2, warp_n=2, warp_k=1, + warp_tile_m=16, warp_tile_n=16, warp_tile_k=128, + k_block_per_cu=3, + # Pin the arch so to_codegen_config() does not shell out to rocminfo; + # keeps this a CPU-only test on non-ROCm runners. + gpu_target="gfx950", + ) + j = cfg.to_codegen_config() + self.assertEqual(j["datatype"], "fp8") + self.assertEqual(j["layout"], "rcr") + self.assertEqual(j["tile_config"]["tile_k"], 128) + self.assertEqual(j["tile_config"]["warp_tile_k"], 128) + self.assertEqual(j["k_block_per_cu"], 3) + + +class TestValidity(unittest.TestCase): + def test_default_configs_valid(self): + self.assertTrue(default_fp8_config().is_valid()) + self.assertTrue(default_fp4_config().is_valid()) + + def test_non_rcr_rejected(self): + cfg = default_fp8_config() + cfg.layout = "rrr" + self.assertFalse(cfg.is_valid()) + + def test_bad_dtype_rejected(self): + cfg = default_fp8_config() + cfg.datatype = "bf16" + self.assertFalse(cfg.is_valid()) + + def test_bf8_rejected(self): + # Old-TE argparse (choices=["fp4","fp8"]) + validate_gemm_mx never + # compile bf8/e5m2 for mx_gemm, so the bridge must reject it too. Assert + # both the config-level gate (is_valid) and, when importable, the + # codegen-level gate (_validate) refuse dtype="bf8". + cfg = default_fp8_config() + cfg.datatype = "bf8" + # Pin the arch so to_codegen_config() below stays CPU-only (no rocminfo). + cfg.gpu_target = "gfx950" + self.assertFalse(cfg.is_valid()) + + try: + from unified_mx_gemm_codegen import _validate # noqa: E402 + except Exception as exc: # noqa: BLE001 + self.skipTest(f"codegen import unavailable: {exc}") + with self.assertRaises(Exception): + _validate(cfg.to_codegen_config()) + + def test_wrong_warp_tile_rejected(self): + cfg = default_fp8_config() + cfg.warp_tile_k = 64 + self.assertFalse(cfg.is_valid()) + + def test_indivisible_tile_rejected(self): + cfg = default_fp8_config() + cfg.tile_m = 100 # not a multiple of warp_m * warp_tile_m (2*16=32) + self.assertFalse(cfg.is_valid()) + + +class TestProblem(unittest.TestCase): + def test_scale_k_and_flops(self): + p = MxGemmProblem(M=64, N=128, K=256) + self.assertEqual(p.scale_k, 256 // SCALE_BLOCK) + self.assertEqual(p.flops, 2 * 64 * 128 * 256) + + def test_k_not_multiple_of_32_raises(self): + with self.assertRaises(ValueError): + MxGemmProblem(M=32, N=32, K=48) + + +class TestE8m0Codec(unittest.TestCase): + def test_one_is_byte_127(self): + self.assertEqual(int(float_to_e8m0(np.float32(1.0))), E8M0_ONE) + self.assertEqual(float(e8m0_to_float(E8M0_ONE)), 1.0) + + def test_power_of_two_roundtrip(self): + for s in (0.25, 0.5, 1.0, 2.0, 4.0, 8.0): + b = float_to_e8m0(np.float32(s)) + self.assertAlmostEqual(float(e8m0_to_float(b)), s, places=6) + + def test_255_is_nan(self): + with np.errstate(over="ignore"): + self.assertTrue(np.isnan(float(e8m0_to_float(255)))) + + def test_non_positive_raises(self): + # Contract is a strictly-positive power-of-two; a 0.0/negative scale is a + # caller bug and must fail loudly rather than silently encode 1.0. + for bad in (0.0, -1.0, -0.0): + with self.assertRaises(ValueError): + float_to_e8m0(np.float32(bad)) + with self.assertRaises(ValueError): + float_to_e8m0(np.array([1.0, 0.0, 2.0], np.float32)) + + def test_non_finite_raises(self): + with np.errstate(invalid="ignore"): + for bad in (np.inf, np.nan): + with self.assertRaises(ValueError): + float_to_e8m0(np.float32(bad)) + + +class TestFp8Codec(unittest.TestCase): + def test_known_bytes(self): + self.assertEqual(int(quantize_fp8(np.array([1.0], np.float32))[0]), 0x38) + self.assertEqual(int(quantize_fp8(np.array([-2.0], np.float32))[0]), 0xC0) + + def test_roundtrip_grid(self): + grid = np.array([-2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0], np.float32) + vals = np.tile(grid, (4, 1)) + self.assertTrue(np.array_equal(dequantize_fp8(quantize_fp8(vals)), vals)) + + def test_off_grid_raises(self): + # The vectorized codec must reject values not on the exact e4m3 grid + # instead of snapping them to a neighbour byte. + with self.assertRaises(KeyError): + quantize_fp8(np.array([[0.3]], np.float32)) + + def test_neg_zero_collapses_to_zero_byte(self): + self.assertEqual(int(quantize_fp8(np.array([-0.0], np.float32))[0]), 0x00) + + def test_shape_preserved_2d(self): + vals = np.full((3, 5), 1.0, np.float32) + self.assertEqual(quantize_fp8(vals).shape, (3, 5)) + + +class TestFp4Codec(unittest.TestCase): + def test_pack_two_per_byte(self): + # one row, K=2 -> a single packed byte; low nibble even-K, high nibble odd-K. + vals = np.array([[1.0, 2.0]], np.float32) # codes: 1.0->2, 2.0->4 + packed = quantize_fp4_packed(vals) + self.assertEqual(packed.shape, (1, 1)) + self.assertEqual(int(packed[0, 0]), (4 << 4) | 2) + + def test_roundtrip_grid(self): + grid = np.array([-2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5, 2.0], np.float32) + rng = np.random.default_rng(0) + vals = rng.choice(grid, size=(4, 8)).astype(np.float32) + packed = quantize_fp4_packed(vals) + self.assertEqual(packed.shape, (4, 4)) + self.assertTrue(np.array_equal(dequantize_fp4_packed(packed, 8), vals)) + + def test_off_grid_raises(self): + # 2.5 exists in fp8 e4m3 but NOT in the fp4 e2m1 grid -> must reject. + with self.assertRaises(KeyError): + quantize_fp4_packed(np.array([[2.5, 1.0]], np.float32)) + + +class TestReference(unittest.TestCase): + def _inputs(self, M, N, K, seed=0): + rng = np.random.default_rng(seed) + grid = np.array([-2.0, -1.0, -0.5, 0.5, 1.0, 2.0], np.float32) + A = rng.choice(grid, size=(M, K)).astype(np.float32) + B = rng.choice(grid, size=(K, N)).astype(np.float32) + return A, B + + def test_unit_scales_equals_plain_matmul(self): + M, N, K = 4, 3, 32 + A, B = self._inputs(M, N, K) + prob = MxGemmProblem(M=M, N=N, K=K) + one = int(float_to_e8m0(np.float32(1.0))) + sa = np.full((M, prob.scale_k), one, np.uint8) + sb = np.full((N, prob.scale_k), one, np.uint8) + ref = mx_gemm_reference(A, B, sa, sb, prob).astype(np.float32) + plain = (A @ B).astype(np.float16).astype(np.float32) + self.assertTrue(np.allclose(ref, plain, atol=1e-2)) + + def test_power_of_two_scale_multiplies(self): + M, N, K = 4, 3, 32 + A, B = self._inputs(M, N, K, seed=1) + prob = MxGemmProblem(M=M, N=N, K=K) + two = int(float_to_e8m0(np.float32(2.0))) + sa = np.full((M, prob.scale_k), two, np.uint8) + sb = np.full((N, prob.scale_k), two, np.uint8) + ref = mx_gemm_reference(A, B, sa, sb, prob).astype(np.float32) + # scale_a=2 and scale_b=2 -> product scaled by 4. + expected = (4.0 * (A @ B)).astype(np.float16).astype(np.float32) + self.assertTrue(np.allclose(ref, expected, atol=1e-1)) + + +class TestCodegenNameContract(unittest.TestCase): + """Optional: byte-exact name parity when the Old-TE builder is importable.""" + + def test_codegen_name_matches_config(self): + try: + from unified_mx_gemm_codegen import kernel_name + except Exception as exc: # noqa: BLE001 + self.skipTest(f"codegen import unavailable: {exc}") + cfg = default_fp8_config() + # Pin the arch so to_codegen_config() stays CPU-only (no rocminfo). + cfg.gpu_target = "gfx950" + try: + name = kernel_name(cfg.to_codegen_config()) + except Exception as exc: # noqa: BLE001 + self.skipTest(f"Old-TE builder unavailable: {exc}") + self.assertTrue(name.startswith("mx_gemm_fp8_rcr_")) + + +if __name__ == "__main__": + unittest.main() diff --git a/dispatcher/tests/test_rules_coverage.py b/dispatcher/tests/test_rules_coverage.py new file mode 100755 index 00000000000..f0f4ce6fb7c --- /dev/null +++ b/dispatcher/tests/test_rules_coverage.py @@ -0,0 +1,571 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +Unit tests verifying the subset/coverage relationships between rule sets. + +The rule sets form a containment hierarchy. These tests assert that hierarchy +holds, comparing the canonical kernel-instance keys produced by each rule set +via ``get_default_configs``: + + - "full" contains all instances from "profiler" (the CK Builder profiler set) + - "full" contains all instances from "tests" (the CK Builder tests set) + - "full-tests" is a subset of "full" + - "tiny" is a subset of "full-tests" + +Each relationship is checked for every supported architecture, across all +variants (forward / bwd_data / bwd_weight), 2D + 3D, and every datatype +(fp16 / bf16 / fp32). Both GEMM and depthwise instances are included. + +Run: + python3 -m pytest dispatcher/tests/test_rules_coverage.py -v +or: + cd projects/composablekernel/dispatcher + python3 -m pytest tests/test_rules_coverage.py -v +""" + +import sys +import unittest +from pathlib import Path +from typing import Dict, FrozenSet, List, Set, Tuple + +SCRIPT_DIR = Path(__file__).parent.resolve() +DISPATCHER_DIR = SCRIPT_DIR.parent +sys.path.insert(0, str(DISPATCHER_DIR / "codegen")) +sys.path.insert(0, str(DISPATCHER_DIR / "codegen" / "grouped_conv")) + +from unified_grouped_conv_codegen import ( # noqa: E402 + DepthwiseConvKernelConfig, + GroupedConvKernelConfig, + GroupedConvTraitConfig, + GroupedConvVariant, + StreamKConfig, + StreamKReductionStrategy, + TileConfig, + get_default_configs, +) + +# CK Builder native codegen — the .conf parsers are used here as the +# independent ground-truth reference (see CKBuilderEquivalenceTest below). +_BUILDER_DIR = ( + DISPATCHER_DIR.parent + / "experimental" + / "grouped_convolution_tile_instances" +) +sys.path.insert(0, str(_BUILDER_DIR)) + +import generate_instances as gi # noqa: E402 +from grouped_config_rules_builder import ( # noqa: E402 + map_pipeline_version, + map_scheduler, + map_specialization, +) + +# CK Builder .conf source directory. +_BUILDER_CONFIGS_DIR = _BUILDER_DIR / "configs" + +# --------------------------------------------------------------------------- +# Generation parameters — cover the full instance space so the subset checks +# are exhaustive (every arch / variant / ndim / datatype). +# --------------------------------------------------------------------------- + +ARCHS: List[str] = ["gfx942", "gfx950"] + +# GroupedConvVariant.FORWARD_DEPTHWISE is intentionally omitted: depthwise +# instances follow a separate generation/validation path (the depthwise rule +# set and test_depthwise_tile_math.py), not the XDL GEMM variant cross-product +# whose coverage this test verifies. +VARIANTS = [ + GroupedConvVariant.FORWARD, + GroupedConvVariant.BACKWARD_DATA, + GroupedConvVariant.BACKWARD_WEIGHT, +] + +NDIMS: List[int] = [2, 3] + +DATATYPES: List[str] = ["fp16", "bf16", "fp32"] + + +# --------------------------------------------------------------------------- +# Canonical key generation +# --------------------------------------------------------------------------- + +def _config_to_key(cfg) -> FrozenSet: + """Convert a kernel config to a canonical, hashable key. + + The key captures everything that distinguishes one emitted kernel instance + from another (tile/warp/vector shape, traits, datatype, ndim, variant), so + that set containment corresponds to "generates the same instances". + """ + if isinstance(cfg, DepthwiseConvKernelConfig): + # Depthwise configs have a distinct shape; key off the unique kernel + # name (which encodes all tile/stride/pad/vec parameters) + datatype. + return frozenset({ + ("kind", "depthwise"), + ("datatype", cfg.datatype), + ("ndim_spatial", cfg.ndim_spatial), + ("name", cfg.name(cfg.datatype)), + }) + + t = cfg.tile + tr = cfg.trait + sk = tr.streamk_config + + return frozenset({ + ("kind", "gemm"), + ("datatype", cfg.datatype), + ("variant", str(cfg.variant)), + ("ndim_spatial", cfg.ndim_spatial), + ("tile_m", t.tile_m), + ("tile_n", t.tile_n), + ("tile_k", t.tile_k), + ("warp_m", t.warp_m), + ("warp_n", t.warp_n), + ("warp_k", t.warp_k), + ("warp_tile_m", t.warp_tile_m), + ("warp_tile_n", t.warp_tile_n), + ("warp_tile_k", t.warp_tile_k), + ("pipeline", tr.pipeline), + ("scheduler", tr.scheduler), + ("vec_a", cfg.vector_size_a), + ("vec_b", cfg.vector_size_b), + ("vec_c", cfg.vector_size_c), + ("double_smem_buffer", tr.double_smem_buffer), + ("two_stage", tr.two_stage), + ("explicit_gemm", tr.explicit_gemm), + ("split_image", tr.split_image), + ("num_groups_to_merge", tr.num_groups_to_merge), + ("specialization", tr.specialization or "default"), + ("streamk_enabled", sk.streamk_enabled), + ("streamk_persistent", sk.streamk_persistent if sk.streamk_enabled else False), + }) + + +# Cache generated key sets keyed by (rule_set, arch) — generation is the +# expensive part and every test reuses the same sets. +_KEY_CACHE: Dict[Tuple[str, str], Set[FrozenSet]] = {} + + +def _rule_set_keys(rule_set: str, arch: str) -> Set[FrozenSet]: + """Generate the canonical key set for ``rule_set`` on ``arch``.""" + cache_key = (rule_set, arch) + if cache_key not in _KEY_CACHE: + cfgs = get_default_configs( + arch=arch, + variants=VARIANTS, + ndims=NDIMS, + datatypes=DATATYPES, + rule_set=rule_set, + ) + _KEY_CACHE[cache_key] = {_config_to_key(c) for c in cfgs} + return _KEY_CACHE[cache_key] + + +# Short, stable variant labels for the per-variant coverage breakdown. +_VARIANT_LABELS: Dict[str, str] = { + str(GroupedConvVariant.FORWARD): "forward", + str(GroupedConvVariant.BACKWARD_DATA): "bwd_data", + str(GroupedConvVariant.BACKWARD_WEIGHT): "bwd_weight", +} + + +def _variant_label(key: FrozenSet) -> str: + """Return the short variant label for a key ('depthwise' for depthwise).""" + d = dict(key) + if d.get("kind") == "depthwise": + return "depthwise" + return _VARIANT_LABELS.get(d.get("variant"), str(d.get("variant"))) + + +def _print_coverage_report( + arch: str, + sub_name: str, + sup_name: str, + sub_keys: Set[FrozenSet], + sup_keys: Set[FrozenSet], + covered: Set[FrozenSet], + missing: Set[FrozenSet], + extra: Set[FrozenSet], + show_missing: int = 20, +) -> None: + """Print a coverage report mirroring the original CLI output. + + ``sub_name`` is the reference (ground-truth) set, ``sup_name`` the generated + set that should contain it. + """ + n_ref = len(sub_keys) + n_covered = len(covered) + n_missing = len(missing) + n_extra = len(extra) + coverage_pct = 100.0 * n_covered / n_ref if n_ref > 0 else 0.0 + + print("\n" + "=" * 70) + print(f"COVERAGE REPORT [arch={arch}]") + print(f"Reference: '{sub_name}' Generated: '{sup_name}'") + print("=" * 70) + print(f"Reference instances (unique): {n_ref}") + print(f"Generated configs (unique): {len(sup_keys)}") + print(f"Covered by rules: {n_covered} ({coverage_pct:.1f}%)") + print(f"Missing from rules: {n_missing}") + print(f"Extra in rules (not in ref): {n_extra}") + + if missing: + limit = show_missing if show_missing > 0 else n_missing + missing_sorted = sorted(missing, key=str) + print(f"\n--- Missing instances (showing {min(limit, n_missing)} of {n_missing}) ---") + for key in missing_sorted[:limit]: + print(_format_key(key)) + if n_missing > limit: + print(f" ... and {n_missing - limit} more.") + + # Summary by variant. + print("\n--- Coverage by variant ---") + variants = sorted({_variant_label(k) for k in sub_keys}) + for var in variants: + r_keys = {k for k in sub_keys if _variant_label(k) == var} + c_keys = {k for k in covered if _variant_label(k) == var} + m_keys = {k for k in missing if _variant_label(k) == var} + pct = 100.0 * len(c_keys) / len(r_keys) if r_keys else 0.0 + print(f" {var:15s}: {len(c_keys):4d}/{len(r_keys):4d} covered " + f"({pct:5.1f}%), {len(m_keys):4d} missing") + print("=" * 70) + + if n_missing == 0: + print(f"[PASS] '{sup_name}' fully contains all '{sub_name}' instances!") + else: + print(f"[FAIL] {n_missing} '{sub_name}' instances are not covered by '{sup_name}'.") + + +def _format_key(key: FrozenSet) -> str: + """Human-readable one-line summary of a canonical key (for failures).""" + d = dict(key) + if d.get("kind") == "depthwise": + return f" [depthwise/{d.get('datatype')}/{d.get('ndim_spatial')}d] {d.get('name')}" + tile = f"({d.get('tile_m')},{d.get('tile_n')},{d.get('tile_k')})" + wave = f"({d.get('warp_m')},{d.get('warp_n')},{d.get('warp_k')})" + warp = f"({d.get('warp_tile_m')},{d.get('warp_tile_n')},{d.get('warp_tile_k')})" + vec = f"({d.get('vec_a')},{d.get('vec_b')},{d.get('vec_c')})" + return ( + f" [{d.get('variant')}/{d.get('ndim_spatial')}d/{d.get('datatype')}] " + f"tile={tile} wave={wave} warp={warp} " + f"pipe={d.get('pipeline')}/{d.get('scheduler')} vec={vec} " + f"spec={d.get('specialization')}" + ) + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + +class RuleSetCoverageTest(unittest.TestCase): + """Assert the rule-set containment hierarchy holds on every arch.""" + + def assert_subset(self, sub_name: str, sup_name: str, arch: str) -> None: + """Assert every instance of ``sub_name`` appears in ``sup_name``. + + Prints a coverage report (mirroring the original + ``validate_rules_coverage.py`` CLI output) treating ``sub_name`` as the + reference set and ``sup_name`` as the generated set. + """ + sub_keys = _rule_set_keys(sub_name, arch) + sup_keys = _rule_set_keys(sup_name, arch) + + self.assertGreater( + len(sub_keys), 0, + f"[{arch}] rule set '{sub_name}' produced no instances", + ) + + covered = sub_keys & sup_keys + missing = sub_keys - sup_keys + extra = sup_keys - sub_keys + + _print_coverage_report(arch, sub_name, sup_name, sub_keys, sup_keys, + covered, missing, extra) + + if missing: + preview = "\n".join(_format_key(k) for k in sorted(missing, key=str)[:20]) + more = f"\n ... and {len(missing) - 20} more." if len(missing) > 20 else "" + self.fail( + f"[{arch}] '{sup_name}' is missing {len(missing)} of " + f"{len(sub_keys)} instances from '{sub_name}':\n{preview}{more}" + ) + + +# Containment relationships to verify: (test label, sub set, super set). +# ``sub`` must be fully contained in ``super``. +_RELATIONSHIPS: List[Tuple[str, str, str]] = [ + ("full_contains_profiler", "profiler", "full"), + ("full_contains_tests", "tests", "full"), + ("full_tests_is_subset_of_full", "full-tests", "full"), + ("tiny_is_subset_of_full_tests", "tiny", "full-tests"), +] + + +def _make_subset_test(sub_name: str, sup_name: str, arch: str): + def test(self: RuleSetCoverageTest) -> None: + self.assert_subset(sub_name, sup_name, arch) + + test.__doc__ = f"[{arch}] '{sup_name}' must contain every '{sub_name}' instance." + return test + + +# Generate one test method per (relationship, arch) so the architecture shows +# up directly in the test id (e.g. ``test_full_contains_profiler_gfx942``), +# making it visible under ``pytest -v`` without needing ``-s``. +for _label, _sub, _sup in _RELATIONSHIPS: + for _arch in ARCHS: + setattr( + RuleSetCoverageTest, + f"test_{_label}_{_arch}", + _make_subset_test(_sub, _sup, _arch), + ) + +del _label, _sub, _sup, _arch + + +# =========================================================================== +# CK Builder equivalence +# =========================================================================== +# +# The dispatcher's "profiler" and "tests" rule sets are derived from the CK +# Builder ``.conf`` configurations. These tests assert exact equivalence: the +# instance set produced by each dispatcher rule set is identical (same count, +# same instances) to the set produced by the corresponding CK Builder mode +# ("profiler" / "tests"). +# +# The reference is built independently of the dispatcher's builder rule-set +# module by calling the CK Builder's own native parsers +# (``generate_instances.parse_*_instances``) directly on the ``.conf`` files, +# then converting each parsed instance to a dispatcher config with the same +# canonical key used everywhere else in this file. The only logic shared with +# the dispatcher is the pure field-mapping helpers (``map_pipeline_version`` / +# ``map_scheduler`` / ``map_specialization``), which are CK Builder field +# translations, not generation logic. +# + +# (config_dir, configs_list, native_parser, dispatcher_variant_enum). +# Each .conf lives at configs///.conf. +_CKB_SPECS = [ + ("forward", gi.fwd_configs, gi.parse_fwd_instances, GroupedConvVariant.FORWARD), + ("backward_weight", gi.bwd_weight_configs, gi.parse_bwd_weight_instances, GroupedConvVariant.BACKWARD_WEIGHT), + ("backward_data", gi.bwd_data_configs, gi.parse_bwd_data_instances, GroupedConvVariant.BACKWARD_DATA), +] + + +def _ckb_layout_of(cfg_name: str) -> str: + """Layout token of a CK Builder config name (e.g. 'nhwgc_fp16' -> 'nhwgc').""" + return cfg_name.split("_")[0] + + +def _ckb_dtype_of(cfg_name: str) -> str: + """Datatype token of a CK Builder config name (e.g. 'nhwgc_fp16' -> 'fp16').""" + return cfg_name.split("_")[1] + + +def _ckb_ndim_of(cfg_name: str) -> int: + """Spatial dims of a CK Builder config: nhwgc -> 2D, ndhwgc -> 3D.""" + return 2 if cfg_name.startswith("nhwgc") else 3 + + +def _ckb_param_to_config(p, variant, ndim, dtype, layout, arch): + """Convert one ``ConvInstanceTemplateParams`` (CK Builder) into a dispatcher + ``GroupedConvKernelConfig``. + + The reference must reflect what the CK Builder ``profiler`` / ``tests`` modes + actually emit — the ground truth. The CK Builder native + parsers already apply CK Builder's own validity filtering (the WMMA / native + warp-tile checks), so the parsed instances are exactly the CK Builder set. + + This conversion therefore applies only the one transform the dispatcher + builder path genuinely performs and that CK Builder mirrors: the bwd_weight + ``compv2`` / ``basic_v2`` skip (that pipeline is not compatible with CK + Tile's ``GroupedConvolutionBackwardWeightKernel``). It deliberately does + not apply the dispatcher's ``is_valid_for_arch()`` filter: that filter is + a dispatcher-side gate that CK Builder does not apply, so folding it into the + reference would hide any over-/under-filtering regression in the dispatcher + builder rule set (e.g. wrongly dropping valid ``warp_k=2`` instances). The + dispatcher rule set is required to reproduce the full CK Builder set. + + Returns ``None`` only for the bwd_weight compv2/basic_v2 instances that + neither CK Builder nor the dispatcher emit. + """ + pipeline = map_pipeline_version(p.pipeline_version) + scheduler = map_scheduler(p.scheduler) + specialization = map_specialization(p.specialization) + + # compv2/basic_v2 (GemmPipelineAGmemBGmemCRegV2) is not compatible with CK + # Tile's GroupedConvolutionBackwardWeightKernel — the dispatcher skips it. + if variant == GroupedConvVariant.BACKWARD_WEIGHT and pipeline in ("compv2", "basic_v2"): + return None + + trait = GroupedConvTraitConfig( + pipeline=pipeline, + scheduler=scheduler, + epilogue="cshuffle", + pad_m=True, + pad_n=True, + pad_k=True, + double_smem_buffer=p.double_smem_buffer, + num_groups_to_merge=p.num_groups_to_merge, + split_image=p.split_image, + explicit_gemm=p.explicit_gemm, + two_stage=p.is_two_stage_instance, + specialization=specialization, + streamk_config=StreamKConfig( + streamk_enabled=p.streamk_enabled, + strategy=StreamKReductionStrategy(p.streamk_reduction_strategy), + streamk_persistent=p.streamk_persistent, + ) if p.streamk_enabled else StreamKConfig(), + ) + + config = GroupedConvKernelConfig( + tile=TileConfig( + tile_m=p.tile_size[0], + tile_n=p.tile_size[1], + tile_k=p.tile_size[2], + warp_m=p.warps[0], + warp_n=p.warps[1], + warp_k=p.warps[2], + warp_tile_m=p.warp_tile[0], + warp_tile_n=p.warp_tile[1], + warp_tile_k=p.warp_tile[2], + ), + trait=trait, + variant=variant, + ndim_spatial=ndim, + arch=arch, + layout=layout, + vector_size_a=p.scalar_per_vector[0], + vector_size_b=p.scalar_per_vector[1], + vector_size_c=p.scalar_per_vector[2], + num_wave_groups=p.num_wave_groups, + ) + config.datatype = dtype + return config + + +# Cache the independently-built CK Builder reference key sets by (mode, arch). +_CKB_REF_CACHE: Dict[Tuple[str, str], Set[FrozenSet]] = {} + + +def _ckb_reference_keys(mode: str, arch: str) -> Set[FrozenSet]: + """Build the CK Builder reference key set for ``mode`` ("profiler"/"tests") + by parsing the ``.conf`` files with the native CK Builder parsers.""" + cache_key = (mode, arch) + if cache_key in _CKB_REF_CACHE: + return _CKB_REF_CACHE[cache_key] + + # The CK Builder parsers derive warp_k from the architecture warp size + # (64 for CDNA gfx9, 32 for RDNA). It must be passed explicitly to match the + # dispatcher's builder rule set, which does the same; otherwise the parser + # default of 32 doubles warp_k on gfx9 and the reference would not match. + warp_size = gi.get_warp_size(arch) + + keys: Set[FrozenSet] = set() + for config_dir, cfg_list, parser, variant in _CKB_SPECS: + for cfg_name in cfg_list: + layout = _ckb_layout_of(cfg_name) + dtype = _ckb_dtype_of(cfg_name) + ndim = _ckb_ndim_of(cfg_name) + conf_path = _BUILDER_CONFIGS_DIR / config_dir / mode / f"{cfg_name}.conf" + if not conf_path.exists(): + continue + with open(conf_path, "r", encoding="utf-8") as f: + lines = f.readlines() + problem_name = f"grouped_convolution_{config_dir}_tile_{cfg_name}" + raw = parser(lines, problem_name, warp_size=warp_size, verbose=False) + for p in raw: + cfg = _ckb_param_to_config(p, variant, ndim, dtype, layout, arch) + if cfg is not None: + keys.add(_config_to_key(cfg)) + + _CKB_REF_CACHE[cache_key] = keys + return keys + + +class CKBuilderEquivalenceTest(unittest.TestCase): + """Assert each dispatcher builder-derived rule set ("profiler" / "tests") + produces exactly the same instances as the corresponding CK Builder mode.""" + + def assert_equivalent(self, rule_set: str, mode: str, arch: str) -> None: + """Assert the dispatcher ``rule_set`` and CK Builder ``mode`` produce an + identical instance set on ``arch`` (matching count, then content).""" + ref_keys = _ckb_reference_keys(mode, arch) + gen_keys = _rule_set_keys(rule_set, arch) + + self.assertGreater( + len(ref_keys), 0, + f"[{arch}] CK Builder mode '{mode}' produced no reference instances", + ) + + # Counts first (per the requested test method), then content. + missing = ref_keys - gen_keys # in CK Builder, not emitted by dispatcher + extra = gen_keys - ref_keys # emitted by dispatcher, not in CK Builder + + print("\n" + "=" * 70) + print(f"CK BUILDER EQUIVALENCE [arch={arch}]") + print(f"Dispatcher rule set: '{rule_set}' CK Builder mode: '{mode}'") + print("=" * 70) + print(f"CK Builder reference instances: {len(ref_keys)}") + print(f"Dispatcher rule-set instances: {len(gen_keys)}") + print(f"Missing from dispatcher: {len(missing)}") + print(f"Extra in dispatcher: {len(extra)}") + print("=" * 70) + + self.assertEqual( + len(gen_keys), len(ref_keys), + f"[{arch}] instance count mismatch: dispatcher '{rule_set}' has " + f"{len(gen_keys)} vs CK Builder '{mode}' {len(ref_keys)}", + ) + + if missing or extra: + details = [] + if missing: + preview = "\n".join(_format_key(k) for k in sorted(missing, key=str)[:20]) + more = f"\n ... and {len(missing) - 20} more." if len(missing) > 20 else "" + details.append( + f"{len(missing)} CK Builder instances missing from dispatcher " + f"'{rule_set}':\n{preview}{more}" + ) + if extra: + preview = "\n".join(_format_key(k) for k in sorted(extra, key=str)[:20]) + more = f"\n ... and {len(extra) - 20} more." if len(extra) > 20 else "" + details.append( + f"{len(extra)} dispatcher '{rule_set}' instances not in " + f"CK Builder '{mode}':\n{preview}{more}" + ) + self.fail(f"[{arch}] " + "\n".join(details)) + + +# (test label, dispatcher rule set, CK Builder mode). +_EQUIVALENCE_PAIRS: List[Tuple[str, str, str]] = [ + ("profiler_matches_ck_builder", "profiler", "profiler"), + ("tests_matches_ck_builder", "tests", "tests"), +] + + +def _make_equivalence_test(rule_set: str, mode: str, arch: str): + def test(self: CKBuilderEquivalenceTest) -> None: + self.assert_equivalent(rule_set, mode, arch) + + test.__doc__ = ( + f"[{arch}] dispatcher '{rule_set}' must equal CK Builder '{mode}'." + ) + return test + + +for _label, _rs, _mode in _EQUIVALENCE_PAIRS: + for _arch in ARCHS: + setattr( + CKBuilderEquivalenceTest, + f"test_{_label}_{_arch}", + _make_equivalence_test(_rs, _mode, _arch), + ) + +del _label, _rs, _mode, _arch + + +if __name__ == "__main__": + unittest.main() diff --git a/dispatcher/tests/test_streamk_gemm_utils.py b/dispatcher/tests/test_streamk_gemm_utils.py new file mode 100644 index 00000000000..4d698ff09dd --- /dev/null +++ b/dispatcher/tests/test_streamk_gemm_utils.py @@ -0,0 +1,108 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +"""CPU-only unit tests for the stream-K surface of python/gemm_utils.py. + +The stream-K bridge adds a ``reduction_strategy`` to GemmKernelConfig and a +dedicated ctypes source. These tests lock in the two pieces of pure host-side +logic that must stay byte-exact with the codegen and the build: + + * ``GemmKernelConfig.name`` -- the suffix rules mirror + unified_gemm_codegen.py::KernelNaming.generate. Atomic keeps the bare + ``_streamk`` (original parity name); linear/tree are disambiguated as + ``_streamk_``. If this drifts, the runtime registry lookup key + misses the kernel baked into the generated header. + * ``_ctypes_source_name`` -- stream-K launches StreamKHostArgs directly + (registry-bypass) so it needs its own bridge .cpp; every other variant + shares gemm_ctypes_lib.cpp. + +No GPU is touched. Run: python3 -m pytest tests/test_streamk_gemm_utils.py -v +""" + +import sys +import unittest +from pathlib import Path + +SCRIPT_DIR = Path(__file__).parent.resolve() +DISPATCHER_DIR = SCRIPT_DIR.parent +sys.path.insert(0, str(DISPATCHER_DIR / "python")) + +from gemm_utils import ( # noqa: E402 + GemmKernelConfig, + _ctypes_source_name, + _dtype_from_kernel_name, + _layout_from_kernel_name, +) + + +class TestStreamKNaming(unittest.TestCase): + """Stream-K variant naming and reduction-strategy plumbing.""" + + def _cfg(self, variant="stream_k", reduction_strategy="atomic"): + return GemmKernelConfig(variant=variant, reduction_strategy=reduction_strategy) + + def test_atomic_keeps_bare_streamk_suffix(self): + name = self._cfg(reduction_strategy="atomic").name + self.assertTrue(name.endswith("_streamk")) + self.assertNotIn("_streamk_atomic", name) + + def test_linear_and_tree_are_disambiguated(self): + self.assertTrue( + self._cfg(reduction_strategy="linear").name.endswith("_streamk_linear") + ) + self.assertTrue( + self._cfg(reduction_strategy="tree").name.endswith("_streamk_tree") + ) + + def test_standard_has_no_streamk_suffix(self): + self.assertNotIn("streamk", self._cfg(variant="standard").name) + + def test_streamk_name_still_roundtrips_dtype_and_layout(self): + # The variant suffix must not disturb the dtype/layout tokens the runner + # parses back out of the compiled .so name. + for red in ("atomic", "linear", "tree"): + cfg = GemmKernelConfig( + dtype_a="bf16", + dtype_b="bf16", + dtype_c="bf16", + layout_a="col", + layout_b="col", + layout_c="row", + variant="stream_k", + reduction_strategy=red, + ) + self.assertEqual(_dtype_from_kernel_name(cfg.name), "bf16") + self.assertEqual(_layout_from_kernel_name(cfg.name), "ccr") + + def test_codegen_json_pins_reduction_only_for_streamk(self): + sk = self._cfg(reduction_strategy="tree").to_codegen_json() + self.assertEqual(sk["streamk_config"], {"reduction_strategy": ["tree"]}) + # Non-stream-K configs must not emit a streamk_config block. + self.assertNotIn( + "streamk_config", + GemmKernelConfig(variant="standard").to_codegen_json(), + ) + + +class TestCtypesSourceRouting(unittest.TestCase): + """Each variant routes to the ctypes bridge .cpp matching its launch ABI.""" + + def test_streamk_gets_dedicated_source(self): + cfg = GemmKernelConfig(variant="stream_k") + self.assertEqual(_ctypes_source_name(cfg), "streamk_gemm_ctypes_lib.cpp") + + def test_standard_uses_default_source(self): + self.assertEqual( + _ctypes_source_name(GemmKernelConfig(variant="standard")), + "gemm_ctypes_lib.cpp", + ) + self.assertEqual( + _ctypes_source_name(GemmKernelConfig(variant="preshuffle")), + "gemm_ctypes_lib.cpp", + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/dispatcher/tests/test_streamk_registry.py b/dispatcher/tests/test_streamk_registry.py new file mode 100644 index 00000000000..5e6c92b9d42 --- /dev/null +++ b/dispatcher/tests/test_streamk_registry.py @@ -0,0 +1,266 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +Stream-K deep-core registry test (requires a GPU + hipcc). + +Guards the deep-core path that lets Stream-K ride the registry like regular GEMM: +codegen -> generated SK wrapper -> Registry -> Dispatcher::run() (workspace alloc ++ strategy-aware reset) -> generated_tile_backend_streamk -> verify vs reference. + +Each reduction strategy (atomic/linear/tree) is a *distinct compiled kernel* +(SkReductionStrategy is a compile-time constexpr), so we generate all three from a +single tile config and build the 04 registry driver once per strategy, force- +including that strategy's header. For each we assert: + * the encode_identifier() suffix matches the strategy (..._streamk[_linear|_tree]) + * the Dispatcher selects that kernel by Problem::reduction_strategy + * the result verifies against the reference GEMM + +The test SKIPs (exit 77) when no GPU or no hipcc is available, so it is safe in +CPU-only CI; it only runs the heavy build+launch where a GPU is present. + +Usage: + python3 test_streamk_registry.py + python3 test_streamk_registry.py --arch gfx942 --m 3840 --n 4096 --k 2048 +""" + +import argparse +import json +import os +import re +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +DISPATCHER_DIR = Path(__file__).resolve().parent.parent +CK_DIR = DISPATCHER_DIR.parent +CODEGEN = DISPATCHER_DIR / "codegen" / "unified_gemm_codegen.py" +DRIVER = DISPATCHER_DIR / "examples" / "gemm" / "cpp" / "04_streamk_registry_driver.cpp" +REGISTRY_SRC = DISPATCHER_DIR / "src" / "registry.cpp" +DISPATCHER_SRC = DISPATCHER_DIR / "src" / "dispatcher.cpp" + +SKIP = 77 # ctest SKIP_RETURN_CODE + +# One tile config, all three reduction strategies. +TILE = "128x128x64_2x2x1_32x32x16" +TILE_CONFIG_JSON = json.dumps( + { + "tile_config": { + "tile_m": [128], "tile_n": [128], "tile_k": [64], + "warp_m": [2], "warp_n": [2], "warp_k": [1], + "warp_tile_m": [32], "warp_tile_n": [32], "warp_tile_k": [16], + "block_size": [256], + }, + "trait_config": { + "pipeline": ["compv3"], "epilogue": ["cshuffle"], "scheduler": ["intrawave"], + "pad_m": [False], "pad_n": [False], "pad_k": [False], "persistent": [False], + }, + "streamk_config": {"reduction_strategy": ["atomic", "linear", "tree"]}, + } +) + +# strategy -> (header variant suffix, expected encode_identifier suffix) +STRATEGIES = { + "atomic": ("streamk", "_streamk"), + "linear": ("streamk_linear", "_streamk_linear"), + "tree": ("streamk_tree", "_streamk_tree"), +} + +# Datatypes the Stream-K dispatcher codegen supports end-to-end. fp8/bf8 inputs +# accumulate in fp32 and write an fp16 C tensor (get_output_dtype), matching +# Tile Engine; the registry identifier keys on the input dtype (dtype_a), so the +# expected encode_identifier prefix is "{dtype}_{layout}" for each. +DATATYPES = ["fp16", "bf16", "fp8", "bf8"] + +# Layouts Tile Engine builds Stream-K for (all keep C row-major, which the atomic +# C-reset relies on). Full coverage = DATATYPES x LAYOUTS x STRATEGIES. +LAYOUTS = ["rcr", "rrr", "ccr", "crr"] + + +def detect_arch(fallback=None): + # Resolve the gfx target without shelling out to rocminfo. Preference order: + # the arch the build already configured with (passed via --arch from + # CMakeLists.txt) is handled by the caller; here we fall back to the standard + # ROCm environment variables and then the amdgpu-arch / offload-arch LLVM + # tools, which query the driver directly and ship with the ROCm/LLVM toolchain. + for env in ("PYTORCH_ROCM_ARCH", "HCC_AMDGPU_TARGET", "AMDGPU_TARGETS", "GPU_TARGETS"): + val = os.environ.get(env) + if val: + return re.split(r"[;,]", val)[0].strip() + for tool in ("amdgpu-arch", "offload-arch"): + exe = shutil.which(tool) + if exe: + try: + out = run([exe], timeout=30).stdout + m = re.search(r"\bgfx[0-9a-f]+\b", out) + if m: + return m.group(0) + except Exception: + pass + return fallback + + +def run(cmd, **kw): + return subprocess.run(cmd, capture_output=True, text=True, **kw) + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--arch", default=None) + ap.add_argument("--m", type=int, default=3840) + ap.add_argument("--n", type=int, default=4096) + ap.add_argument("--k", type=int, default=2048) + ap.add_argument( + "--datatypes", default=",".join(DATATYPES), + help="Comma-separated datatypes to test (default: all TE-equivalent).", + ) + ap.add_argument( + "--layouts", default=",".join(LAYOUTS), + help="Comma-separated layouts to test (default: all TE-equivalent).", + ) + args = ap.parse_args() + datatypes = [d.strip() for d in args.datatypes.split(",") if d.strip()] + layouts = [l.strip() for l in args.layouts.split(",") if l.strip()] + + hipcc = shutil.which("hipcc") + if not hipcc: + print("SKIP: hipcc not found") + return SKIP + + arch = args.arch or detect_arch() + if not arch: + print("SKIP: no GPU / could not detect gfx arch") + return SKIP + print(f"Stream-K registry test on {arch} @ {args.m}x{args.n}x{args.k}") + + inc = ["-I", str(CK_DIR / "include"), "-I", str(DISPATCHER_DIR / "include")] + + with tempfile.TemporaryDirectory(prefix="sk_reg_test_") as td: + # Build the dtype-independent core objects once (no force-include). + reg_o, disp_o = Path(td) / "registry.o", Path(td) / "dispatcher.o" + for src, obj in ((REGISTRY_SRC, reg_o), (DISPATCHER_SRC, disp_o)): + c = run( + [hipcc, "-std=c++17", f"--offload-arch={arch}", "-O3", *inc, + "-c", str(src), "-o", str(obj)], + timeout=900, + ) + if c.returncode != 0: + print(f"FAIL: compiling {src.name}\n" + c.stderr[-2000:]) + return 1 + + failures = [] + for dtype in datatypes: + for layout in layouts: + failures += run_for_combo( + dtype, layout, td, arch, args, hipcc, inc, reg_o, disp_o + ) + + if failures: + print("\nSTREAM-K REGISTRY TEST FAILED:") + for f in failures: + print(" - " + f) + return 1 + + print( + "All Stream-K combos registered, dispatched, and verified " + f"(datatypes: {', '.join(datatypes)} | layouts: {', '.join(layouts)})." + ) + return 0 + + +def run_for_combo(dtype, layout, td, arch, args, hipcc, inc, reg_o, disp_o): + """Generate + build + run all reduction strategies for one (dtype, layout). + + Returns a list of failure strings (empty on success).""" + failures = [] + # Verify each built kernel against the CLI shape AND a small-M/N, large-K + # shape. The latter maximizes the Stream-K split factor, which is exactly + # where the split-K-aware verification tolerance matters: a plain single-pass + # tolerance spuriously FAILs correct atomic results on this shape. The driver + # binary is shape-independent, so this only adds runs, not rebuilds. + shapes = [(args.m, args.n, args.k), (128, 128, 16384)] + gen = Path(td) / f"gen_{dtype}_{layout}" + + # 1) generate all three strategy headers from one tile config + g = run( + [ + sys.executable, str(CODEGEN), + "--datatype", dtype, "--layout", layout, + "--gpu-target", arch, "--variants", "stream_k", + "--tile-config-json", TILE_CONFIG_JSON, + "--output-dir", str(gen), + ], + timeout=600, + ) + if g.returncode != 0: + return [f"{dtype}/{layout}: codegen failed\n" + g.stderr[-2000:]] + + for strat, (variant, want_suffix) in STRATEGIES.items(): + tag = f"{dtype}/{layout}/{strat}" + header = gen / ( + f"gemm_{dtype}_{layout}_compv3_cshuffle_intrawave_" + f"False_False_False_False_{TILE}_{variant}.hpp" + ) + if not header.exists(): + failures.append(f"{tag}: generated header missing ({header.name})") + continue + + stem = f"{dtype}_{layout}_{variant}" + drv_o, exe = Path(td) / f"d_{stem}.o", Path(td) / f"skreg_{stem}" + c = run( + [hipcc, "-std=c++17", f"--offload-arch={arch}", "-O3", + "-DCK_TILE_SINGLE_KERNEL_INCLUDE", f'-DGFX_ARCH="{arch}"', + *inc, "-I", str(gen), "-include", str(header), + "-c", str(DRIVER), "-o", str(drv_o)], + timeout=900, + ) + if c.returncode != 0: + failures.append(f"{tag}: driver compile failed\n{c.stderr[-1500:]}") + continue + l = run( + [hipcc, f"--offload-arch={arch}", str(drv_o), str(disp_o), + str(reg_o), "-o", str(exe)], + timeout=300, + ) + if l.returncode != 0: + failures.append(f"{tag}: link failed\n{l.stderr[-1500:]}") + continue + + for (sm, sn, sk) in shapes: + r = run( + [str(exe), "--m", str(sm), "--n", str(sn), + "--k", str(sk), "--strategy", strat, "--validate", "1"], + timeout=300, + ) + out = r.stdout + ok_verify = "Verification: PASS" in out + # Guard the identifier parse: a crashed/silent driver prints no + # "identifier=" token, so split(...)[1] would raise IndexError and + # abort the run instead of recording a clean failure. + ok_suffix = False + if f"identifier={dtype}_{layout}" in out and "identifier=" in out: + token = out.split("identifier=", 1)[1].split()[0] + ok_suffix = want_suffix in token + if r.returncode != 0 or not ok_verify or not ok_suffix: + failures.append( + f"{tag} @ {sm}x{sn}x{sk}: rc={r.returncode} verify={ok_verify} " + f"suffix_ok={ok_suffix}\n{out[-800:]}{r.stderr[-400:]}" + ) + else: + tflops = next( + (ln for ln in out.splitlines() if "TFlops" in ln), "" + ).strip() + print( + f" PASS {dtype:5s} {layout:4s} {strat:6s} {sm}x{sn}x{sk} " + f"-> {want_suffix} | {tflops}" + ) + + return failures + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/dispatcher/tests/test_tile_math.py b/dispatcher/tests/test_tile_math.py new file mode 100644 index 00000000000..aa93aaddf44 --- /dev/null +++ b/dispatcher/tests/test_tile_math.py @@ -0,0 +1,614 @@ +#!/usr/bin/env python3 + +# Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +# SPDX-License-Identifier: MIT + +""" +Unit tests for codegen/tile_math.py. + +The reference lookup tables TILE_TO_WAVE_WARP and _TILE_WTILK_TO_VECS are +used as ground-truth oracles. The mathematical functions in tile_math.py +must generate at least the set of configurations present in those tables +(no false negatives). + +Run: + python3 -m pytest dispatcher/tests/test_tile_math.py -v +or: + cd projects/composablekernel/dispatcher + python3 -m pytest tests/test_tile_math.py -v +""" + +import sys +import unittest +from pathlib import Path +from typing import Dict, List, Tuple + +SCRIPT_DIR = Path(__file__).parent.resolve() +DISPATCHER_DIR = SCRIPT_DIR.parent +sys.path.insert(0, str(DISPATCHER_DIR / "codegen")) + +from arch_specs_generated import WARP_SUPPORTED_COMBINATIONS, ELEMENT_SIZE_MAP # noqa: E402 +from grouped_conv.tile_math import ( # noqa: E402 + get_valid_wave_warp_pairs, + get_valid_vec_sizes, + get_vec_sizes_for_wave_warp, + dtype_keys_for_warp_tile_k, + WARP_SIZE, +) + +# ============================================================================= +# Reference oracle tables (ground truth extracted from CK profiler configs) +# +# They live here as static test fixtures: the math functions in tile_math.py must generate +# at least every entry present in these tables (zero false negatives). +# ============================================================================= + +TILE_TO_WAVE_WARP: Dict[Tuple[int, int, int], List[Tuple[Tuple, Tuple]]] = { + (16, 16, 32): [((1, 1, 1), (16, 16, 8)), ((1, 1, 1), (16, 16, 16))], + (16, 16, 64): [((1, 1, 1), (16, 16, 8)), ((1, 1, 1), (16, 16, 16))], + (16, 16, 128): [((1, 1, 1), (16, 16, 8)), ((1, 1, 1), (16, 16, 16))], + (16, 32, 64): [((1, 2, 1), (16, 16, 8)), ((1, 2, 1), (16, 16, 16))], + (16, 64, 32): [((1, 1, 1), (16, 16, 8)), ((1, 1, 1), (16, 16, 16))], + (16, 64, 64): [((1, 2, 1), (16, 16, 8)), ((1, 2, 1), (16, 16, 16))], + (16, 128, 32): [((1, 1, 1), (16, 16, 16))], + (16, 128, 64): [((1, 2, 1), (16, 16, 8)), ((1, 2, 1), (16, 16, 16))], + (16, 256, 32): [((1, 1, 1), (16, 16, 16))], + (16, 256, 64): [((1, 4, 1), (16, 16, 16))], + (32, 16, 64): [((2, 1, 1), (16, 16, 8)), ((2, 1, 1), (16, 16, 16))], + (32, 32, 32): [((1, 1, 1), (32, 32, 8))], + (32, 64, 16): [((1, 1, 1), (32, 32, 4))], + (32, 64, 32): [((1, 1, 1), (32, 32, 8))], + (32, 64, 64): [((1, 2, 1), (32, 32, 8))], + (32, 128, 16): [((1, 2, 1), (32, 32, 4))], + (32, 128, 32): [((1, 1, 1), (32, 32, 8)), ((1, 2, 1), (32, 32, 8))], + (32, 128, 64): [((1, 2, 1), (32, 32, 8))], + (32, 256, 64): [((1, 4, 1), (32, 32, 8))], + (64, 16, 16): [((1, 1, 1), (16, 16, 4)), ((1, 1, 1), (16, 16, 16)), + ((4, 1, 1), (16, 16, 4)), ((4, 1, 1), (16, 16, 16))], + (64, 16, 32): [((1, 1, 1), (16, 16, 8)), ((1, 1, 1), (16, 16, 16)), + ((4, 1, 1), (16, 16, 8)), ((4, 1, 1), (16, 16, 16))], + (64, 16, 64): [((2, 1, 1), (16, 16, 8)), ((2, 1, 1), (16, 16, 16)), + ((4, 1, 1), (16, 16, 16))], + (64, 32, 16): [((1, 1, 1), (32, 32, 4))], + (64, 32, 32): [((1, 1, 1), (32, 32, 8))], + (64, 32, 64): [((2, 1, 1), (32, 32, 8))], + (64, 64, 8): [((2, 1, 1), (32, 32, 8))], + (64, 64, 16): [((1, 1, 1), (32, 32, 4))], + (64, 64, 32): [((1, 1, 1), (32, 32, 8)), ((2, 2, 1), (16, 16, 8)), + ((2, 2, 1), (16, 16, 16))], + (64, 64, 64): [((2, 2, 1), (16, 16, 16)), ((2, 2, 1), (32, 32, 8))], + (64, 128, 16): [((1, 2, 1), (32, 32, 4)), ((2, 2, 1), (32, 32, 4))], + (64, 128, 32): [((1, 2, 1), (32, 32, 8)), ((2, 2, 1), (32, 32, 8))], + (64, 128, 64): [((2, 2, 1), (32, 32, 8))], + (128, 16, 64): [((2, 1, 1), (16, 16, 8)), ((2, 1, 1), (16, 16, 16))], + (128, 32, 16): [((2, 1, 1), (32, 32, 4)), ((4, 1, 1), (32, 32, 4)), + ((4, 1, 1), (32, 32, 8))], + (128, 32, 32): [((1, 1, 1), (32, 32, 8)), ((2, 1, 1), (32, 32, 8)), + ((2, 1, 2), (32, 32, 8)), ((4, 1, 1), (32, 32, 8))], + (128, 32, 64): [((2, 1, 1), (32, 32, 8)), ((4, 1, 1), (32, 32, 16))], + (128, 64, 8): [((2, 1, 1), (32, 32, 8)), ((2, 2, 1), (32, 32, 8))], + (128, 64, 16): [((2, 1, 1), (32, 32, 4)), ((2, 2, 1), (32, 32, 4)), + ((2, 2, 1), (32, 32, 8))], + (128, 64, 32): [((2, 1, 1), (32, 32, 8)), ((2, 2, 1), (32, 32, 8))], + (128, 64, 64): [((2, 2, 1), (32, 32, 8))], + (128, 128, 16):[((1, 2, 1), (32, 32, 4)), ((2, 2, 1), (32, 32, 4))], + (128, 128, 32):[((1, 2, 1), (32, 32, 8)), ((2, 2, 1), (32, 32, 8))], + (128, 128, 64):[((2, 2, 1), (32, 32, 8))], + (128, 192, 16):[((2, 2, 1), (32, 32, 4))], + (128, 256, 16):[((2, 2, 1), (32, 32, 4))], + (128, 256, 32):[((2, 2, 1), (32, 32, 8))], + (224, 256, 64):[((2, 2, 1), (16, 16, 16))], + (256, 16, 64): [((4, 1, 1), (16, 16, 16))], + (256, 32, 64): [((4, 1, 1), (32, 32, 8))], + (256, 64, 8): [((2, 2, 1), (32, 32, 8))], + (256, 128, 16):[((2, 2, 1), (32, 32, 4))], + (256, 128, 32):[((2, 2, 1), (32, 32, 8))], + (256, 224, 64):[((2, 2, 1), (16, 16, 16))], + (256, 256, 32):[((2, 2, 1), (16, 16, 16)), ((2, 2, 1), (32, 32, 8))], +} + +_TILE_WTILK_TO_VECS: Dict[Tuple[int, int, int, int], List[Tuple[int, int, int]]] = { + (16, 16, 32, 8): [(1, 1, 2)], + (16, 16, 32, 16): [(1, 1, 1), (1, 1, 2)], + (16, 16, 64, 8): [(4, 4, 4)], + (16, 16, 64, 16): [(1, 1, 1), (1, 4, 4), (4, 1, 1), (4, 4, 4), (8, 8, 4)], + (16, 16, 128, 8): [(4, 4, 4)], + (16, 16, 128, 16): [(8, 8, 4)], + (16, 32, 64, 8): [(4, 4, 4)], + (16, 32, 64, 16): [(1, 1, 1), (1, 2, 4), (1, 4, 4), (2, 1, 1), (2, 2, 4), (2, 4, 4), (8, 8, 4)], + (16, 64, 32, 8): [(1, 4, 4), (4, 1, 1), (4, 4, 4)], + (16, 64, 32, 16): [(1, 8, 4), (8, 1, 1), (8, 8, 4)], + (16, 64, 64, 8): [(4, 4, 4)], + (16, 64, 64, 16): [(1, 1, 1), (1, 8, 4), (2, 1, 1), (2, 8, 4), (8, 8, 4)], + (16, 128, 32, 16): [(4, 4, 1)], + (16, 128, 64, 8): [(4, 4, 4)], + (16, 128, 64, 16): [(1, 8, 4), (2, 8, 4), (8, 8, 4)], + (16, 256, 32, 16): [(8, 8, 1)], + (16, 256, 64, 16): [(1, 8, 4), (2, 8, 4), (8, 8, 4)], + (32, 16, 64, 8): [(4, 4, 2)], + (32, 16, 64, 16): [(1, 1, 1), (1, 2, 2), (2, 1, 1), (2, 2, 2), (4, 1, 1), (4, 2, 2), (8, 8, 2)], + (32, 32, 32, 8): [(2, 2, 1), (2, 2, 2)], + (32, 64, 16, 4): [(1, 4, 4), (4, 4, 4)], + (32, 64, 32, 8): [(1, 1, 8), (2, 2, 1), (2, 8, 8), (4, 4, 1), (4, 4, 2), (4, 4, 4), (8, 8, 8)], + (32, 64, 64, 8): [(4, 4, 8), (8, 8, 8)], + (32, 128, 16, 4): [(4, 4, 4)], + (32, 128, 32, 8): [(1, 1, 8), (4, 4, 4), (8, 8, 1), (8, 8, 2), (8, 8, 8)], + (32, 128, 64, 8): [(4, 4, 8), (8, 8, 8)], + (32, 256, 64, 8): [(8, 8, 8)], + (64, 16, 16, 4): [(4, 1, 1)], + (64, 16, 16, 16): [(4, 1, 1)], + (64, 16, 32, 8): [(1, 4, 4), (4, 1, 1), (4, 4, 4), (8, 1, 1), (8, 2, 2)], + (64, 16, 32, 16): [(1, 8, 4), (8, 1, 1), (8, 2, 2), (8, 8, 4)], + (64, 16, 64, 8): [(4, 4, 2)], + (64, 16, 64, 16): [(1, 1, 1), (1, 2, 2), (8, 1, 1), (8, 2, 2), (8, 8, 2), (16, 1, 1), (16, 2, 2)], + (64, 32, 16, 4): [(4, 4, 1), (4, 4, 4)], + (64, 32, 32, 8): [(1, 1, 8), (4, 4, 1), (4, 4, 2), (4, 4, 4), (8, 8, 1), (8, 8, 8)], + (64, 32, 64, 8): [(4, 4, 4), (8, 8, 4)], + (64, 64, 8, 8): [(1, 1, 8)], + (64, 64, 16, 4): [(1, 1, 1), (4, 4, 4)], + (64, 64, 32, 8): [(1, 1, 1), (1, 1, 8), (1, 2, 1), (2, 1, 2), (2, 2, 2), (4, 4, 4), (8, 8, 8)], + (64, 64, 32, 16): [(1, 2, 1), (2, 1, 2), (4, 4, 4), (8, 8, 8)], + (64, 64, 64, 8): [(1, 1, 1), (1, 4, 4), (2, 2, 2), (4, 1, 1), (4, 4, 4), (8, 8, 4), (8, 8, 8)], + (64, 64, 64, 16): [(2, 2, 4), (4, 1, 1), (8, 8, 2), (8, 8, 8)], + (64, 128, 16, 4): [(4, 4, 4)], + (64, 128, 32, 8): [(1, 1, 8), (1, 4, 4), (1, 8, 8), (4, 4, 4), (8, 8, 8)], + (64, 128, 64, 8): [(8, 8, 8)], + (128, 16, 64, 8): [(4, 4, 2)], + (128, 16, 64, 16): [(8, 1, 1), (8, 2, 2), (8, 8, 2)], + (128, 32, 16, 4): [(4, 1, 1), (4, 2, 2), (4, 4, 4)], + (128, 32, 16, 8): [(4, 1, 1), (4, 2, 2)], + (128, 32, 32, 8): [(1, 1, 8), (4, 1, 1), (4, 4, 4), (8, 1, 1), (8, 2, 2), (8, 8, 1), (8, 8, 2), (8, 8, 8)], + (128, 32, 64, 8): [(4, 4, 4), (8, 8, 4)], + (128, 32, 64, 16): [(16, 1, 1), (16, 2, 2), (16, 8, 8)], + (128, 64, 8, 8): [(1, 1, 8)], + (128, 64, 16, 4): [(4, 4, 4)], + (128, 64, 16, 8): [(1, 1, 8)], + (128, 64, 32, 8): [(1, 1, 8), (4, 4, 4), (8, 8, 8)], + (128, 64, 64, 8): [(8, 8, 8)], + (128, 128, 16, 4): [(1, 1, 4), (4, 4, 4)], + (128, 128, 32, 8): [(1, 1, 8), (4, 4, 4), (4, 4, 8), (8, 8, 8)], + (128, 128, 64, 8): [(4, 4, 4), (4, 4, 8), (8, 8, 4), (8, 8, 8)], + (128, 192, 16, 4): [(4, 4, 4)], + (128, 256, 16, 4): [(4, 4, 4)], + (128, 256, 32, 8): [(1, 1, 8), (4, 4, 4), (8, 4, 8), (8, 8, 8)], + (224, 256, 64, 16):[(8, 8, 8)], + (256, 16, 64, 16): [(8, 1, 1), (8, 2, 2), (8, 8, 2)], + (256, 32, 64, 8): [(8, 8, 4), (8, 8, 8)], + (256, 64, 8, 8): [(1, 1, 8)], + (256, 128, 16, 4): [(4, 4, 4)], + (256, 128, 32, 8): [(1, 1, 8), (2, 2, 2), (4, 4, 4), (8, 8, 8)], + (256, 224, 64, 16):[(8, 8, 8)], + (256, 256, 32, 8): [(4, 4, 4), (8, 8, 4), (8, 8, 8)], + (256, 256, 32, 16):[(8, 8, 8)], +} + + +# ============================================================================= +# TestGetValidWaveWarpPairs +# ============================================================================= + +class TestGetValidWaveWarpPairs(unittest.TestCase): + """Tests for get_valid_wave_warp_pairs().""" + + # --- Spot checks --- + + def test_spot_check_128_64_32(self): + """Reference pairs for (128,64,32) must all be in the math result.""" + tile = (128, 64, 32) + ref_pairs = TILE_TO_WAVE_WARP[tile] + math_pairs = set(get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32")) + for pair in ref_pairs: + self.assertIn( + pair, math_pairs, + f"Missing reference pair {pair} for tile {tile}", + ) + + def test_spot_check_64_64_32(self): + """Reference pairs for (64,64,32) must all be in the union of dtype results.""" + tile = (64, 64, 32) + ref_pairs = TILE_TO_WAVE_WARP[tile] + # Union across dtype_keys — reference table is dtype-agnostic + math_pairs = set(get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32")) + math_pairs |= set(get_valid_wave_warp_pairs(*tile, "fp32_fp32_fp32")) + math_pairs |= set(get_valid_wave_warp_pairs(*tile, "fp16_fp16_fp32")) + for pair in ref_pairs: + self.assertIn( + pair, math_pairs, + f"Missing reference pair {pair} for tile {tile}", + ) + + def test_spot_check_128_32_32_fp32(self): + """Reference pairs for (128,32,32) include fp32 warp tiles.""" + tile = (128, 32, 32) + ref_pairs = TILE_TO_WAVE_WARP[tile] + # fp32 uses warp_tile_k in {4, 8}; bf16 uses {8, 16} + # Try both dtype_keys and require the union covers all reference pairs + math_pairs = set(get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32")) + math_pairs |= set(get_valid_wave_warp_pairs(*tile, "fp32_fp32_fp32")) + for pair in ref_pairs: + self.assertIn( + pair, math_pairs, + f"Missing reference pair {pair} for tile {tile}", + ) + + # --- Full coverage of reference table --- + + def test_coverage_all_reference_tiles(self): + """Every (tile, pair) in TILE_TO_WAVE_WARP must be generated by the math. + + The math is called with both bf16_bf16_fp32 and fp32_fp32_fp32 dtype_keys + and the union must contain every reference pair. This is the zero-false- + negatives requirement. + """ + DTYPE_KEYS = ["bf16_bf16_fp32", "fp32_fp32_fp32", "fp16_fp16_fp32"] + missing = [] + + for tile, ref_pairs in TILE_TO_WAVE_WARP.items(): + # Union across dtype_keys (reference table is dtype-agnostic) + math_pairs: set = set() + for dk in DTYPE_KEYS: + math_pairs |= set(get_valid_wave_warp_pairs(*tile, dk)) + + for pair in ref_pairs: + if pair not in math_pairs: + missing.append((tile, pair)) + + if missing: + lines = [f" tile={t} pair={p}" for t, p in missing] + self.fail( + f"{len(missing)} reference pairs not generated by math:\n" + + "\n".join(lines) + ) + + # --- Structural validity of math output --- + + def test_no_invalid_wave_combos(self): + """Every wave combo returned must be in WARP_SUPPORTED_COMBINATIONS for gfx942.""" + valid_waves = {tuple(c) for c in WARP_SUPPORTED_COMBINATIONS["gfx942"]} + tile = (128, 64, 32) + for wave, _warp in get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32"): + self.assertIn( + wave, valid_waves, + f"Wave combo {wave} not in gfx942 supported combinations", + ) + + def test_no_invalid_wave_combos_all_tiles(self): + """All tiles in reference table: every returned wave must be arch-valid.""" + valid_waves = {tuple(c) for c in WARP_SUPPORTED_COMBINATIONS["gfx942"]} + for tile in TILE_TO_WAVE_WARP: + for wave, _warp in get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32"): + self.assertIn( + wave, valid_waves, + f"tile={tile}: wave {wave} not in gfx942 supported combinations", + ) + + def test_tile_divisibility_enforced(self): + """A tile not divisible by any warp_tile_m must return no pairs.""" + # (13, 17, 32) — prime dimensions, won't divide any MFMA shape + pairs = get_valid_wave_warp_pairs(13, 17, 32, "bf16_bf16_fp32") + self.assertEqual(pairs, [], "Expected no pairs for prime-dimension tile") + + def test_warp_tile_divides_tile_m_and_n(self): + """For every returned pair, warp_tile_m | tile_m and warp_tile_n | tile_n.""" + for tile in TILE_TO_WAVE_WARP: + tm, tn, tk = tile + for _wave, (wt_m, wt_n, wt_k) in get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32"): + self.assertEqual(tm % wt_m, 0, f"tile_m={tm} not divisible by warp_m={wt_m}") + self.assertEqual(tn % wt_n, 0, f"tile_n={tn} not divisible by warp_n={wt_n}") + + # --- Special cases --- + + def test_wave_k2_special_case(self): + """(128,32,32) must produce the ((2,1,2), (32,32,8)) pair (wave_k=2).""" + tile = (128, 32, 32) + math_pairs = set(get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32")) + expected = ((2, 1, 2), (32, 32, 8)) + self.assertIn( + expected, math_pairs, + f"Expected wave_k=2 pair {expected} not found for tile {tile}", + ) + + def test_pipeline_async_constraint(self): + """pipeline='basic_async_v1' must only return pairs with wave_n==2 and warp_tile_n==16.""" + tile = (64, 64, 32) + pairs = get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32", pipeline="basic_async_v1") + for wave, (wt_m, wt_n, wt_k) in pairs: + _wm, wn, _wk = wave + self.assertEqual(wn, 2, f"async pipeline: expected wave_n=2, got {wn}") + self.assertEqual(wt_n, 16, f"async pipeline: expected warp_tile_n=16, got {wt_n}") + + def test_no_duplicates(self): + """The returned list must not contain duplicate pairs.""" + for tile in list(TILE_TO_WAVE_WARP.keys()): + pairs = get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32") + self.assertEqual( + len(pairs), len(set(pairs)), + f"tile={tile}: duplicate pairs in result", + ) + + def test_gfx950_returns_superset_of_gfx942(self): + """gfx950 supports more wave combos, so it must return >= as many pairs as gfx942.""" + tile = (128, 64, 32) + pairs_942 = set(get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32", arch="gfx942")) + pairs_950 = set(get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32", arch="gfx950")) + self.assertTrue( + pairs_942.issubset(pairs_950), + "gfx942 pairs should be a subset of gfx950 pairs", + ) + + +# ============================================================================= +# TestGetValidVecSizes +# ============================================================================= + +class TestGetValidVecSizes(unittest.TestCase): + """Tests for get_valid_vec_sizes().""" + + # --- Spot checks --- + + def test_spot_check_128_64_32_wave221_wt_32328(self): + """Reference vecs for (128,64,32) wave=(2,2,1) warp=(32,32,8) bf16.""" + vecs = get_valid_vec_sizes(128, 64, 32, 2, 2, 1, 32, 32, 8, "bf16_bf16_fp32") + # Reference: [(1,1,8), (4,4,4), (8,8,8)] from _TILE_WTILK_TO_VECS[(128,64,32,8)] + ref = _TILE_WTILK_TO_VECS[(128, 64, 32, 8)] + math_set = set(vecs) + for v in ref: + self.assertIn(v, math_set, f"Reference vec {v} missing for (128,64,32) wave=(2,2,1)") + + def test_spot_check_64_64_32_wave111_wt_32328(self): + """Reference vecs for (64,64,32) wave=(1,1,1) warp=(32,32,8) bf16.""" + vecs = get_valid_vec_sizes(64, 64, 32, 1, 1, 1, 32, 32, 8, "bf16_bf16_fp32") + ref = _TILE_WTILK_TO_VECS[(64, 64, 32, 8)] + math_set = set(vecs) + for v in ref: + self.assertIn(v, math_set, f"Reference vec {v} missing for (64,64,32) wave=(1,1,1)") + + # --- Structural validity --- + + def test_pixel_budget_respected(self): + """vec_a/vec_b must be compatible with their pixel budget. + + Compatible means the vector divides the per-thread pixel budget OR is an + exact multiple of it (the wide load decomposes into v/pixels sub-loads). + """ + configs = [ + (128, 64, 32, 2, 2, 1, 32, 32, 8, "bf16_bf16_fp32"), + (64, 64, 32, 1, 1, 1, 32, 32, 8, "bf16_bf16_fp32"), + (256, 128, 32, 2, 2, 1, 32, 32, 8, "bf16_bf16_fp32"), + ] + for cfg in configs: + tm, tn, tk, wm, wn, wk, wt_m, wt_n, wt_k, dk = cfg + block_size = WARP_SIZE * wm * wn * wk + pixels_a = tm * tk // block_size + pixels_b = tn * tk // block_size + for va, vb, vc in get_valid_vec_sizes(*cfg): + self.assertTrue(pixels_a % va == 0 or va % pixels_a == 0, + f"cfg={cfg}: pixels_a={pixels_a} incompatible with vec_a={va}") + self.assertTrue(pixels_b % vb == 0 or vb % pixels_b == 0, + f"cfg={cfg}: pixels_b={pixels_b} incompatible with vec_b={vb}") + + def test_fp32_vec_c_8_admitted(self): + """fp32 tiles admit vec_c=8 (relaxed 32-byte ceiling). Category (A).""" + vecs = get_valid_vec_sizes(128, 128, 32, 2, 2, 1, 32, 32, 8, "fp32_fp32_fp32") + self.assertIn((4, 4, 8), set(vecs), + "fp32 (128,128,32) should admit vec triple (4,4,8)") + + def test_bf16_asymmetric_small_pixel_vec8(self): + """Asymmetric small-pixel tile admits a vec=8 triple. Category (B).""" + # (16,256,64) wave=(1,4,1): pixels_a = 16*64/256 = 4 < 8, but 8 % 4 == 0. + vecs = get_valid_vec_sizes(16, 256, 64, 1, 4, 1, 16, 16, 16, "bf16_bf16_fp32") + self.assertTrue(any(8 in (va, vb) for va, vb, vc in vecs), + "bf16 (16,256,64) wave=(1,4,1) should admit a vec=8 triple") + + def test_bf16_vec_c_capped_at_16(self): + """bf16 vec_c never exceeds 16 (LDS 256-bit ceiling still enforced).""" + for va, vb, vc in get_valid_vec_sizes(128, 128, 32, 2, 2, 1, 32, 32, 8, "bf16_bf16_fp32"): + self.assertLessEqual(vc, 16, f"bf16: vec_c={vc} > 16") + + def test_lds_validity_bf16(self): + """All returned vecs must satisfy the power-of-2 bit-width constraint for bf16. + + Standard LDS allows 8–128 bits; some bwd_data global loads allow 256 bits. + The constraint is: bits = vec * sizeof * 8 must be a power of 2 up to 256. + """ + sizeof_bf16 = 2.0 + for va, vb, vc in get_valid_vec_sizes(128, 64, 32, 2, 2, 1, 32, 32, 8, "bf16_bf16_fp32"): + for v in (va, vb, vc): + bits = int(v * sizeof_bf16 * 8) + self.assertGreater(bits, 0, f"vec={v}: bits must be > 0") + self.assertLessEqual(bits, 256, f"vec={v}: bits={bits} > 256") + self.assertEqual(bits & (bits - 1), 0, f"vec={v}: bits={bits} not power of 2") + + def test_dtype_max_vec_fp32(self): + """For fp32, vec_a and vec_b must be <= 8 (32 bytes / 4 bytes, allowing 2×16-byte loads).""" + for va, vb, vc in get_valid_vec_sizes(128, 64, 32, 2, 2, 1, 32, 32, 4, "fp32_fp32_fp32"): + self.assertLessEqual(va, 8, f"fp32: vec_a={va} > 8") + self.assertLessEqual(vb, 8, f"fp32: vec_b={vb} > 8") + + def test_dtype_max_vec_bf16(self): + """For bf16, vec_a and vec_b must be <= 16 (32 bytes / 2 bytes per element).""" + for va, vb, vc in get_valid_vec_sizes(128, 64, 32, 2, 2, 1, 32, 32, 8, "bf16_bf16_fp32"): + self.assertLessEqual(va, 16, f"bf16: vec_a={va} > 16") + self.assertLessEqual(vb, 16, f"bf16: vec_b={vb} > 16") + + def test_vec_c_divisibility(self): + """tile_n must be divisible by vec_c (output is vectorized along N).""" + tile_n = 64 + wave_n = 2 + warp_tile_n = 16 + for va, vb, vc in get_valid_vec_sizes( + 128, tile_n, 32, 2, wave_n, 1, 16, warp_tile_n, 16, "bf16_bf16_fp32" + ): + self.assertEqual( + tile_n % vc, 0, + f"tile_n={tile_n} not divisible by vec_c={vc}", + ) + + def test_empty_result_for_non_divisible_block(self): + """If tile_m * tile_k is not divisible by block_size, return [].""" + # tile_m=13 (prime) → pixels_a won't be integer → expect empty + result = get_valid_vec_sizes(13, 16, 32, 1, 1, 1, 16, 16, 16, "bf16_bf16_fp32") + self.assertEqual(result, []) + + +# ============================================================================= +# TestGetVecSizesForWaveWarp (wrapper) +# ============================================================================= + +class TestGetVecSizesForWaveWarp(unittest.TestCase): + """Tests for the get_vec_sizes_for_wave_warp() convenience wrapper.""" + + def test_spot_check_128_64_32_wt8(self): + """Reference vecs for (128,64,32,8) in _TILE_WTILK_TO_VECS must all appear.""" + ref = _TILE_WTILK_TO_VECS[(128, 64, 32, 8)] + math_set = set(get_vec_sizes_for_wave_warp(128, 64, 32, 8, "bf16_bf16_fp32")) + for v in ref: + self.assertIn(v, math_set, + f"Reference vec {v} missing from get_vec_sizes_for_wave_warp(128,64,32,8)") + + def test_spot_check_64_64_32_wt8(self): + """Reference vecs for (64,64,32,8) in _TILE_WTILK_TO_VECS must all appear.""" + ref = _TILE_WTILK_TO_VECS[(64, 64, 32, 8)] + math_set = set(get_vec_sizes_for_wave_warp(64, 64, 32, 8, "bf16_bf16_fp32")) + for v in ref: + self.assertIn(v, math_set, + f"Reference vec {v} missing from get_vec_sizes_for_wave_warp(64,64,32,8)") + + def test_result_is_sorted(self): + """Returned list must be in sorted order.""" + result = get_vec_sizes_for_wave_warp(128, 64, 32, 8, "bf16_bf16_fp32") + self.assertEqual(result, sorted(result)) + + def test_no_duplicates(self): + """Returned list must not contain duplicates.""" + result = get_vec_sizes_for_wave_warp(128, 64, 32, 8, "bf16_bf16_fp32") + self.assertEqual(len(result), len(set(result))) + + +# ============================================================================= +# TestMathVsReferenceStatistics — coverage tests (the key correctness tests) +# ============================================================================= + +# Map warp_tile_k → dtype_keys to try when verifying _TILE_WTILK_TO_VECS +# Derived from warp_gemm_dispatcher.hpp; we try all plausible dtypes per warp_tile_k. +_DTYPE_KEYS_ALL = ["bf16_bf16_fp32", "fp32_fp32_fp32", "fp16_fp16_fp32", "fp8_fp8_fp32"] + + +class TestMathVsReferenceStatistics(unittest.TestCase): + """Comprehensive coverage: math must generate >= all reference entries.""" + + def test_wave_warp_no_false_negatives(self): + """TILE_TO_WAVE_WARP: every reference pair must be in the math output. + + The math is queried with multiple dtype_keys and the union must cover + every reference pair. This guarantees zero false negatives. + """ + missing = [] + for tile, ref_pairs in TILE_TO_WAVE_WARP.items(): + math_pairs: set = set() + for dk in _DTYPE_KEYS_ALL: + math_pairs |= set(get_valid_wave_warp_pairs(*tile, dk)) + for pair in ref_pairs: + if pair not in math_pairs: + missing.append((tile, pair)) + + if missing: + lines = [f" tile={t} pair={p}" for t, p in missing[:20]] + self.fail( + f"{len(missing)} reference wave/warp pairs not generated by math " + f"(showing first 20):\n" + "\n".join(lines) + ) + + def test_vec_no_false_negatives(self): + """_TILE_WTILK_TO_VECS: every reference vec must be in the math output. + + For each (tile_m, tile_n, tile_k, warp_tile_k) key, the math is queried + with all plausible dtype_keys (inferred from warp_tile_k) and the union + must contain every reference vec triple. + """ + missing = [] + for (tm, tn, tk, wtk), ref_vecs in _TILE_WTILK_TO_VECS.items(): + dtype_keys = dtype_keys_for_warp_tile_k(wtk) + if not dtype_keys: + dtype_keys = _DTYPE_KEYS_ALL # fallback: try all + + math_vecs: set = set() + for dk in dtype_keys: + math_vecs |= set(get_vec_sizes_for_wave_warp(tm, tn, tk, wtk, dk)) + + for v in ref_vecs: + if v not in math_vecs: + missing.append(((tm, tn, tk, wtk), v)) + + if missing: + lines = [f" key={k} vec={v}" for k, v in missing[:30]] + self.fail( + f"{len(missing)} reference vec triples not generated by math " + f"(showing first 30):\n" + "\n".join(lines) + ) + + def test_extra_wave_warp_pairs_are_structurally_valid(self): + """Pairs the math generates but reference doesn't have must still be valid. + + Extra pairs are not failures — they represent valid configs not yet in + the JSON profiler files. But they must satisfy structural constraints. + """ + valid_waves = {tuple(c) for c in WARP_SUPPORTED_COMBINATIONS["gfx942"]} + invalid_extras = [] + + for tile in TILE_TO_WAVE_WARP: + ref_set = set(TILE_TO_WAVE_WARP[tile]) + math_pairs = get_valid_wave_warp_pairs(*tile, "bf16_bf16_fp32") + extras = [p for p in math_pairs if p not in ref_set] + for wave, (wt_m, wt_n, wt_k) in extras: + tm, tn, _tk = tile + # Wave must be arch-valid + if wave not in valid_waves: + invalid_extras.append((tile, wave, "not in arch wave combos")) + # Tile must be divisible by warp tile + elif tm % wt_m != 0 or tn % wt_n != 0: + invalid_extras.append((tile, (wt_m, wt_n, wt_k), "divisibility violated")) + + if invalid_extras: + lines = [f" {e}" for e in invalid_extras[:10]] + self.fail( + f"{len(invalid_extras)} extra pairs are structurally invalid:\n" + + "\n".join(lines) + ) + + def test_coverage_rate_wave_warp(self): + """Log coverage statistics for TILE_TO_WAVE_WARP (informational).""" + total = 0 + covered = 0 + for tile, ref_pairs in TILE_TO_WAVE_WARP.items(): + math_pairs: set = set() + for dk in _DTYPE_KEYS_ALL: + math_pairs |= set(get_valid_wave_warp_pairs(*tile, dk)) + for pair in ref_pairs: + total += 1 + if pair in math_pairs: + covered += 1 + rate = covered / total * 100 if total else 0 + print(f"\n[wave/warp coverage] {covered}/{total} = {rate:.1f}%") + self.assertEqual(covered, total, f"Coverage {rate:.1f}% < 100%") + + def test_coverage_rate_vec(self): + """Log coverage statistics for _TILE_WTILK_TO_VECS (informational).""" + total = 0 + covered = 0 + for (tm, tn, tk, wtk), ref_vecs in _TILE_WTILK_TO_VECS.items(): + dtype_keys = dtype_keys_for_warp_tile_k(wtk) or _DTYPE_KEYS_ALL + math_vecs: set = set() + for dk in dtype_keys: + math_vecs |= set(get_vec_sizes_for_wave_warp(tm, tn, tk, wtk, dk)) + for v in ref_vecs: + total += 1 + if v in math_vecs: + covered += 1 + rate = covered / total * 100 if total else 0 + print(f"\n[vec coverage] {covered}/{total} = {rate:.1f}%") + self.assertEqual(covered, total, f"Vec coverage {rate:.1f}% < 100%") + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/docs/conceptual/ck_tile/adaptors.rst b/docs/conceptual/ck_tile/adaptors.rst index 8720199eab6..de71c405a71 100644 --- a/docs/conceptual/ck_tile/adaptors.rst +++ b/docs/conceptual/ck_tile/adaptors.rst @@ -15,50 +15,28 @@ TensorAdaptor Basics A TensorAdaptor encapsulates a sequence of :ref:`coordinate transformations `, managing the flow of coordinates through multiple transform stages: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Adaptor Composition" - subgraph "Single Transform" - direction TB - I1["Input Coords
[0,1,2]"] - T1["Transform
(e.g., Transpose)"] - O1["Output Coords
[2,0,1]"] - I1 --> T1 --> O1 - end - - subgraph "Chained Transforms" - direction TB - I2["Input
2D"] - T2A["Transform A
(e.g., Merge)"] - M2["Intermediate
1D"] - T2B["Transform B
(e.g., Pad)"] - O2["Output
1D Padded"] - I2 --> T2A --> M2 --> T2B --> O2 - end - end - - style T1 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style T2A fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style T2B fill:#fff3e0,stroke:#f57c00,stroke-width:2px - - - - - -.. image:: diagrams/adaptors_1.svg - :alt: Diagram - :align: center - -.. image:: diagrams/adaptors_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph LR + subgraph "Adaptor Composition" + subgraph "Single Transform" + direction TB + I1["Input Coords
[0,1,2]"] + T1["Transform
(e.g., Transpose)"] + O1["Output Coords
[2,0,1]"] + I1 --> T1 --> O1 + end + + subgraph "Chained Transforms" + direction TB + I2["Input
2D"] + T2A["Transform A
(e.g., Merge)"] + M2["Intermediate
1D"] + T2B["Transform B
(e.g., Pad)"] + O2["Output
1D Padded"] + I2 --> T2A --> M2 --> T2B --> O2 + end + end Core Components ~~~~~~~~~~~~~~~ @@ -125,59 +103,36 @@ Chaining Adaptors: Building Complex Transformations The real power of adaptors comes from chaining multiple transformations together to create advanced data access patterns: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Adaptor Chaining Flow" - subgraph "Adaptor 1" - A1I["Bottom Dims
[0,1]"] - A1T["Transform:
Merge[2,3]"] - A1O["Top Dims
[0]"] - end - - subgraph "Adaptor 2" - A2I["Bottom Dims
[0]"] - A2T["Transform:
Unmerge[2,3]"] - A2O["Top Dims
[0,1]"] - end - - subgraph "Chained Result" - CI["Input 2D
Bottom[0,1]"] - CO["Output 2D
Top[0,1]"] - end - end - - A1I --> A1T - A1T --> A1O - A1O --> A2I - A2I --> A2T - A2T --> A2O - - CI --> A1I - A2O --> CO - - style A1T fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style A2T fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style CI fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style CO fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - - - -.. image:: diagrams/adaptors_2.svg - :alt: Diagram - :align: center - -.. image:: diagrams/adaptors_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph LR + subgraph "Adaptor Chaining Flow" + subgraph "Adaptor 1" + A1I["Bottom Dims
[0,1]"] + A1T["Transform:
Merge[2,3]"] + A1O["Top Dims
[0]"] + end + + subgraph "Adaptor 2" + A2I["Bottom Dims
[0]"] + A2T["Transform:
Unmerge[2,3]"] + A2O["Top Dims
[0,1]"] + end + + subgraph "Chained Result" + CI["Input 2D
Bottom[0,1]"] + CO["Output 2D
Top[0,1]"] + end + end + + A1I --> A1T + A1T --> A1O + A1O --> A2I + A2I --> A2T + A2T --> A2O + + CI --> A1I + A2O --> CO .. code-block:: cpp diff --git a/docs/conceptual/ck_tile/buffer_views.rst b/docs/conceptual/ck_tile/buffer_views.rst index ca574724ab6..3ec7aeb88c3 100644 --- a/docs/conceptual/ck_tile/buffer_views.rst +++ b/docs/conceptual/ck_tile/buffer_views.rst @@ -24,53 +24,32 @@ Memory coherence and caching policies represent another layer of complexity that Address Space Usage Patterns ---------------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - flowchart TB - subgraph CF ["Compute Flow"] - direction LR - GM1["Global Memory
Input Data"] --> LDS["LDS
Tile Cache"] - LDS --> VGPR["VGPR
Working Set"] - VGPR --> Compute["Compute
Operations"] - Compute --> VGPR - VGPR --> LDS2["LDS
Reduction"] - LDS2 --> GM2["Global Memory
Output Data"] - end - - subgraph UP ["Usage Pattern"] - direction LR - P1["1. Load tile from Global → LDS"] - P2["2. Load working set LDS → VGPR"] - P3["3. Compute in VGPR"] - P4["4. Store results VGPR → LDS"] - P5["5. Reduce in LDS"] - P6["6. Write final LDS → Global"] - - P1 --> P2 --> P3 --> P4 --> P5 --> P6 - end - - CF ~~~ UP - - style GM1 fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style LDS fill:#fed7aa,stroke:#f59e0b,stroke-width:2px - style VGPR fill:#d1fae5,stroke:#10b981,stroke-width:2px - style Compute fill:#e0e7ff,stroke:#4338ca,stroke-width:2px - - - - - - -.. image:: diagrams/buffer_views_1.svg - :alt: Diagram - :align: center - +.. mermaid:: + + flowchart TB + subgraph CF ["Compute Flow"] + direction LR + GM1["Global Memory
Input Data"] --> LDS["LDS
Tile Cache"] + LDS --> VGPR["VGPR
Working Set"] + VGPR --> Compute["Compute
Operations"] + Compute --> VGPR + VGPR --> LDS2["LDS
Reduction"] + LDS2 --> GM2["Global Memory
Output Data"] + end + + subgraph UP ["Usage Pattern"] + direction LR + P1["1. Load tile from Global → LDS"] + P2["2. Load working set LDS → VGPR"] + P3["3. Compute in VGPR"] + P4["4. Store results VGPR → LDS"] + P5["5. Reduce in LDS"] + P6["6. Write final LDS → Global"] + + P1 --> P2 --> P3 --> P4 --> P5 --> P6 + end + + CF ~~~ UP C++ Implementation ------------------ @@ -190,101 +169,59 @@ The implementation of vector access maintains the same parameter structure as sc Scalar vs Vectorized Memory Access ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Scalar Access (4 instructions)" - S1["Load float[0]"] --> R1["Register 1"] - S2["Load float[1]"] --> R2["Register 2"] - S3["Load float[2]"] --> R3["Register 3"] - S4["Load float[3]"] --> R4["Register 4"] - end - - subgraph "Vectorized Access (1 instruction)" - V1["Load float4[0]"] --> VR["Vector Register
(4 floats)"] - end - - subgraph "Performance Impact" - Perf["4x fewer instructions
Better memory bandwidth
Reduced latency"] - end - - R1 & R2 & R3 & R4 --> Perf - VR --> Perf - - style S1 fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style S2 fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style S3 fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style S4 fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style V1 fill:#d1fae5,stroke:#10b981,stroke-width:2px - style Perf fill:#fef3c7,stroke:#f59e0b,stroke-width:2px - - - - - +.. mermaid:: + + graph LR + subgraph "Scalar Access (4 instructions)" + S1["Load float[0]"] --> R1["Register 1"] + S2["Load float[1]"] --> R2["Register 2"] + S3["Load float[2]"] --> R3["Register 3"] + S4["Load float[3]"] --> R4["Register 4"] + end + + subgraph "Vectorized Access (1 instruction)" + V1["Load float4[0]"] --> VR["Vector Register
(4 floats)"] + end -.. image:: diagrams/buffer_views_2.svg - :alt: Diagram - :align: center + subgraph "Performance Impact" + Perf["4x fewer instructions
Better memory bandwidth
Reduced latency"] + end + + R1 & R2 & R3 & R4 --> Perf + VR --> Perf Understanding BufferView Indexing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - flowchart LR - subgraph "Input Parameters" - Offset["Offset
(e.g., 5)"] - ValidFlag["Valid Flag
(optional)"] - end - - subgraph "Processing" - BoundsCheck{{"Bounds Check
offset < buffer_size?"}} - FlagCheck{{"Flag Check
valid_flag == True?"}} - Access["Access Memory
buffer[offset]"] - end - - subgraph "Output" - ValidResult["Valid Result
Return value"] - Invalid["Invalid Result
Return 0 or default"] - end - - Offset --> BoundsCheck - ValidFlag --> FlagCheck - - BoundsCheck -->|Yes| FlagCheck - BoundsCheck -->|No| Invalid - - FlagCheck -->|Yes| Access - FlagCheck -->|No| Invalid - - Access --> ValidResult - - style Offset fill:#e0e7ff,stroke:#4338ca,stroke-width:2px - style ValidFlag fill:#e0e7ff,stroke:#4338ca,stroke-width:2px - style ValidResult fill:#d1fae5,stroke:#10b981,stroke-width:2px - style Invalid fill:#fee2e2,stroke:#ef4444,stroke-width:2px - - - - - +.. mermaid:: + + flowchart LR + subgraph "Input Parameters" + Offset["Offset
(e.g., 5)"] + ValidFlag["Valid Flag
(optional)"] + end + + subgraph "Processing" + BoundsCheck{{"Bounds Check
offset < buffer_size?"}} + FlagCheck{{"Flag Check
valid_flag == True?"}} + Access["Access Memory
buffer[offset]"] + end -.. image:: diagrams/buffer_views_3.svg - :alt: Diagram - :align: center + subgraph "Output" + ValidResult["Valid Result
Return value"] + Invalid["Invalid Result
Return 0 or default"] + end + + Offset --> BoundsCheck + ValidFlag --> FlagCheck + + BoundsCheck -->|Yes| FlagCheck + BoundsCheck -->|No| Invalid + + FlagCheck -->|Yes| Access + FlagCheck -->|No| Invalid + + Access --> ValidResult C++ Get Operations ~~~~~~~~~~~~~~~~~~ @@ -381,40 +318,22 @@ Atomic Operations Atomic vs Non-Atomic Operations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Non-Atomic Operation (Race Condition)" - NA1["Thread 1: Read value (10)"] --> NA2["Thread 1: Add 5 (15)"] - NA3["Thread 2: Read value (10)"] --> NA4["Thread 2: Add 3 (13)"] - NA2 --> NA5["Thread 1: Write 15"] - NA4 --> NA6["Thread 2: Write 13"] - NA5 & NA6 --> NA7["Final value: 13 ❌
(Lost update from Thread 1)"] - end - - subgraph "Atomic Operation (Thread-Safe)" - A1["Thread 1: atomic_add(5)"] --> A2["Hardware ensures
serialization"] - A3["Thread 2: atomic_add(3)"] --> A2 - A2 --> A4["Final value: 18 ✓
(Both updates applied)"] - end - - style NA7 fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style A4 fill:#d1fae5,stroke:#10b981,stroke-width:2px - - - - - - -.. image:: diagrams/buffer_views_4.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Non-Atomic Operation (Race Condition)" + NA1["Thread 1: Read value (10)"] --> NA2["Thread 1: Add 5 (15)"] + NA3["Thread 2: Read value (10)"] --> NA4["Thread 2: Add 3 (13)"] + NA2 --> NA5["Thread 1: Write 15"] + NA4 --> NA6["Thread 2: Write 13"] + NA5 & NA6 --> NA7["Final value: 13 ❌
(Lost update from Thread 1)"] + end + + subgraph "Atomic Operation (Thread-Safe)" + A1["Thread 1: atomic_add(5)"] --> A2["Hardware ensures
serialization"] + A3["Thread 2: atomic_add(3)"] --> A2 + A2 --> A4["Final value: 18 ✓
(Both updates applied)"] + end C++ Atomic Operations ~~~~~~~~~~~~~~~~~~~~~ diff --git a/docs/conceptual/ck_tile/convolution_example.rst b/docs/conceptual/ck_tile/convolution_example.rst index a857f9ae9e3..7dbd879bccf 100644 --- a/docs/conceptual/ck_tile/convolution_example.rst +++ b/docs/conceptual/ck_tile/convolution_example.rst @@ -15,53 +15,36 @@ This section covers how CK Tile's :ref:`tensor descriptor ` The key insight is that convolution can be transformed from a complex nested loop operation into a highly parallel matrix multiplication through the image to column (im2col) transformation. CK Tile's tensor descriptors provide the perfect abstraction for implementing this transformation efficiently without data duplication. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Convolution Process" - I["Input Image
6×6"] - K["Kernel
3×3"] - SW["Sliding Window
Extract 3×3 patches"] - DP["Dot Product
Element-wise multiply & sum"] - O["Output
4×4"] - end - - subgraph "Im2col Optimization" - W["Windows Matrix
16×9
(all patches)"] - KF["Kernel Flattened
9×1"] - MM["Matrix Multiply
W @ K"] - OF["Output Flattened
16×1"] - end - - I --> SW - K --> DP - SW --> DP - DP --> O - - SW --> W - K --> KF - W --> MM - KF --> MM - MM --> OF - OF --> O - - style I fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style O fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style MM fill:#fff3e0,stroke:#f57c00,stroke-width:2px - - - - - -.. image:: diagrams/convolution_example.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Convolution Process" + I["Input Image
6×6"] + K["Kernel
3×3"] + SW["Sliding Window
Extract 3×3 patches"] + DP["Dot Product
Element-wise multiply & sum"] + O["Output
4×4"] + end + + subgraph "Im2col Optimization" + W["Windows Matrix
16×9
(all patches)"] + KF["Kernel Flattened
9×1"] + MM["Matrix Multiply
W @ K"] + OF["Output Flattened
16×1"] + end + + I --> SW + K --> DP + SW --> DP + DP --> O + + SW --> W + K --> KF + W --> MM + KF --> MM + MM --> OF + OF --> O + Understanding Sliding Windows ============================= diff --git a/docs/conceptual/ck_tile/coordinate_movement.rst b/docs/conceptual/ck_tile/coordinate_movement.rst index 73633afa884..b8c917ec4c7 100644 --- a/docs/conceptual/ck_tile/coordinate_movement.rst +++ b/docs/conceptual/ck_tile/coordinate_movement.rst @@ -17,51 +17,28 @@ The coordinate movement system provides two key abstractions: TensorCoordinate f For the mathematical foundations of coordinate systems, see :ref:`ck_tile_coordinate_systems`. For simpler coordinate concepts, see :ref:`ck_tile_tensor_coordinates`. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Coordinate Movement System" - TC["TensorCoordinate
Position + Descriptor Context"] - TAC["TensorAdaptorCoordinate
Position + Transform Context"] - MC["move_coordinate()
Efficient Navigation"] - end - - subgraph "Movement Example" - S["Start: [1,1]
Offset: 5"] - M1["Move [0,1]
→ [1,2]
Offset: 6"] - M2["Move [1,0]
→ [2,2]
Offset: 10"] - M3["Move [1,1]
→ [3,3]
Offset: 15"] - end - - TC --> MC - TAC --> MC - - S --> M1 - M1 --> M2 - M2 --> M3 - - style TC fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style TAC fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style MC fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - - - - -.. image:: diagrams/coordinate_movement.svg - :alt: Diagram - :align: center - -.. image:: diagrams/coordinate_movement.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Coordinate Movement System" + TC["TensorCoordinate
Position + Descriptor Context"] + TAC["TensorAdaptorCoordinate
Position + Transform Context"] + MC["move_coordinate()
Efficient Navigation"] + end + + subgraph "Movement Example" + S["Start: [1,1]
Offset: 5"] + M1["Move [0,1]
→ [1,2]
Offset: 6"] + M2["Move [1,0]
→ [2,2]
Offset: 10"] + M3["Move [1,1]
→ [3,3]
Offset: 15"] + end + + TC --> MC + TAC --> MC + + S --> M1 + M1 --> M2 + M2 --> M3 TensorCoordinate: Descriptor-Aware Navigation ============================================= diff --git a/docs/conceptual/ck_tile/coordinate_systems.rst b/docs/conceptual/ck_tile/coordinate_systems.rst index 13a96190108..bca3a605e0e 100644 --- a/docs/conceptual/ck_tile/coordinate_systems.rst +++ b/docs/conceptual/ck_tile/coordinate_systems.rst @@ -15,51 +15,30 @@ The Five Coordinate Spaces The CK framework employs five interconnected coordinate spaces, each serving a specific purpose in the journey from thread identification to memory access. These spaces work together to solve the fundamental challenge of GPU programming: efficiently distributing work across thousands of parallel threads while maintaining optimal memory access patterns. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Coordinate Spaces Overview" - P["P-space
Thread Identification
Which thread am I?"] - Y["Y-space
Logical Tile
Which element in my tile?"] - X["X-space
Physical Tensor
Where in the tensor?"] - R["R-space
Replication
Data sharing pattern"] - D["D-space
Linear Storage
Memory address"] - end - - subgraph "Transformations" - T1["P + Y → X
Thread + Element → Position"] - T2["X → D
Position → Address"] - end - - P --> T1 - Y --> T1 - T1 --> X - X --> T2 - T2 --> D - - R -.-> P - R -.-> Y - - style P fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style Y fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style X fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style R fill:#fce4ec,stroke:#c2185b,stroke-width:2px - style D fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px - - - - - - -.. image:: diagrams/coordinate_systems_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Coordinate Spaces Overview" + P["P-space
Thread Identification
Which thread am I?"] + Y["Y-space
Logical Tile
Which element in my tile?"] + X["X-space
Physical Tensor
Where in the tensor?"] + R["R-space
Replication
Data sharing pattern"] + D["D-space
Linear Storage
Memory address"] + end + + subgraph "Transformations" + T1["P + Y → X
Thread + Element → Position"] + T2["X → D
Position → Address"] + end + + P --> T1 + Y --> T1 + T1 --> X + X --> T2 + T2 --> D + + R -.-> P + R -.-> Y The Challenge and Solution ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -82,53 +61,35 @@ Partition Space (P-space) represents the foundation of the coordinate system hie GPU Thread Hierarchy ~~~~~~~~~~~~~~~~~~~~ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "GPU Thread Hierarchy" - subgraph "Block" - subgraph "Warp 0" - T0["Thread 0
P=[0,0]"] - T1["Thread 1
P=[0,1]"] - T2["Thread 2
P=[0,2]"] - T31["..."] - T3["Thread 31
P=[0,31]"] - end - subgraph "Warp 1" - T32["Thread 32
P=[1,0]"] - T33["Thread 33
P=[1,1]"] - T34["..."] - T63["Thread 63
P=[1,31]"] - end - W2["Warp 2..."] - W7["Warp 7"] - end - end - - subgraph "P-space Mapping" - PM["P-coordinates = [warp_id, lane_id]
or
P-coordinates = [block_x, block_y, thread_x, thread_y]"] - end - - T0 --> PM - T32 --> PM - - style T0 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style T32 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - - - - - - -.. image:: diagrams/coordinate_systems_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "GPU Thread Hierarchy" + subgraph "Block" + subgraph "Warp 0" + T0["Thread 0
P=[0,0]"] + T1["Thread 1
P=[0,1]"] + T2["Thread 2
P=[0,2]"] + T31["..."] + T3["Thread 31
P=[0,31]"] + end + subgraph "Warp 1" + T32["Thread 32
P=[1,0]"] + T33["Thread 33
P=[1,1]"] + T34["..."] + T63["Thread 63
P=[1,31]"] + end + W2["Warp 2..."] + W7["Warp 7"] + end + end + + subgraph "P-space Mapping" + PM["P-coordinates = [warp_id, lane_id]
or
P-coordinates = [block_x, block_y, thread_x, thread_y]"] + end + + T0 --> PM + T32 --> PM The structure of P-space directly reflects the :ref:`hardware organization ` of GPUs. Each thread receives a unique P-coordinate that encodes its position within the execution hierarchy. For simple distributions, P-space might be one-dimensional, containing only a thread ID. For complex hierarchical distributions, P-space can have multiple dimensions representing different levels of the GPU's thread organization. @@ -173,56 +134,36 @@ Yield Space (Y-space) represents the logical organization of work within each th Work Assignment Structure ~~~~~~~~~~~~~~~~~~~~~~~~~ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Thread's Tile (2x2 elements)" - Y00["Y=[0,0]
Element 0"] - Y01["Y=[0,1]
Element 1"] - Y10["Y=[1,0]
Element 2"] - Y11["Y=[1,1]
Element 3"] - end - - subgraph "Y-space Structure" - YS["Each thread processes
the same Y-space pattern
but at different X locations"] - end - - subgraph "Example: 4 Threads" - T0["Thread 0
P=[0,0]"] - T1["Thread 1
P=[0,1]"] - T2["Thread 2
P=[1,0]"] - T3["Thread 3
P=[1,1]"] - end - - Y00 --> YS - Y01 --> YS - Y10 --> YS - Y11 --> YS - - T0 --> YS - T1 --> YS - T2 --> YS - T3 --> YS - - style Y00 fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style Y01 fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style Y10 fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style Y11 fill:#fff3e0,stroke:#f57c00,stroke-width:2px - - - - - - -.. image:: diagrams/coordinate_systems_3.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Thread's Tile (2x2 elements)" + Y00["Y=[0,0]
Element 0"] + Y01["Y=[0,1]
Element 1"] + Y10["Y=[1,0]
Element 2"] + Y11["Y=[1,1]
Element 3"] + end + + subgraph "Y-space Structure" + YS["Each thread processes
the same Y-space pattern
but at different X locations"] + end + + subgraph "Example: 4 Threads" + T0["Thread 0
P=[0,0]"] + T1["Thread 1
P=[0,1]"] + T2["Thread 2
P=[1,0]"] + T3["Thread 3
P=[1,1]"] + end + + Y00 --> YS + Y01 --> YS + Y10 --> YS + Y11 --> YS + + T0 --> YS + T1 --> YS + T2 --> YS + T3 --> YS The power of Y-space lies in its ability to express different iteration patterns without changing the underlying distribution logic. A thread might traverse its Y-space in row-major order for one algorithm, column-major for another, or even use :ref:`space-filling curves ` for optimal cache utilization. This flexibility enables algorithm-specific optimizations while maintaining a consistent framework. @@ -304,49 +245,30 @@ The transformation from P and Y coordinates to X coordinates represents the hear Transformation Pipeline ~~~~~~~~~~~~~~~~~~~~~~~ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Input" - P["P-coordinates
Thread identity
P=[1,0]"] - Y["Y-coordinates
Element in tile
Y=[0,1]"] - end - - subgraph "Transformation" - T["P + Y → X
Base position + Offset"] - end - - subgraph "Output" - X["X-coordinates
Tensor position
X=[2,1]"] - end - - subgraph "Example" - E["Thread P=[1,0] at base (2,0)
Element Y=[0,1] adds offset (0,1)
Result X=[2,1] in tensor"] - end - - P --> T - Y --> T - T --> X - X --> E - - style P fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style Y fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style X fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - - - - -.. image:: diagrams/coordinate_systems_4.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph LR + subgraph "Input" + P["P-coordinates
Thread identity
P=[1,0]"] + Y["Y-coordinates
Element in tile
Y=[0,1]"] + end + + subgraph "Transformation" + T["P + Y → X
Base position + Offset"] + end + + subgraph "Output" + X["X-coordinates
Tensor position
X=[2,1]"] + end + + subgraph "Example" + E["Thread P=[1,0] at base (2,0)
Element Y=[0,1] adds offset (0,1)
Result X=[2,1] in tensor"] + end + + P --> T + Y --> T + T --> X + X --> E Mathematical Foundation ~~~~~~~~~~~~~~~~~~~~~~~ @@ -413,45 +335,27 @@ D-space represents the final transformation in the coordinate pipeline: converti Linearization Strategies ~~~~~~~~~~~~~~~~~~~~~~~~ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "X-coordinates" - X["X = [2, 3]
2D Position"] - end - - subgraph "Layout Options" - RM["Row-Major
D = 2×width + 3"] - CM["Column-Major
D = 3×height + 2"] - BL["Blocked
Complex pattern"] - end - - subgraph "D-coordinate" - D["D = 11
Linear Address"] - end - - X --> RM - X --> CM - X --> BL - RM --> D - - style X fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style D fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px - - - - - - -.. image:: diagrams/coordinate_systems_5.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph LR + subgraph "X-coordinates" + X["X = [2, 3]
2D Position"] + end + + subgraph "Layout Options" + RM["Row-Major
D = 2×width + 3"] + CM["Column-Major
D = 3×height + 2"] + BL["Blocked
Complex pattern"] + end + + subgraph "D-coordinate" + D["D = 11
Linear Address"] + end + + X --> RM + X --> CM + X --> BL + RM --> D The linearization process must consider multiple factors: @@ -482,58 +386,39 @@ Complete Pipeline Example The following is a complete example showing how all coordinate spaces work together: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Step 1: Thread Identification" - TID["Thread ID = 5"] - P["P-coordinates
P = [0, 5]
(warp 0, lane 5)"] - end - - subgraph "Step 2: Work Assignment" - Y["Y-coordinates
Y = [1, 0]
(element in tile)"] - end - - subgraph "Step 3: P+Y Transformation" - TRANS["P + Y → X
Thread position + Element offset"] - X["X-coordinates
X = [1, 5]
(tensor position)"] - end - - subgraph "Step 4: Linearization" - LIN["X → D
Row-major: D = x₀ × width + x₁"] - D["D-coordinate
D = 13
(memory address)"] - end - - subgraph "Step 5: Memory Access" - MEM["Hardware accesses
memory[13]"] - end - - TID --> P - P --> TRANS - Y --> TRANS - TRANS --> X - X --> LIN - LIN --> D - D --> MEM - - style P fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style Y fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style X fill:#e8f5e9,stroke:#388e3c,stroke-width:3px - style D fill:#f3e5f5,stroke:#7b1fa2,stroke-width:3px - style MEM fill:#ffebee,stroke:#c62828,stroke-width:3px - - - - -.. image:: diagrams/coordinate_systems_6.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Step 1: Thread Identification" + TID["Thread ID = 5"] + P["P-coordinates
P = [0, 5]
(warp 0, lane 5)"] + end + + subgraph "Step 2: Work Assignment" + Y["Y-coordinates
Y = [1, 0]
(element in tile)"] + end + + subgraph "Step 3: P+Y Transformation" + TRANS["P + Y → X
Thread position + Element offset"] + X["X-coordinates
X = [1, 5]
(tensor position)"] + end + + subgraph "Step 4: Linearization" + LIN["X → D
Row-major: D = x₀ × width + x₁"] + D["D-coordinate
D = 13
(memory address)"] + end + + subgraph "Step 5: Memory Access" + MEM["Hardware accesses
memory[13]"] + end + + TID --> P + P --> TRANS + Y --> TRANS + TRANS --> X + X --> LIN + LIN --> D + D --> MEM Real-World Example: Matrix Multiplication ----------------------------------------- diff --git a/docs/conceptual/ck_tile/descriptors.rst b/docs/conceptual/ck_tile/descriptors.rst index 449e7bc4b1a..6a028dffdd0 100644 --- a/docs/conceptual/ck_tile/descriptors.rst +++ b/docs/conceptual/ck_tile/descriptors.rst @@ -96,46 +96,28 @@ The Pipeline Concept Every TensorDescriptor in CK Tile can be thought of as a **transformation pipeline**. The functions above create the *first stage* of this pipeline, defining the initial :ref:`transformation ` that takes a simple, one-dimensional block of memory and presents it as a logical, multi-dimensional tensor view. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Pipeline Stages" - S1["Stage 1
Base Layout
[M, N]"] - S2["Stage 2
Transform
Unmerge"] - S3["Stage 3
New View
[M1, M2, N]"] - S4["Stage N
Final View
[...]"] - end - - subgraph "Same Data" - D["Physical Memory
No data movement"] - end - - S1 --> S2 - S2 --> S3 - S3 --> S4 - - S1 -.-> D - S2 -.-> D - S3 -.-> D - S4 -.-> D - - style D fill:#ffebee,stroke:#d32f2f,stroke-width:2px - style S1 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style S3 fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - - -.. image:: diagrams/descriptors_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph LR + subgraph "Pipeline Stages" + S1["Stage 1
Base Layout
[M, N]"] + S2["Stage 2
Transform
Unmerge"] + S3["Stage 3
New View
[M1, M2, N]"] + S4["Stage N
Final View
[...]"] + end + + subgraph "Same Data" + D["Physical Memory
No data movement"] + end + + S1 --> S2 + S2 --> S3 + S3 --> S4 -.. image:: diagrams/descriptors_1.svg - :alt: Diagram - :align: center + S1 -.-> D + S2 -.-> D + S3 -.-> D + S4 -.-> D The Initial Pipeline Stage ~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -200,52 +182,32 @@ To get from [2, 6] to [2, 2, 3], we need: Analysis of the Final Pipeline ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Transform Pipeline" - T0["Transform 0
Base Unmerge
Input: [0]
Output: [1,2]"] - T1["Transform 1
PassThrough
Input: [1]
Output: [3]"] - T2["Transform 2
Unmerge
Input: [2]
Output: [4,5]"] - end - - subgraph "Hidden Dimensions" - H0["Hidden ID 0
Raw Buffer"] - H1["Hidden ID 1
Dim 0 (size 2)"] - H2["Hidden ID 2
Dim 1 (size 6)"] - H3["Hidden ID 3
Final Dim 0"] - H4["Hidden ID 4
Final Dim 1"] - H5["Hidden ID 5
Final Dim 2"] - end - - H0 --> T0 - T0 --> H1 - T0 --> H2 - H1 --> T1 - H2 --> T2 - T1 --> H3 - T2 --> H4 - T2 --> H5 - - style H0 fill:#ffebee,stroke:#d32f2f,stroke-width:2px - style H3 fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style H4 fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style H5 fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - - - -.. image:: diagrams/descriptors_2.svg - :alt: Diagram - :align: center - -.. image:: diagrams/descriptors_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Transform Pipeline" + T0["Transform 0
Base Unmerge
Input: [0]
Output: [1,2]"] + T1["Transform 1
PassThrough
Input: [1]
Output: [3]"] + T2["Transform 2
Unmerge
Input: [2]
Output: [4,5]"] + end + + subgraph "Hidden Dimensions" + H0["Hidden ID 0
Raw Buffer"] + H1["Hidden ID 1
Dim 0 (size 2)"] + H2["Hidden ID 2
Dim 1 (size 6)"] + H3["Hidden ID 3
Final Dim 0"] + H4["Hidden ID 4
Final Dim 1"] + H5["Hidden ID 5
Final Dim 2"] + end + + H0 --> T0 + T0 --> H1 + T0 --> H2 + H1 --> T1 + H2 --> T2 + T1 --> H3 + T2 --> H4 + T2 --> H5 The pipeline now has three stages: diff --git a/docs/conceptual/ck_tile/encoding_internals.rst b/docs/conceptual/ck_tile/encoding_internals.rst index 499ec0bd4a0..1b64504e6f9 100644 --- a/docs/conceptual/ck_tile/encoding_internals.rst +++ b/docs/conceptual/ck_tile/encoding_internals.rst @@ -15,53 +15,39 @@ The tile distribution encoding system represents the core mathematical framework At its heart, the encoding system defines how multi-dimensional tensor data is distributed across GPU processing elements through a hierarchical decomposition scheme. By specifying relationships between different coordinate spaces of replication (R), hierarchical (H), partition (P), and yield (Y) dimension, the encoding provides a complete blueprint for data layout and access patterns that can be resolved entirely at compile time. This is the internal mechanism behind :ref:`ck_tile_tile_distribution`. See :ref:`ck_tile_coordinate_systems` for more information about coordinate spaces. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Encoding Components" - RS["R-space Lengths
Replication dimensions"] - HS["H-space Lengths
Hierarchical decomposition
[[2,2],[2,2]]"] - P2RH["P→RH Mappings
Thread to hierarchy
Major/Minor"] - Y2RH["Y→RH Mappings
Element to hierarchy
Major/Minor"] - end - - subgraph "Generated Components" - ADAPTOR["ps_ys_to_xs_adaptor
Coordinate transformer"] - DESC["ys_to_d_descriptor
Memory linearizer"] - ENC["Encoding
Original specification"] - end - - subgraph "Transformation Chain" - T1["Replicate
Transform"] - T2["Unmerge
Transform"] - T3["Merge
Transform"] - end - - RS --> T1 - HS --> T2 - P2RH --> ADAPTOR - Y2RH --> ADAPTOR - - T1 --> T2 - T2 --> T3 - T3 --> ADAPTOR - - HS --> DESC - Y2RH --> DESC - - style RS fill:#fce4ec,stroke:#c2185b,stroke-width:2px - style HS fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style ADAPTOR fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style DESC fill:#fff3e0,stroke:#f57c00,stroke-width:3px - - - -.. image:: diagrams/encoding_internals_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Encoding Components" + RS["R-space Lengths
Replication dimensions"] + HS["H-space Lengths
Hierarchical decomposition
[[2,2],[2,2]]"] + P2RH["P→RH Mappings
Thread to hierarchy
Major/Minor"] + Y2RH["Y→RH Mappings
Element to hierarchy
Major/Minor"] + end + + subgraph "Generated Components" + ADAPTOR["ps_ys_to_xs_adaptor
Coordinate transformer"] + DESC["ys_to_d_descriptor
Memory linearizer"] + ENC["Encoding
Original specification"] + end + + subgraph "Transformation Chain" + T1["Replicate
Transform"] + T2["Unmerge
Transform"] + T3["Merge
Transform"] + end + + RS --> T1 + HS --> T2 + P2RH --> ADAPTOR + Y2RH --> ADAPTOR + + T1 --> T2 + T2 --> T3 + T3 --> ADAPTOR + + HS --> DESC + Y2RH --> DESC Encoding Structure ================== @@ -203,44 +189,31 @@ Transformation Pipeline The encoding generates a transformation pipeline that converts coordinates using the concepts from :ref:`ck_tile_transforms` and :ref:`ck_tile_adaptors`: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - flowchart LR - subgraph "Input Coordinates" - P["P-coordinates
[warp_id, lane_id]"] - Y["Y-coordinates
[y0, y1, y2, y3]"] - end - - subgraph "Transformation Pipeline" - C1["Combine P+Y"] - T1["Replicate
Transform
(if R-dims exist)"] - T2["Unmerge
Transform
(break into H-dims)"] - T3["Merge
Transform
(combine to X-dims)"] - end - - subgraph "Output" - X["X-coordinates
[x0, x1]
Tensor position"] - end - - P --> C1 - Y --> C1 - C1 --> T1 - T1 --> T2 - T2 --> T3 - T3 --> X - - style P fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style Y fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style X fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - -.. image:: diagrams/encoding_internals_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + flowchart LR + subgraph "Input Coordinates" + P["P-coordinates
[warp_id, lane_id]"] + Y["Y-coordinates
[y0, y1, y2, y3]"] + end + + subgraph "Transformation Pipeline" + C1["Combine P+Y"] + T1["Replicate
Transform
(if R-dims exist)"] + T2["Unmerge
Transform
(break into H-dims)"] + T3["Merge
Transform
(combine to X-dims)"] + end + + subgraph "Output" + X["X-coordinates
[x0, x1]
Tensor position"] + end + + P --> C1 + Y --> C1 + C1 --> T1 + T1 --> T2 + T2 --> T3 + T3 --> X Building the Transformation Chain --------------------------------- diff --git a/docs/conceptual/ck_tile/introduction_motivation.rst b/docs/conceptual/ck_tile/introduction_motivation.rst index a939aef4c85..33550e49d09 100644 --- a/docs/conceptual/ck_tile/introduction_motivation.rst +++ b/docs/conceptual/ck_tile/introduction_motivation.rst @@ -17,81 +17,62 @@ In this introduction, we establish the fundamental problems that tile distributi The GPU Memory Problem ---------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Random Access Pattern (Inefficient)" - subgraph "Threads" - T0_R["Thread 0"] - T1_R["Thread 1"] - T2_R["Thread 2"] - T3_R["Thread 3"] - end - - subgraph "Memory" - M0["Mem[0]"] - M7["Mem[7]"] - M15["Mem[15]"] - M23["Mem[23]"] - M31["Mem[31]"] - M39["Mem[39]"] - M47["Mem[47]"] - M55["Mem[55]"] - end - - T0_R -.-> M23 - T1_R -.-> M7 - T2_R -.-> M47 - T3_R -.-> M15 - end - - subgraph "Tile Distribution Pattern (Efficient)" - subgraph "Threads_TD" - T0_TD["Thread 0"] - T1_TD["Thread 1"] - T2_TD["Thread 2"] - T3_TD["Thread 3"] - end - - subgraph "Memory_TD" - M0_TD["Mem[0]"] - M1_TD["Mem[1]"] - M2_TD["Mem[2]"] - M3_TD["Mem[3]"] - M4_TD["Mem[4]"] - M5_TD["Mem[5]"] - M6_TD["Mem[6]"] - M7_TD["Mem[7]"] - end - - T0_TD --> M0_TD - T0_TD --> M1_TD - T1_TD --> M2_TD - T1_TD --> M3_TD - T2_TD --> M4_TD - T2_TD --> M5_TD - T3_TD --> M6_TD - T3_TD --> M7_TD - end - - style T0_R fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style T1_R fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style T2_R fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style T3_R fill:#fee2e2,stroke:#ef4444,stroke-width:2px - - style T0_TD fill:#d1fae5,stroke:#10b981,stroke-width:2px - style T1_TD fill:#d1fae5,stroke:#10b981,stroke-width:2px - style T2_TD fill:#d1fae5,stroke:#10b981,stroke-width:2px - style T3_TD fill:#d1fae5,stroke:#10b981,stroke-width:2px - - - -.. image:: diagrams/introduction_motivation_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Random Access Pattern (Inefficient)" + subgraph "Threads" + T0_R["Thread 0"] + T1_R["Thread 1"] + T2_R["Thread 2"] + T3_R["Thread 3"] + end + + subgraph "Memory" + M0["Mem[0]"] + M7["Mem[7]"] + M15["Mem[15]"] + M23["Mem[23]"] + M31["Mem[31]"] + M39["Mem[39]"] + M47["Mem[47]"] + M55["Mem[55]"] + end + + T0_R -.-> M23 + T1_R -.-> M7 + T2_R -.-> M47 + T3_R -.-> M15 + end + + subgraph "Tile Distribution Pattern (Efficient)" + subgraph "Threads_TD" + T0_TD["Thread 0"] + T1_TD["Thread 1"] + T2_TD["Thread 2"] + T3_TD["Thread 3"] + end + + subgraph "Memory_TD" + M0_TD["Mem[0]"] + M1_TD["Mem[1]"] + M2_TD["Mem[2]"] + M3_TD["Mem[3]"] + M4_TD["Mem[4]"] + M5_TD["Mem[5]"] + M6_TD["Mem[6]"] + M7_TD["Mem[7]"] + end + + T0_TD --> M0_TD + T0_TD --> M1_TD + T1_TD --> M2_TD + T1_TD --> M3_TD + T2_TD --> M4_TD + T2_TD --> M5_TD + T3_TD --> M6_TD + T3_TD --> M7_TD + end Why Random Memory Access is Slow ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -216,42 +197,26 @@ The Coordinate Mapping Insight At the heart of tile distribution lies a profound mathematical insight: efficient GPU computation requires a systematic framework for mapping between different coordinate spaces. This framework transforms the complex problem of thread-to-data assignment into a series of well-defined mathematical transformations, each serving a specific purpose in the journey from abstract algorithm to concrete hardware execution. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Coordinate Spaces" - P["P-space
Thread Position
(thread_x, thread_y,
warp_id, block_id)"] - Y["Y-space
Local Data
(y0, y1, y2, y3)"] - X["X-space
Global Position
(x0, x1)"] - D["D-space
Memory Address
(linearized)"] - end - - subgraph "Transformations" - T1["P + Y → X
Thread data mapping"] - T2["X → D
Memory linearization"] - end - - P --> T1 - Y --> T1 - T1 --> X - X --> T2 - T2 --> D - - style P fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style Y fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style X fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style D fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px - style T1 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px - style T2 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px - - - -.. image:: diagrams/introduction_motivation_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph LR + subgraph "Coordinate Spaces" + P["P-space
Thread Position
(thread_x, thread_y,
warp_id, block_id)"] + Y["Y-space
Local Data
(y0, y1, y2, y3)"] + X["X-space
Global Position
(x0, x1)"] + D["D-space
Memory Address
(linearized)"] + end + + subgraph "Transformations" + T1["P + Y → X
Thread data mapping"] + T2["X → D
Memory linearization"] + end + + P --> T1 + Y --> T1 + T1 --> X + X --> T2 + T2 --> D The elegance of this approach emerges from its separation of concerns. Each coordinate space represents a distinct aspect of the computation, and the transformations between them encapsulate specific optimization strategies. This separation allows developers to reason about their algorithms in natural terms while the framework handles the complex mapping to efficient hardware execution patterns. diff --git a/docs/conceptual/ck_tile/lds_index_swapping.rst b/docs/conceptual/ck_tile/lds_index_swapping.rst index b0a2b320100..f0d47494a47 100644 --- a/docs/conceptual/ck_tile/lds_index_swapping.rst +++ b/docs/conceptual/ck_tile/lds_index_swapping.rst @@ -25,48 +25,31 @@ Step 1: XOR Transform The original K coordinate is split into K0 and K1, where K1 represents the thread vector size along the K dimension (KPack) and K0 is KPerBlock/KPack. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "3D LDS coordinate [K0, M, K1]" - K0["KPerBlock/KPack * MLdsLayer
K0"] - M["MPerBlock/MLdsLayer
M"] - K1["KPack
K1"] - end - - subgraph "XOR Transform" - XT["make_xor_transform"] - end - - subgraph "Update K0 with XOR transformation" - K01["KPerBlock/KPack * MLdsLayer
K0'"] - M1["MPerBlock/MLdsLayer
M"] - K11["KPack
K1"] - end - - K0 --> XT - M --> XT - K1 --> K11 - - XT --> K01 - XT --> M1 - - style K0 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style K01 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style M fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style M1 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - - style K1 fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style K11 fill:#fff3e0,stroke:#f57c00,stroke-width:2px - - - -.. image:: diagrams/lds_index_swapping_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "3D LDS coordinate [K0, M, K1]" + K0["KPerBlock/KPack * MLdsLayer
K0"] + M["MPerBlock/MLdsLayer
M"] + K1["KPack
K1"] + end + + subgraph "XOR Transform" + XT["make_xor_transform"] + end + + subgraph "Update K0 with XOR transformation" + K01["KPerBlock/KPack * MLdsLayer
K0'"] + M1["MPerBlock/MLdsLayer
M"] + K11["KPack
K1"] + end + + K0 --> XT + M --> XT + K1 --> K11 + + XT --> K01 + XT --> M1 The XOR transformation updates the K0 coordinate using the formula: @@ -81,54 +64,33 @@ Step 2: Unmerge Transform The transformed K0' is split into L and K0'' components, creating an intermediate 4D coordinate space. This is necessary when MLdsLayer > 1, allowing multiple rows to share the same set of memory banks for better utilization with smaller tile sizes. - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "3D LDS coordinate [K0', M, K1]" - K0["KPerBlock/KPack * MLdsLayer
K0'"] - M["MPerBlock/MLdsLayer
M"] - K1["KPack
K1"] - end - - subgraph "Unmerge into 2 components" - UM["make_unmerge_transform"] - end - - subgraph "4D intermediate transformation space" - L["MLdsLayer
L"] - M1["MPerBlock/MLdsLayer
M"] - K01["KPerBlock/KPack
K0''"] - K11["KPack
K1"] - end - - K0 --> UM - M --> M1 - K1 --> K11 - - UM --> L - UM --> K01 - - style K0 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style L fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style K01 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - - style M fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style M1 fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - style K1 fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style K11 fill:#fff3e0,stroke:#f57c00,stroke-width:2px - - - - - -.. image:: diagrams/lds_index_swapping_2.svg - :alt: Diagram - :align: center + +.. mermaid:: + + graph TB + subgraph "3D LDS coordinate [K0', M, K1]" + K0["KPerBlock/KPack * MLdsLayer
K0'"] + M["MPerBlock/MLdsLayer
M"] + K1["KPack
K1"] + end + + subgraph "Unmerge into 2 components" + UM["make_unmerge_transform"] + end + + subgraph "4D intermediate transformation space" + L["MLdsLayer
L"] + M1["MPerBlock/MLdsLayer
M"] + K01["KPerBlock/KPack
K0''"] + K11["KPack
K1"] + end + + K0 --> UM + M --> M1 + K1 --> K11 + + UM --> L + UM --> K01 The unmerge operation: @@ -144,56 +106,38 @@ Step 3: Merge Transform The final step merges the 4D coordinates back into 2D transformed coordinates (M', K'). - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "4D LDS Coordinates [L, M, K0'', K1]" - L["MLdsLayer
L"] - M1["MPerBlock/MLdsLayer
M"] - K0["KPerBlock/KPack
K0''"] - K1["KPack
K1"] - end - - subgraph "Merge into 1 component" - ME0["make_merge_transform"] - end - - subgraph "Merge into 1 component" - ME1["make_merge_transform"] - end - - subgraph "Transformed 2D coordinates [M', K']" - M11["MPerBlock
M'"] - K01["KPerBlock
K'"] - end - - L --> ME0 - M1 --> ME0 - - K0 --> ME1 - K1 --> ME1 - - ME0 --> M11 - ME1 --> K01 - - style K0 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style K1 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style K01 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - - style M1 fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style L fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style M11 fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - - -.. image:: diagrams/lds_index_swapping_3.svg - :alt: Diagram - :align: center + +.. mermaid:: + + graph TB + subgraph "4D LDS Coordinates [L, M, K0'', K1]" + L["MLdsLayer
L"] + M1["MPerBlock/MLdsLayer
M"] + K0["KPerBlock/KPack
K0''"] + K1["KPack
K1"] + end + + subgraph "Merge into 1 component" + ME0["make_merge_transform"] + end + + subgraph "Merge into 1 component" + ME1["make_merge_transform"] + end + + subgraph "Transformed 2D coordinates [M', K']" + M11["MPerBlock
M'"] + K01["KPerBlock
K'"] + end + + L --> ME0 + M1 --> ME0 + + K0 --> ME1 + K1 --> ME1 + + ME0 --> M11 + ME1 --> K01 C++ Implementation diff --git a/docs/conceptual/ck_tile/load_store_traits.rst b/docs/conceptual/ck_tile/load_store_traits.rst index bf2decc37e7..7be70c770f3 100644 --- a/docs/conceptual/ck_tile/load_store_traits.rst +++ b/docs/conceptual/ck_tile/load_store_traits.rst @@ -102,34 +102,20 @@ Vectorization Selection Algorithm LoadStoreTraits employs an advanced algorithm to select the best dimension for vectorization: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TD - A[Analyze Distribution] --> B{Check Each Dimension} - B --> C[Calculate Stride] - C --> D{Stride == 1?} - D -->|Yes| E[Candidate for Vectorization] - D -->|No| F[Skip Dimension] - E --> G[Check Alignment] - G --> H[Check Vector Size] - H --> I[Score Dimension] - F --> B - I --> J[Select Best Dimension] - J --> K[Configure Vector Access] - - style A fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style J fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style K fill:#fff3e0,stroke:#f57c00,stroke-width:2px - - - - -.. image:: diagrams/load_store_traits_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TD + A[Analyze Distribution] --> B{Check Each Dimension} + B --> C[Calculate Stride] + C --> D{Stride == 1?} + D -->|Yes| E[Candidate for Vectorization] + D -->|No| F[Skip Dimension] + E --> G[Check Alignment] + G --> H[Check Vector Size] + H --> I[Score Dimension] + F --> B + I --> J[Select Best Dimension] + J --> K[Configure Vector Access] **Example: Comparing Different Memory Layouts** @@ -172,42 +158,30 @@ Memory Access Patterns LoadStoreTraits creates efficient access patterns using space-filling curves: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Linear Traversal" - L1["0→1→2→3"] - L2["4→5→6→7"] - L3["Cache miss"] - L4["8→9→10→11"] - end - - subgraph "Snake Pattern" - S1["0→1→2→3"] - S2["7←6←5←4"] - S3["Cache hit!"] - S4["8→9→10→11"] - end - - L1 --> L2 - L2 --> L3 - L3 --> L4 - - S1 --> S2 - S2 --> S3 - S3 --> S4 - - style L3 fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style S3 fill:#d1fae5,stroke:#10b981,stroke-width:2px - - - -.. image:: diagrams/load_store_traits_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph LR + subgraph "Linear Traversal" + L1["0→1→2→3"] + L2["4→5→6→7"] + L3["Cache miss"] + L4["8→9→10→11"] + end + + subgraph "Snake Pattern" + S1["0→1→2→3"] + S2["7←6←5←4"] + S3["Cache hit!"] + S4["8→9→10→11"] + end + + L1 --> L2 + L2 --> L3 + L3 --> L4 + + S1 --> S2 + S2 --> S3 + S3 --> S4 **C++ Access Pattern Example:** diff --git a/docs/conceptual/ck_tile/space_filling_curve.rst b/docs/conceptual/ck_tile/space_filling_curve.rst index 869285b4621..43b4ce0b78c 100644 --- a/docs/conceptual/ck_tile/space_filling_curve.rst +++ b/docs/conceptual/ck_tile/space_filling_curve.rst @@ -190,44 +190,30 @@ Snake Pattern for Cache Optimization The snake pattern reverses traversal direction on alternate rows, minimizing the distance between consecutive accesses: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Linear Pattern" - L1["Row 0: →"] - L2["Row 1: →"] - L3["Jump back"] - L4["Row 2: →"] - end - - subgraph "Snake Pattern" - S1["Row 0: →"] - S2["Row 1: ←"] - S3["Continue"] - S4["Row 2: →"] - end - - L1 --> L3 - L3 --> L2 - L2 --> L3 - L3 --> L4 - - S1 --> S2 - S2 --> S4 - - style L3 fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style S3 fill:#d1fae5,stroke:#10b981,stroke-width:2px - - - - - -.. image:: diagrams/space_filling_curve.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph LR + subgraph "Linear Pattern" + L1["Row 0: →"] + L2["Row 1: →"] + L3["Jump back"] + L4["Row 2: →"] + end + + subgraph "Snake Pattern" + S1["Row 0: →"] + S2["Row 1: ←"] + S3["Continue"] + S4["Row 2: →"] + end + + L1 --> L3 + L3 --> L2 + L2 --> L3 + L3 --> L4 + + S1 --> S2 + S2 --> S4 .. code-block:: cpp diff --git a/docs/conceptual/ck_tile/static_distributed_tensor.rst b/docs/conceptual/ck_tile/static_distributed_tensor.rst index 1f7a93657f0..075a2150b28 100644 --- a/docs/conceptual/ck_tile/static_distributed_tensor.rst +++ b/docs/conceptual/ck_tile/static_distributed_tensor.rst @@ -89,29 +89,18 @@ Understanding how static distributed tensors organize memory is important for pe The memory layout follows a hierarchical pattern: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TD - A[Global Tensor 64x64] --> B[Thread Block 16x16] - B --> C[Thread 0,0
Elements 0:3,0:3] - B --> D[Thread 0,1
Elements 0:3,4:7] - B --> E[Thread 1,0
Elements 4:7,0:3] - B --> F[...] - - C --> G[Local Array
16 elements] - D --> H[Local Array
16 elements] - E --> I[Local Array
16 elements] - - - - - -.. image:: diagrams/static_distributed_tensor.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TD + A[Global Tensor 64x64] --> B[Thread Block 16x16] + B --> C[Thread 0,0
Elements 0:3,0:3] + B --> D[Thread 0,1
Elements 0:3,4:7] + B --> E[Thread 1,0
Elements 4:7,0:3] + B --> F[...] + + C --> G[Local Array
16 elements] + D --> H[Local Array
16 elements] + E --> I[Local Array
16 elements] Element Access and Indexing =========================== diff --git a/docs/conceptual/ck_tile/sweep_tile.rst b/docs/conceptual/ck_tile/sweep_tile.rst index 4dfb6a2ad10..c8aace2de82 100644 --- a/docs/conceptual/ck_tile/sweep_tile.rst +++ b/docs/conceptual/ck_tile/sweep_tile.rst @@ -15,46 +15,29 @@ Sweep operations are the clean way to iterate over distributed data in CK Tile. Sweep operations use the "load once, use many times" pattern. Load X data once into registers, then sweep through Y positions while keeping X in fast memory. This maximizes data reuse and minimizes memory bandwidth requirements. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - flowchart LR - subgraph "X-Tile (Reused)" - XT["X data loaded once
Stays in registers"] - end - - subgraph "Y-Sweep" - Y1["Y position 0"] - Y2["Y position 1"] - Y3["Y position 2"] - YN["Y position N"] - end - - subgraph "Computation" - C["Process(X, Y)"] - end - - XT --> C - Y1 --> C - Y2 --> C - Y3 --> C - YN --> C - - style XT fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style C fill:#e0e7ff,stroke:#4338ca,stroke-width:2px - - - - - -.. image:: diagrams/sweep_tile_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + flowchart LR + subgraph "X-Tile (Reused)" + XT["X data loaded once
Stays in registers"] + end + + subgraph "Y-Sweep" + Y1["Y position 0"] + Y2["Y position 1"] + Y3["Y position 2"] + YN["Y position N"] + end + + subgraph "Computation" + C["Process(X, Y)"] + end + + XT --> C + Y1 --> C + Y2 --> C + Y3 --> C + YN --> C The Complete GPU Workflow ========================= @@ -123,38 +106,24 @@ Memory Efficiency Pattern The sweep pattern provides significant memory efficiency benefits. This is particularly important for GPU architectures (see :ref:`ck_tile_gpu_basics`) where memory bandwidth is often the limiting factor: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Traditional Approach" - T1["Load X[0]"] --> P1["Process"] - T2["Load Y[0]"] --> P1 - T3["Load X[0]"] --> P2["Process"] - T4["Load Y[1]"] --> P2 - T5["Load X[0]"] --> P3["Process"] - T6["Load Y[2]"] --> P3 - Note1["X loaded 3 times!"] - end - - subgraph "Sweep Approach" - S1["Load X[0]"] --> SP["Process with
Y[0], Y[1], Y[2]"] - S2["Load Y[0,1,2]"] --> SP - Note2["X loaded once!"] - end - - style Note1 fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style Note2 fill:#d1fae5,stroke:#10b981,stroke-width:2px - - - - - -.. image:: diagrams/sweep_tile_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Traditional Approach" + T1["Load X[0]"] --> P1["Process"] + T2["Load Y[0]"] --> P1 + T3["Load X[0]"] --> P2["Process"] + T4["Load Y[1]"] --> P2 + T5["Load X[0]"] --> P3["Process"] + T6["Load Y[2]"] --> P3 + Note1["X loaded 3 times!"] + end + + subgraph "Sweep Approach" + S1["Load X[0]"] --> SP["Process with
Y[0], Y[1], Y[2]"] + S2["Load Y[0,1,2]"] --> SP + Note2["X loaded once!"] + end Practical Sweep Patterns ======================== @@ -382,45 +351,32 @@ Performance Characteristics Sweep operations provide several performance benefits: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Sweep Performance Benefits" - B1["Zero runtime overhead
Compile-time unrolling"] - B2["Perfect memory coalescing
Sequential access patterns"] - B3["Automatic vectorization
Compiler optimizations"] - B4["Register reuse
X data stays in VGPR"] - end - - subgraph "Use Cases" - U1["Matrix Multiplication
Reuse A columns"] - U2["Convolution
Reuse filter weights"] - U3["Reduction
Accumulate over Y"] - U4["Broadcast
Apply X to all Y"] - end - - B1 --> Performance["High Performance"] - B2 --> Performance - B3 --> Performance - B4 --> Performance - - Performance --> U1 - Performance --> U2 - Performance --> U3 - Performance --> U4 - - style Performance fill:#d1fae5,stroke:#10b981,stroke-width:3px - - - - - -.. image:: diagrams/sweep_tile_3.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Sweep Performance Benefits" + B1["Zero runtime overhead
Compile-time unrolling"] + B2["Perfect memory coalescing
Sequential access patterns"] + B3["Automatic vectorization
Compiler optimizations"] + B4["Register reuse
X data stays in VGPR"] + end + + subgraph "Use Cases" + U1["Matrix Multiplication
Reuse A columns"] + U2["Convolution
Reuse filter weights"] + U3["Reduction
Accumulate over Y"] + U4["Broadcast
Apply X to all Y"] + end + + B1 --> Performance["High Performance"] + B2 --> Performance + B3 --> Performance + B4 --> Performance + + Performance --> U1 + Performance --> U2 + Performance --> U3 + Performance --> U4 Compiler Optimizations ---------------------- @@ -457,39 +413,21 @@ Integration with CK Tile Components Complete workflow example: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - flowchart TB - subgraph "Complete Workflow" - TD["TileDistribution
Define data layout"] - TW["TileWindow
Create view"] - DT["DistributedTensor
Load X data"] - ST["SweepTile
Iterate Y positions"] - R["Results
Store outputs"] - end - - TD --> TW - TW --> DT - DT --> ST - ST --> R - - style TD fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style ST fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style R fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - - - -.. image:: diagrams/sweep_tile_4.svg - :alt: Diagram - :align: center +.. mermaid:: + + flowchart TB + subgraph "Complete Workflow" + TD["TileDistribution
Define data layout"] + TW["TileWindow
Create view"] + DT["DistributedTensor
Load X data"] + ST["SweepTile
Iterate Y positions"] + R["Results
Store outputs"] + end + + TD --> TW + TW --> DT + DT --> ST + ST --> R .. code-block:: cpp diff --git a/docs/conceptual/ck_tile/tensor_coordinates.rst b/docs/conceptual/ck_tile/tensor_coordinates.rst index 4e9240b83c4..ef047776dbf 100644 --- a/docs/conceptual/ck_tile/tensor_coordinates.rst +++ b/docs/conceptual/ck_tile/tensor_coordinates.rst @@ -15,49 +15,31 @@ Before diving into transforms and adaptors (see :ref:`ck_tile_transforms` and :r MultiIndex serves as the common currency between different coordinate spaces (see :ref:`ck_tile_coordinate_systems`), enabling seamless transformation and navigation through complex tensor layouts. Every transform, adaptor, and descriptor in CK Tile operates on these coordinate containers. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "MultiIndex Structure" - MI["MultiIndex
Container for N integers"] - D0["Dimension 0"] - D1["Dimension 1"] - D2["Dimension 2"] - DN["Dimension N-1"] - end - - subgraph "Usage Context" - T["Transforms
"] - A["Adaptors
"] - TV["Tensors
"] - end - - MI --> D0 - MI --> D1 - MI --> D2 - MI --> DN - - T --> MI - A --> MI - TV --> MI - - style MI fill:#f3e5f5,stroke:#7b1fa2,stroke-width:3px - style D0 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style D1 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style D2 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style DN fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style T fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style A fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style TV fill:#ffebee,stroke:#d32f2f,stroke-width:2px - - - -.. image:: diagrams/tensor_coordinates_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "MultiIndex Structure" + MI["MultiIndex
Container for N integers"] + D0["Dimension 0"] + D1["Dimension 1"] + D2["Dimension 2"] + DN["Dimension N-1"] + end + + subgraph "Usage Context" + T["Transforms
"] + A["Adaptors
"] + TV["Tensors
"] + end + + MI --> D0 + MI --> D1 + MI --> D2 + MI --> DN + + T --> MI + A --> MI + TV --> MI MultiIndex Implementation ========================= @@ -176,36 +158,22 @@ MultiIndex in Coordinate Flow MultiIndex serves as the interface between user code and the transformation pipeline: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - flowchart TB - subgraph CF ["Coordinate Flow"] - direction LR - UI["User Input
[1, 2, 3]"] --> MI["MultiIndex
Storage"] - MI --> TR["Transform
Processing"] - TR --> MO["MultiIndex
Output"] - MO --> TA["Tensor Access
element(coord)"] - end - - subgraph EX ["Example: 3D Tensor Access"] - direction LR - T3D["3D Tensor
shape=[4,5,6]"] --> COORD["MultiIndex(3, [1,2,3])"] - COORD --> ELEM["Element at
position [1,2,3]"] - end - - style UI fill:#e0e7ff,stroke:#4338ca,stroke-width:2px - style MI fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px - style MO fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px - style COORD fill:#fff3e0,stroke:#f57c00,stroke-width:2px - - - -.. image:: diagrams/tensor_coordinates_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + flowchart TB + subgraph CF ["Coordinate Flow"] + direction LR + UI["User Input
[1, 2, 3]"] --> MI["MultiIndex
Storage"] + MI --> TR["Transform
Processing"] + TR --> MO["MultiIndex
Output"] + MO --> TA["Tensor Access
element(coord)"] + end + + subgraph EX ["Example: 3D Tensor Access"] + direction LR + T3D["3D Tensor
shape=[4,5,6]"] --> COORD["MultiIndex(3, [1,2,3])"] + COORD --> ELEM["Element at
position [1,2,3]"] + end Common Usage Patterns ===================== diff --git a/docs/conceptual/ck_tile/tensor_views.rst b/docs/conceptual/ck_tile/tensor_views.rst index 0c46e1e5930..22e6a61c3d3 100644 --- a/docs/conceptual/ck_tile/tensor_views.rst +++ b/docs/conceptual/ck_tile/tensor_views.rst @@ -13,52 +13,31 @@ TensorView presents different logical views of the same underlying memory withou TensorView Architecture ----------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Memory Foundation" - Memory["Flat Memory Array
0 1 2 3 4 5 6 7 8 9 10 11"] - end - - subgraph "Access Layer" - BufferView["BufferView
Linear Memory Access"] - Descriptor["TensorDescriptor
Shape & Stride Info"] - end - - subgraph "Tensor Layer" - TensorView["TensorView
Multi-dimensional Access"] - end - - subgraph "Logical View" - Matrix["2D Matrix View
[3×4]
[[0,1,2,3]
[4,5,6,7]
[8,9,10,11]]"] - end - - Memory --> BufferView - Memory --> Descriptor - BufferView --> TensorView - Descriptor --> TensorView - TensorView --> Matrix - - style Memory fill:#d1fae5,stroke:#10b981,stroke-width:2px - style BufferView fill:#dbeafe,stroke:#3b82f6,stroke-width:2px - style Descriptor fill:#fed7aa,stroke:#f59e0b,stroke-width:2px - style TensorView fill:#fce7f3,stroke:#ec4899,stroke-width:2px - style Matrix fill:#e9d5ff,stroke:#9333ea,stroke-width:2px - - - - - +.. mermaid:: + + graph TB + subgraph "Memory Foundation" + Memory["Flat Memory Array
0 1 2 3 4 5 6 7 8 9 10 11"] + end + + subgraph "Access Layer" + BufferView["BufferView
Linear Memory Access"] + Descriptor["TensorDescriptor
Shape & Stride Info"] + end + + subgraph "Tensor Layer" + TensorView["TensorView
Multi-dimensional Access"] + end + + subgraph "Logical View" + Matrix["2D Matrix View
[3×4]
[[0,1,2,3]
[4,5,6,7]
[8,9,10,11]]"] + end -.. image:: diagrams/tensor_views_1.svg - :alt: Diagram - :align: center + Memory --> BufferView + Memory --> Descriptor + BufferView --> TensorView + Descriptor --> TensorView + TensorView --> Matrix The Foundation: BufferView and TensorDescriptor ------------------------------------------------ @@ -122,93 +101,53 @@ Coordinate-Based Access The fundamental operation of TensorView is translating multi-dimensional coordinates into memory accesses. This translation happens through an advanced pipeline that maintains efficiency while providing flexibility: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - flowchart LR - subgraph "User Input" - Coord["Coordinate
(1, 2)"] - end - - subgraph "TensorView Processing" - Shape["Shape Check
row < 3?
col < 4?"] - Stride["Apply Strides
offset = 1×4 + 2×1"] - Buffer["BufferView Access
buffer[6]"] - end - - subgraph "Result" - Value["Value: 6"] - end - - Coord --> Shape - Shape -->|Valid| Stride - Stride --> Buffer - Buffer --> Value - - style Coord fill:#e0e7ff,stroke:#4338ca,stroke-width:2px - style Shape fill:#fef3c7,stroke:#f59e0b,stroke-width:2px - style Stride fill:#dcfce7,stroke:#10b981,stroke-width:2px - style Buffer fill:#dbeafe,stroke:#3b82f6,stroke-width:2px - style Value fill:#d1fae5,stroke:#10b981,stroke-width:2px - - - - - +.. mermaid:: + + flowchart LR + subgraph "User Input" + Coord["Coordinate
(1, 2)"] + end + + subgraph "TensorView Processing" + Shape["Shape Check
row < 3?
col < 4?"] + Stride["Apply Strides
offset = 1×4 + 2×1"] + Buffer["BufferView Access
buffer[6]"] + end -.. image:: diagrams/tensor_views_2.svg - :alt: Diagram - :align: center + subgraph "Result" + Value["Value: 6"] + end + + Coord --> Shape + Shape -->|Valid| Stride + Stride --> Buffer + Buffer --> Value Memory Layouts and Strides -------------------------- A key feature of TensorView is its ability to represent different memory layouts through stride manipulation. This capability enables zero-copy transformations that would otherwise require expensive memory operations: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Row-Major Layout (C-style)" - RM["Memory: [0,1,2,3,4,5,6,7,8,9,10,11]
Shape: (3,4)
Strides: (4,1)"] - RMMatrix["[[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]]"] - RM --> RMMatrix - end - - subgraph "Column-Major Layout (Fortran-style)" - CM["Memory: [0,3,6,9,1,4,7,10,2,5,8,11]
Shape: (3,4)
Strides: (1,3)"] - CMMatrix["[[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]]"] - CM --> CMMatrix - end - - subgraph "Custom Stride (Transposed View)" - TV["Memory: [0,1,2,3,4,5,6,7,8,9,10,11]
Shape: (4,3)
Strides: (1,4)"] - TVMatrix["[[0, 4, 8]
[1, 5, 9]
[2, 6, 10]
[3, 7, 11]]"] - TV --> TVMatrix - end - - style RM fill:#e0f2fe,stroke:#0284c7,stroke-width:2px - style CM fill:#fef3c7,stroke:#f59e0b,stroke-width:2px - style TV fill:#f3e8ff,stroke:#9333ea,stroke-width:2px - - - - - +.. mermaid:: + + graph TB + subgraph "Row-Major Layout (C-style)" + RM["Memory: [0,1,2,3,4,5,6,7,8,9,10,11]
Shape: (3,4)
Strides: (4,1)"] + RMMatrix["[[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]]"] + RM --> RMMatrix + end -.. image:: diagrams/tensor_views_3.svg - :alt: Diagram - :align: center + subgraph "Column-Major Layout (Fortran-style)" + CM["Memory: [0,3,6,9,1,4,7,10,2,5,8,11]
Shape: (3,4)
Strides: (1,3)"] + CMMatrix["[[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]]"] + CM --> CMMatrix + end + + subgraph "Custom Stride (Transposed View)" + TV["Memory: [0,1,2,3,4,5,6,7,8,9,10,11]
Shape: (4,3)
Strides: (1,4)"] + TVMatrix["[[0, 4, 8]
[1, 5, 9]
[2, 6, 10]
[3, 7, 11]]"] + TV --> TVMatrix + end Row-Major vs Column-Major Layouts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -326,45 +265,26 @@ Memory Access Patterns The efficiency of TensorView operations depends on memory access patterns. Understanding these patterns is important for achieving optimal performance. See :ref:`ck_tile_gpu_basics` for hardware considerations. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Memory Access Patterns" - Seq["Sequential Access
(Good cache usage)"] - Stride["Strided Access
(May cause cache misses)"] - Random["Random Access
(Poor cache usage)"] - end - - subgraph "Optimization Strategies" - Opt1["Use row-major for row iteration"] - Opt2["Use col-major for column iteration"] - Opt3["Minimize stride between accesses"] - Opt4["Vectorize when possible"] - end - - Seq --> Opt1 - Stride --> Opt2 - Stride --> Opt3 - Random --> Opt4 - - style Seq fill:#d1fae5,stroke:#10b981,stroke-width:2px - style Stride fill:#fef3c7,stroke:#f59e0b,stroke-width:2px - style Random fill:#fee2e2,stroke:#ef4444,stroke-width:2px - - - - - +.. mermaid:: + + graph LR + subgraph "Memory Access Patterns" + Seq["Sequential Access
(Good cache usage)"] + Stride["Strided Access
(May cause cache misses)"] + Random["Random Access
(Poor cache usage)"] + end + + subgraph "Optimization Strategies" + Opt1["Use row-major for row iteration"] + Opt2["Use col-major for column iteration"] + Opt3["Minimize stride between accesses"] + Opt4["Vectorize when possible"] + end -.. image:: diagrams/tensor_views_4.svg - :alt: Diagram - :align: center + Seq --> Opt1 + Stride --> Opt2 + Stride --> Opt3 + Random --> Opt4 Compile-Time Optimization ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -391,48 +311,30 @@ TensorView vs BufferView Understanding when to use TensorView versus BufferView is crucial for writing efficient code: -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "BufferView" - BV1["Linear indexing only"] - BV2["buffer[5]"] - BV3["No shape information"] - BV4["Direct memory access"] - end - - subgraph "TensorView" - TV1["Multi-dimensional indexing"] - TV2["tensor(1, 2)"] - TV3["Shape-aware operations"] - TV4["Coordinate transformations"] - end - - subgraph "Use Cases" - UC1["BufferView: Low-level memory ops"] - UC2["TensorView: Matrix/tensor algorithms"] - end - - BV1 --> UC1 - TV1 --> UC2 - - style BV1 fill:#dbeafe,stroke:#3b82f6,stroke-width:2px - style TV1 fill:#fce7f3,stroke:#ec4899,stroke-width:2px - - - - - - -.. image:: diagrams/tensor_views_5.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "BufferView" + BV1["Linear indexing only"] + BV2["buffer[5]"] + BV3["No shape information"] + BV4["Direct memory access"] + end + + subgraph "TensorView" + TV1["Multi-dimensional indexing"] + TV2["tensor(1, 2)"] + TV3["Shape-aware operations"] + TV4["Coordinate transformations"] + end + + subgraph "Use Cases" + UC1["BufferView: Low-level memory ops"] + UC2["TensorView: Matrix/tensor algorithms"] + end + + BV1 --> UC1 + TV1 --> UC2 BufferView excels at raw memory operations where linear access is natural or where the overhead of coordinate calculation would be prohibitive. TensorView is best suited for algorithms that operate in terms of multi-dimensional coordinates, such as matrix operations, image processing, or tensor contractions. diff --git a/docs/conceptual/ck_tile/thread_mapping.rst b/docs/conceptual/ck_tile/thread_mapping.rst index 361912ba9f6..055b94eb404 100644 --- a/docs/conceptual/ck_tile/thread_mapping.rst +++ b/docs/conceptual/ck_tile/thread_mapping.rst @@ -78,61 +78,46 @@ Composable Kernel abstracts thread identification into partition indices, buildi }; -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "GPU Device" - subgraph "Thread Block" - subgraph "Warp 0" - T0["Thread 0
lane_id=0"] - T1["Thread 1
lane_id=1"] - T2["..."] - T31["Thread 31
lane_id=31"] - end - - subgraph "Warp 1" - T32["Thread 32
lane_id=0"] - T33["Thread 33
lane_id=1"] - T34["..."] - T63["Thread 63
lane_id=31"] - end - - W2["Warp 2"] - W3["..."] - W7["Warp 7"] - end - end - - subgraph "Thread Identification" - TID["Thread ID = blockIdx.x * blockDim.x + threadIdx.x"] - WID["Warp ID = threadIdx.x / 32"] - LID["Lane ID = threadIdx.x % 32"] - end - - subgraph "P-space Mapping" - P["P-coordinates
NDimP=1: [thread_id]
NDimP=2: [warp_id, lane_id]"] - end - - T0 --> TID - TID --> WID - TID --> LID - WID --> P - LID --> P - - style T0 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style T32 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style P fill:#fff3e0,stroke:#f57c00,stroke-width:3px - - - - - -.. image:: diagrams/thread_mapping_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "GPU Device" + subgraph "Thread Block" + subgraph "Warp 0" + T0["Thread 0
lane_id=0"] + T1["Thread 1
lane_id=1"] + T2["..."] + T31["Thread 31
lane_id=31"] + end + + subgraph "Warp 1" + T32["Thread 32
lane_id=0"] + T33["Thread 33
lane_id=1"] + T34["..."] + T63["Thread 63
lane_id=31"] + end + + W2["Warp 2"] + W3["..."] + W7["Warp 7"] + end + end + + subgraph "Thread Identification" + TID["Thread ID = blockIdx.x * blockDim.x + threadIdx.x"] + WID["Warp ID = threadIdx.x / 32"] + LID["Lane ID = threadIdx.x % 32"] + end + + subgraph "P-space Mapping" + P["P-coordinates
NDimP=1: [thread_id]
NDimP=2: [warp_id, lane_id]"] + end + + T0 --> TID + TID --> WID + TID --> LID + WID --> P + LID --> P Thread Hierarchy Structure @@ -179,51 +164,36 @@ Thread-to-Data Mapping Once threads know their IDs, they need to map those IDs to specific data elements. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Thread to Data Mapping" - subgraph "Thread Grid" - T00["Thread[0,0]
Warp 0"] - T01["Thread[0,1]
Warp 0"] - T10["Thread[1,0]
Warp 1"] - T11["Thread[1,1]
Warp 1"] - end - - subgraph "Data Tiles" - D00["Data[0:4, 0:4]
16 elements"] - D01["Data[0:4, 4:8]
16 elements"] - D10["Data[4:8, 0:4]
16 elements"] - D11["Data[4:8, 4:8]
16 elements"] - end - - subgraph "Memory Access" - MA["Coalesced Access
Adjacent threads → Adjacent memory"] - end - end - - T00 --> D00 - T01 --> D01 - T10 --> D10 - T11 --> D11 - - D00 --> MA - D01 --> MA - - style T00 fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style D00 fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style MA fill:#fff3e0,stroke:#f57c00,stroke-width:2px - - - - - -.. image:: diagrams/thread_mapping_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Thread to Data Mapping" + subgraph "Thread Grid" + T00["Thread[0,0]
Warp 0"] + T01["Thread[0,1]
Warp 0"] + T10["Thread[1,0]
Warp 1"] + T11["Thread[1,1]
Warp 1"] + end + + subgraph "Data Tiles" + D00["Data[0:4, 0:4]
16 elements"] + D01["Data[0:4, 4:8]
16 elements"] + D10["Data[4:8, 0:4]
16 elements"] + D11["Data[4:8, 4:8]
16 elements"] + end + + subgraph "Memory Access" + MA["Coalesced Access
Adjacent threads → Adjacent memory"] + end + end + + T00 --> D00 + T01 --> D01 + T10 --> D10 + T11 --> D11 + + D00 --> MA + D01 --> MA Data Distribution Pattern ------------------------- diff --git a/docs/conceptual/ck_tile/tile_distribution.rst b/docs/conceptual/ck_tile/tile_distribution.rst index 3c016318bfb..24417c70c78 100644 --- a/docs/conceptual/ck_tile/tile_distribution.rst +++ b/docs/conceptual/ck_tile/tile_distribution.rst @@ -19,98 +19,66 @@ This design adapts to diverse computational scenarios without manual interventio Complete Tile Distribution System Overview ------------------------------------------ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Logical View" - T["Tensor
Multi-dimensional data"] - TD["TileDistribution
Work assignment"] - TW["TileWindow
Data view"] - end - - subgraph "Coordinate Spaces" - X["X: Physical tensor coords"] - Y["Y: Tile pattern coords"] - P["P: Processing element coords"] - R["R: Replication coords (optional)"] - end - - subgraph "GPU Execution" - W["Warps
32 threads each"] - L["Lanes
Thread within warp"] - REG["Registers
Thread-local storage"] - end - - T --> TD - TD --> TW - - TD --> X - TD --> Y - TD --> P - TD --> R - - P --> W - P --> L - TW --> REG - - style TD fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style P fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style REG fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - - - - -.. image:: diagrams/tile_distribution_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Logical View" + T["Tensor
Multi-dimensional data"] + TD["TileDistribution
Work assignment"] + TW["TileWindow
Data view"] + end + + subgraph "Coordinate Spaces" + X["X: Physical tensor coords"] + Y["Y: Tile pattern coords"] + P["P: Processing element coords"] + R["R: Replication coords (optional)"] + end + + subgraph "GPU Execution" + W["Warps
32 threads each"] + L["Lanes
Thread within warp"] + REG["Registers
Thread-local storage"] + end + + T --> TD + TD --> TW + + TD --> X + TD --> Y + TD --> P + TD --> R + + P --> W + P --> L + TW --> REG Coordinate System Architecture ------------------------------ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - flowchart LR - subgraph "Input" - TC["Thread Coordinates
(warpId, laneId)"] - end - - subgraph "Transformation Pipeline" - P2Y["P → Y
Thread to pattern"] - Y2X["Y → X
Pattern to physical"] - Y2D["Y → D
Pattern to register"] - end - - subgraph "Output" - MC["Memory Coordinates
Global addresses"] - RI["Register Indices
Local storage"] - end - - TC --> P2Y - P2Y --> Y2X - P2Y --> Y2D - Y2X --> MC - Y2D --> RI - - style TC fill:#e0e7ff,stroke:#4338ca,stroke-width:2px - style MC fill:#d1fae5,stroke:#10b981,stroke-width:2px - style RI fill:#fef3c7,stroke:#f59e0b,stroke-width:2px - - - - - - -.. image:: diagrams/tile_distribution_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + flowchart LR + subgraph "Input" + TC["Thread Coordinates
(warpId, laneId)"] + end + + subgraph "Transformation Pipeline" + P2Y["P → Y
Thread to pattern"] + Y2X["Y → X
Pattern to physical"] + Y2D["Y → D
Pattern to register"] + end + + subgraph "Output" + MC["Memory Coordinates
Global addresses"] + RI["Register Indices
Local storage"] + end + + TC --> P2Y + P2Y --> Y2X + P2Y --> Y2D + Y2X --> MC + Y2D --> RI What is Tile Distribution? -------------------------- @@ -152,50 +120,34 @@ TileDistribution abstracts the mapping between logical problem coordinates and p Problem Space Mapping --------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - - graph TB - subgraph "Problem Space (256×256 Matrix)" - M["Full Matrix
65,536 elements"] - T1["Tile 1
32×32"] - T2["Tile 2
32×32"] - TN["Tile N
32×32"] - end - - subgraph "Thread Assignment" - W0["Warp 0
32 threads"] - W1["Warp 1
32 threads"] - L0["Lane 0-31
Individual threads"] - end - - subgraph "Memory Pattern" - MP["Coalesced Access
Sequential addresses
No bank conflicts"] - end - - M --> T1 - M --> T2 - M --> TN - - T1 --> W0 - T1 --> W1 - W0 --> L0 - L0 --> MP - - style M fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style MP fill:#d1fae5,stroke:#10b981,stroke-width:2px - - - - - - -.. image:: diagrams/tile_distribution_3.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Problem Space (256×256 Matrix)" + M["Full Matrix
65,536 elements"] + T1["Tile 1
32×32"] + T2["Tile 2
32×32"] + TN["Tile N
32×32"] + end + + subgraph "Thread Assignment" + W0["Warp 0
32 threads"] + W1["Warp 1
32 threads"] + L0["Lane 0-31
Individual threads"] + end + + subgraph "Memory Pattern" + MP["Coalesced Access
Sequential addresses
No bank conflicts"] + end + + M --> T1 + M --> T2 + M --> TN + + T1 --> W0 + T1 --> W1 + W0 --> L0 + L0 --> MP Creating a TileDistribution --------------------------- @@ -369,47 +321,31 @@ Creating and using a TileDistribution: Hierarchical Decomposition -------------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Level 1: Block Distribution" - B["Thread Block
256 threads"] - BT1["Block Tile 1
64×64"] - BT2["Block Tile 2
64×64"] - end - - subgraph "Level 2: Warp Distribution" - W["Warp
32 threads"] - WT1["Warp Tile 1
16×16"] - WT2["Warp Tile 2
16×16"] - end - - subgraph "Level 3: Thread Distribution" - T["Thread"] - TT["Thread Tile
2×2"] - end - - B --> BT1 - BT1 --> W - W --> WT1 - WT1 --> T - T --> TT - - style B fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style W fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style T fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - - - - -.. image:: diagrams/tile_distribution_4.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Level 1: Block Distribution" + B["Thread Block
256 threads"] + BT1["Block Tile 1
64×64"] + BT2["Block Tile 2
64×64"] + end + + subgraph "Level 2: Warp Distribution" + W["Warp
32 threads"] + WT1["Warp Tile 1
16×16"] + WT2["Warp Tile 2
16×16"] + end + + subgraph "Level 3: Thread Distribution" + T["Thread"] + TT["Thread Tile
2×2"] + end + + B --> BT1 + BT1 --> W + W --> WT1 + WT1 --> T + T --> TT Advanced Example: Matrix Multiplication Distribution ---------------------------------------------------- @@ -462,45 +398,28 @@ Advanced Example: Matrix Multiplication Distribution Work Distribution Pattern ------------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - flowchart TB - subgraph "Matrix C (128×128)" - C["16,384 elements"] - end - - subgraph "Thread Grid (32×32)" - TG["1,024 threads"] - end - - subgraph "Per Thread" - PT["4×4 tile
16 elements"] - end - - subgraph "Memory Access" - MA["Coalesced reads
Efficient writes
No conflicts"] - end - - C --> TG - TG --> PT - PT --> MA - - style C fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style TG fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style PT fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style MA fill:#d1fae5,stroke:#10b981,stroke-width:2px - - - - - - -.. image:: diagrams/tile_distribution_5.svg - :alt: Diagram - :align: center +.. mermaid:: + + flowchart TB + subgraph "Matrix C (128×128)" + C["16,384 elements"] + end + + subgraph "Thread Grid (32×32)" + TG["1,024 threads"] + end + + subgraph "Per Thread" + PT["4×4 tile
16 elements"] + end + + subgraph "Memory Access" + MA["Coalesced reads
Efficient writes
No conflicts"] + end + + C --> TG + TG --> PT + PT --> MA Memory Access Patterns ---------------------- @@ -514,97 +433,67 @@ One of the key benefits of TileDistribution is generating optimal memory access Transformation Pipeline ----------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Input" - TID["Thread ID
(0-1023)"] - end - - subgraph "Stage 1" - P["P-coordinates
(warp, lane)"] - end - - subgraph "Stage 2" - Y["Y-coordinates
(tile position)"] - end - - subgraph "Stage 3" - X["X-coordinates
(tensor indices)"] - end - - subgraph "Output" - ADDR["Memory addresses
Register indices"] - end - - TID --> P - P --> Y - Y --> X - X --> ADDR - - style TID fill:#e0e7ff,stroke:#4338ca,stroke-width:2px - style ADDR fill:#d1fae5,stroke:#10b981,stroke-width:2px - - - - - -.. image:: diagrams/tile_distribution_6.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph LR + subgraph "Input" + TID["Thread ID
(0-1023)"] + end + + subgraph "Stage 1" + P["P-coordinates
(warp, lane)"] + end + + subgraph "Stage 2" + Y["Y-coordinates
(tile position)"] + end + + subgraph "Stage 3" + X["X-coordinates
(tensor indices)"] + end + + subgraph "Output" + ADDR["Memory addresses
Register indices"] + end + + TID --> P + P --> Y + Y --> X + X --> ADDR Performance Comparison ---------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Manual Implementation" - M1["Calculate indices manually"] - M2["Handle boundary conditions"] - M3["Ensure coalescing"] - M4["Manage bank conflicts"] - M5["~200 lines of code"] - end - - subgraph "With TileDistribution" - T1["make_tile_distribution()"] - T2["Automatic optimization"] - T3["~10 lines of code"] - end - - subgraph "Performance" - P1["Same performance"] - P2["Fewer bugs"] - P3["Portable across GPUs"] - end - - M1 --> M5 - T1 --> T3 - - M5 --> P1 - T3 --> P1 - P1 --> P2 - P2 --> P3 - - style M5 fill:#fee2e2,stroke:#ef4444,stroke-width:2px - style T3 fill:#d1fae5,stroke:#10b981,stroke-width:2px - style P3 fill:#fef3c7,stroke:#f59e0b,stroke-width:2px - - - - - - -.. image:: diagrams/tile_distribution_7.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Manual Implementation" + M1["Calculate indices manually"] + M2["Handle boundary conditions"] + M3["Ensure coalescing"] + M4["Manage bank conflicts"] + M5["~200 lines of code"] + end + + subgraph "With TileDistribution" + T1["make_tile_distribution()"] + T2["Automatic optimization"] + T3["~10 lines of code"] + end + + subgraph "Performance" + P1["Same performance"] + P2["Fewer bugs"] + P3["Portable across GPUs"] + end + + M1 --> M5 + T1 --> T3 + + M5 --> P1 + T3 --> P1 + P1 --> P2 + P2 --> P3 Summary ------- diff --git a/docs/conceptual/ck_tile/tile_window.rst b/docs/conceptual/ck_tile/tile_window.rst index 23c006d972b..272526611c2 100644 --- a/docs/conceptual/ck_tile/tile_window.rst +++ b/docs/conceptual/ck_tile/tile_window.rst @@ -13,56 +13,43 @@ TileWindow implements a distribution-aware windowing mechanism that views a subs TileWindow Architecture ----------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Components" - TV["TensorView
Data source"] - TD["TileDistribution
Thread mapping"] - TW["TileWindow
Access gateway"] - LT["LoadStoreTraits
Access optimizer"] - DT["DistributedTensor
Register storage"] - end - - subgraph "Operations" - Load["Load
Global → Registers"] - Compute["Compute
In registers"] - Store["Store
Registers → Global"] - end - - subgraph "Optimizations" - Coal["Coalescing
Adjacent access"] - Vec["Vectorization
Multi-element ops"] - Bank["Bank conflict
avoidance"] - SFC["Space-filling
curve traversal"] - end - - TV --> TW - TD --> TW - TW --> LT - LT --> DT - - TW --> Load - Load --> Compute - Compute --> Store - - Load --> Coal - Load --> Vec - Load --> SFC - Store --> Bank - - style TW fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style LT fill:#fff3e0,stroke:#f57c00,stroke-width:2px - style DT fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - -.. image:: diagrams/tile_window_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Components" + TV["TensorView
Data source"] + TD["TileDistribution
Thread mapping"] + TW["TileWindow
Access gateway"] + LT["LoadStoreTraits
Access optimizer"] + DT["DistributedTensor
Register storage"] + end + + subgraph "Operations" + Load["Load
Global → Registers"] + Compute["Compute
In registers"] + Store["Store
Registers → Global"] + end + + subgraph "Optimizations" + Coal["Coalescing
Adjacent access"] + Vec["Vectorization
Multi-element ops"] + Bank["Bank conflict
avoidance"] + SFC["Space-filling
curve traversal"] + end + + TV --> TW + TD --> TW + TW --> LT + LT --> DT + + TW --> Load + Load --> Compute + Compute --> Store + + Load --> Coal + Load --> Vec + Load --> SFC + Store --> Bank What is a TileWindow? --------------------- @@ -170,42 +157,30 @@ Space-Filling Curves for Memory Access TileWindow uses :ref:`space-filling curves ` to determine the order in which memory is accessed. Space-filling curves provide cache-friendly traversal patterns that help maximize hardware utilization. The "snake" pattern minimizes the distance between consecutive accesses, keeping data in cache longer. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Linear Access Pattern" - L1["0,1,2,3"] - L2["4,5,6,7"] - L3["8,9,10,11"] - L4["12,13,14,15"] - end - - subgraph "Snake Access Pattern" - S1["0,1,2,3"] - S2["7,6,5,4"] - S3["8,9,10,11"] - S4["15,14,13,12"] - end - - L1 --> L2 - L2 --> L3 - L3 --> L4 - - S1 --> S2 - S2 --> S3 - S3 --> S4 - - style S1 fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style S2 fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - +.. mermaid:: -.. image:: diagrams/tile_window_2.svg - :alt: Diagram - :align: center + graph LR + subgraph "Linear Access Pattern" + L1["0,1,2,3"] + L2["4,5,6,7"] + L3["8,9,10,11"] + L4["12,13,14,15"] + end + + subgraph "Snake Access Pattern" + S1["0,1,2,3"] + S2["7,6,5,4"] + S3["8,9,10,11"] + S4["15,14,13,12"] + end + + L1 --> L2 + L2 --> L3 + L3 --> L4 + + S1 --> S2 + S2 --> S3 + S3 --> S4 **C++ Space-Filling Curve Implementation:** @@ -237,44 +212,32 @@ TileWindow uses :ref:`space-filling curves ` to det TileWindow Data Flow -------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - flowchart LR - subgraph "Step 1: Create Window" - T["Tensor
[256, 256]"] - O["Origin
(64, 64)"] - W["Window Size
[32, 32]"] - end - - subgraph "Step 2: Apply Distribution" - TD["TileDistribution
Thread mapping"] - TW["TileWindow
Created"] - end - - subgraph "Step 3: Load Data" - GM["Global Memory
Window region"] - REG["Registers
Distributed tensor"] - end - - T --> TW - O --> TW - W --> TW - TD --> TW - - TW --> GM - GM -->|"load()"| REG - - style TW fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style REG fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - +.. mermaid:: + + flowchart LR + subgraph "Step 1: Create Window" + T["Tensor
[256, 256]"] + O["Origin
(64, 64)"] + W["Window Size
[32, 32]"] + end + + subgraph "Step 2: Apply Distribution" + TD["TileDistribution
Thread mapping"] + TW["TileWindow
Created"] + end -.. image:: diagrams/tile_window_3.svg - :alt: Diagram - :align: center + subgraph "Step 3: Load Data" + GM["Global Memory
Window region"] + REG["Registers
Distributed tensor"] + end + + T --> TW + O --> TW + W --> TW + TD --> TW + + TW --> GM + GM -->|"load()"| REG Creating and Using TileWindow ----------------------------- @@ -366,50 +329,37 @@ Calls to ``window.load()`` trigger the following sequence of operations: Load Operation Architecture --------------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Load Analysis" - Analyze["Analyze access pattern
Detect coalescing opportunities"] - end - - subgraph "Vectorization" - V1["Scalar: 4 loads"] - V2["Vector2: 2 loads"] - V4["Vector4: 1 load"] - end - - subgraph "Memory Transaction" - Coal["Coalesced access
32 threads → 1 transaction"] - NonCoal["Non-coalesced
32 threads → 32 transactions"] - end - - subgraph "Result" - Reg["Thread registers
Local data"] - end - - Analyze --> V1 - Analyze --> V2 - Analyze --> V4 - - V4 --> Coal - V1 --> NonCoal - - Coal --> Reg - NonCoal --> Reg - - style V4 fill:#d1fae5,stroke:#10b981,stroke-width:2px - style Coal fill:#d1fae5,stroke:#10b981,stroke-width:2px - style NonCoal fill:#fee2e2,stroke:#ef4444,stroke-width:2px - - +.. mermaid:: + + graph TB + subgraph "Load Analysis" + Analyze["Analyze access pattern
Detect coalescing opportunities"] + end + + subgraph "Vectorization" + V1["Scalar: 4 loads"] + V2["Vector2: 2 loads"] + V4["Vector4: 1 load"] + end + + subgraph "Memory Transaction" + Coal["Coalesced access
32 threads → 1 transaction"] + NonCoal["Non-coalesced
32 threads → 32 transactions"] + end -.. image:: diagrams/tile_window_4.svg - :alt: Diagram - :align: center + subgraph "Result" + Reg["Thread registers
Local data"] + end + + Analyze --> V1 + Analyze --> V2 + Analyze --> V4 + + V4 --> Coal + V1 --> NonCoal + + Coal --> Reg + NonCoal --> Reg Memory Access Patterns ---------------------- @@ -586,39 +536,26 @@ Complete Load-Compute-Store Pipeline Performance Characteristics --------------------------- -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph LR - subgraph "Memory Access Optimization" - V["Vectorization
4x fewer transactions"] - C["Coalescing
32x bandwidth efficiency"] - P["Precomputation
Zero overhead addressing"] - S["Space-filling
Optimal cache usage"] - end - - subgraph "Hardware Utilization" - BW["Memory Bandwidth
Near 100% utilization"] - L["Latency Hiding
Overlapped operations"] - R["Register Reuse
Minimal spills"] - end - - V --> BW - C --> BW - P --> L - S --> R - - style V fill:#e3f2fd,stroke:#1976d2,stroke-width:2px - style C fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - style BW fill:#d1fae5,stroke:#10b981,stroke-width:3px - - - -.. image:: diagrams/tile_window_5.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph LR + subgraph "Memory Access Optimization" + V["Vectorization
4x fewer transactions"] + C["Coalescing
32x bandwidth efficiency"] + P["Precomputation
Zero overhead addressing"] + S["Space-filling
Optimal cache usage"] + end + + subgraph "Hardware Utilization" + BW["Memory Bandwidth
Near 100% utilization"] + L["Latency Hiding
Overlapped operations"] + R["Register Reuse
Minimal spills"] + end + + V --> BW + C --> BW + P --> L + S --> R Best Practices diff --git a/docs/conceptual/ck_tile/transforms.rst b/docs/conceptual/ck_tile/transforms.rst index 3dfea276cbb..64f95cfe132 100644 --- a/docs/conceptual/ck_tile/transforms.rst +++ b/docs/conceptual/ck_tile/transforms.rst @@ -29,36 +29,21 @@ Zero-Copy Logical Operations - **Data Storage**: The actual tensor data remains stored in memory in linear fashion, exactly as specified by the original tensor shape and strides at creation time. See :ref:`ck_tile_buffer_views` for more information about raw memory access. - **Logical Mapping**: Transforms create different logical views of the same underlying data and only change how access coordinates are interpreted. See :ref:`ck_tile_tensor_views` for more information about tensor views. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "Tensor Coordinate Transformation" - US["Lower Dimension Space
Source coordinate system"] - LS["Upper Dimension Space
Target coordinate system"] - - DATA["Linear Data in Memory
Layout determined by tensor
shape & strides"] - end - - US -->|"Forward Transform"| LS - LS -->|"Inverse Transform"| US - - DATA -.->|"Same data,
different views"| US - DATA -.->|"Same data,
different views"| LS - - style US fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style LS fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - - - -.. image:: diagrams/transforms_1.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "Tensor Coordinate Transformation" + US["Lower Dimension Space
Source coordinate system"] + LS["Upper Dimension Space
Target coordinate system"] + + DATA["Linear Data in Memory
Layout determined by tensor
shape & strides"] + end + + US -->|"Forward Transform"| LS + LS -->|"Inverse Transform"| US + + DATA -.->|"Same data,
different views"| US + DATA -.->|"Same data,
different views"| LS Index Calculation Operations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -74,82 +59,54 @@ These operations enable bidirectional navigation between different coordinate re Transform System Architecture ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - - subgraph "Transform Types" - EMB["EmbedTransform
Linear → Multi-D Strided"] - UNM["MergeTransform
Multi-D → Linear"] - MRG["UnmergeTransform
Linear → Multi-D"] - REP["ReplicateTransform
0D → Multi-D Broadcast"] - OFF["OffsetTransform
Translation"] - PAS["PassThroughTransform
Identity"] - PAD["PadTransform
Boundaries"] - end - - subgraph "Operations" - FWD["Forward
calculate_lower_index()"] - BWD["Backward
calculate_upper_index()"] - UPD["Update
update_lower_index()"] - end - - EMB --> FWD - UNM --> FWD - MRG --> FWD - REP --> FWD - OFF --> FWD - PAS --> FWD - PAD --> FWD - - style FWD fill:#e8f5e9,stroke:#388e3c,stroke-width:2px - - - - - -.. image:: diagrams/transforms_2.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + + subgraph "Transform Types" + EMB["EmbedTransform
Linear → Multi-D Strided"] + UNM["MergeTransform
Multi-D → Linear"] + MRG["UnmergeTransform
Linear → Multi-D"] + REP["ReplicateTransform
0D → Multi-D Broadcast"] + OFF["OffsetTransform
Translation"] + PAS["PassThroughTransform
Identity"] + PAD["PadTransform
Boundaries"] + end + + subgraph "Operations" + FWD["Forward
calculate_lower_index()"] + BWD["Backward
calculate_upper_index()"] + UPD["Update
update_lower_index()"] + end + + EMB --> FWD + UNM --> FWD + MRG --> FWD + REP --> FWD + OFF --> FWD + PAS --> FWD + PAD --> FWD MergeTransform -------------- MergeTransform collapses multiple dimensions from the lower coordinate space into a single dimension in the upper coordinate space, effectively reducing the dimensionality of the tensor representation while preserving data relationships. This transform is fundamental to the :ref:`tile distribution system `. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "MergeTransform: Multi-D → Linear" - LS["Lower Coordinate Space
2D: [4, 5]
Coord: (2, 3)"] - US["Upper Coordinate Space
1D Linear
Index: 13"] - - DATA["Same Tensor Data
Layout: row-major
Size: 20 elements"] - end - - LS -->|"Forward Transform
2×5 + 3 = 13"| US - US -->|"Inverse Transform
13÷5=2, 13%5=3"| LS - - DATA -.->|"Multi-dimensional
view"| LS - DATA -.->|"Linear
view"| US - - style LS fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style US fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - - - -.. image:: diagrams/transforms_3.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "MergeTransform: Multi-D → Linear" + LS["Lower Coordinate Space
2D: [4, 5]
Coord: (2, 3)"] + US["Upper Coordinate Space
1D Linear
Index: 13"] + + DATA["Same Tensor Data
Layout: row-major
Size: 20 elements"] + end + + LS -->|"Forward Transform
2×5 + 3 = 13"| US + US -->|"Inverse Transform
13÷5=2, 13%5=3"| LS + + DATA -.->|"Multi-dimensional
view"| LS + DATA -.->|"Linear
view"| US **C++ Implementation:** @@ -187,36 +144,21 @@ UnmergeTransform UnmergeTransform expands coordinates from a single dimension in the lower coordinate space into multiple dimensions in the upper coordinate space, effectively increasing the dimensionality of the tensor representation while preserving all data relationships. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "UnmergeTransform: Linear → Multi-D" - LS["Lower Coordinate Space
1D Linear
Index: 14"] - US["Upper Coordinate Space
3D: [3, 4, 2]
Coord: (1, 3, 0)"] - - DATA["Same Tensor Data
Layout: row-major
Size: 24 elements"] - end - - LS -->|"Forward Transform
14 = 1×8 + 3×2 + 0"| US - US -->|"Inverse Transform
linearize back"| LS - - DATA -.->|"Linear
view"| LS - DATA -.->|"Multi-dimensional
view"| US - - style LS fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style US fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - - - -.. image:: diagrams/transforms_4.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "UnmergeTransform: Linear → Multi-D" + LS["Lower Coordinate Space
1D Linear
Index: 14"] + US["Upper Coordinate Space
3D: [3, 4, 2]
Coord: (1, 3, 0)"] + + DATA["Same Tensor Data
Layout: row-major
Size: 24 elements"] + end + + LS -->|"Forward Transform
14 = 1×8 + 3×2 + 0"| US + US -->|"Inverse Transform
linearize back"| LS + + DATA -.->|"Linear
view"| LS + DATA -.->|"Multi-dimensional
view"| US **C++ Implementation:** @@ -264,36 +206,21 @@ EmbedTransform EmbedTransform expands linear indices from the lower coordinate space into multi-dimensional coordinates in the upper coordinate space using configurable strides, enabling flexible strided tensor layouts and sub-tensor views within larger buffers. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "EmbedTransform: Linear → Multi-D Strided" - LS["Lower Coordinate Space
1D Linear
Index: 14"] - US["Upper Coordinate Space
2D: [2, 3]
Coord: (1, 2)"] - - DATA["Linear Buffer in Memory"] - end - - LS -->|"Forward Transform
Strides: [12, 1]
14 ÷ 12 = 1, 14 % 12 = 2"| US - US -->|"Inverse Transform
1×12 + 2×1 = 14"| LS - - DATA -.->|"Linear
index view"| LS - DATA -.->|"Multi-dimensional
strided view"| US - - style LS fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style US fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - - - -.. image:: diagrams/transforms_5.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "EmbedTransform: Linear → Multi-D Strided" + LS["Lower Coordinate Space
1D Linear
Index: 14"] + US["Upper Coordinate Space
2D: [2, 3]
Coord: (1, 2)"] + + DATA["Linear Buffer in Memory"] + end + + LS -->|"Forward Transform
Strides: [12, 1]
14 ÷ 12 = 1, 14 % 12 = 2"| US + US -->|"Inverse Transform
1×12 + 2×1 = 14"| LS + + DATA -.->|"Linear
index view"| LS + DATA -.->|"Multi-dimensional
strided view"| US **C++ Implementation:** @@ -329,36 +256,21 @@ ReplicateTransform ReplicateTransform creates a higher-dimensional tensor by replicating (broadcasting) a lower-dimensional tensor. It's essentially a broadcasting operation that takes a tensor with fewer dimensions and logically replicates it across new dimensions without data duplication. An example is taking a scalar (0-dimensional) input and broadcasting it across multiple dimensions, enabling efficient broadcasting patterns where a single value appears at every position in a multi-dimensional coordinate space. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "ReplicateTransform: 0D → Multi-D Broadcasting" - LS["Lower Coordinate Space
0D: Scalar
Empty coordinate []"] - US["Upper Coordinate Space
2D: [3, 4]
All coords: (i, j)"] - - DATA["Single Scalar Value"] - end - - LS -->|"Forward Transform
[] → (i,j) for any i,j"| US - US -->|"Inverse Transform
(i,j) → [] for any i,j"| LS - - DATA -.->|"One scalar
value"| LS - DATA -.->|"Broadcasted view
at all positions"| US - - style LS fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style US fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - - - -.. image:: diagrams/transforms_6.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "ReplicateTransform: 0D → Multi-D Broadcasting" + LS["Lower Coordinate Space
0D: Scalar
Empty coordinate []"] + US["Upper Coordinate Space
2D: [3, 4]
All coords: (i, j)"] + + DATA["Single Scalar Value"] + end + + LS -->|"Forward Transform
[] → (i,j) for any i,j"| US + US -->|"Inverse Transform
(i,j) → [] for any i,j"| LS + + DATA -.->|"One scalar
value"| LS + DATA -.->|"Broadcasted view
at all positions"| US **C++ Implementation:** @@ -406,36 +318,21 @@ OffsetTransform OffsetTransform shifts coordinates by a fixed offset, creating a translated view of the coordinate space. It performs translation operations where each coordinate in the upper space is mapped to a coordinate in the lower space by adding a constant offset. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "OffsetTransform: 1D → 1D Translation" - LS["Lower Coordinate Space
1D: [0, 63]
Coord: index + offset"] - US["Upper Coordinate Space
1D: [0, 47]
Coord: index"] - - DATA["Linear Buffer in Memory"] - end - - LS -->|"Forward Transform
idx → idx + 16"| US - US -->|"Inverse Transform
idx + 16 → idx"| LS - - DATA -.->|"Lower
view"| LS - DATA -.->|"Upper
view"| US - - style LS fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style US fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - - - -.. image:: diagrams/transforms_7.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "OffsetTransform: 1D → 1D Translation" + LS["Lower Coordinate Space
1D: [0, 63]
Coord: index + offset"] + US["Upper Coordinate Space
1D: [0, 47]
Coord: index"] + + DATA["Linear Buffer in Memory"] + end + + LS -->|"Forward Transform
idx → idx + 16"| US + US -->|"Inverse Transform
idx + 16 → idx"| LS + + DATA -.->|"Lower
view"| LS + DATA -.->|"Upper
view"| US **C++ Implementation:** @@ -483,36 +380,21 @@ PassThroughTransform - Identity No-op transform that passes coordinates unchanged. The PassThrough transform is the simplest coordinate transformation in CK Tile, implementing a perfect identity mapping where input coordinates are passed through unchanged to the output. This transform is essential as a placeholder in transformation chains and for dimensions that require no modification. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "PassThroughTransform: 1D → 1D Identity" - LS["Lower Coordinate Space
1D: [0, 59]
Coord: index"] - US["Upper Coordinate Space
1D: [0, 59]
Coord: index"] - - DATA["Linear Buffer in Memory"] - end - - LS -.->|"Perfect Identity
idx → idx"| US - US -.->|"Perfect Identity
idx → idx"| LS - - DATA -->|"Same buffer
same view"| LS - DATA -->|"Same buffer
same view"| US - - style LS fill:#e8f5e8,stroke:#2e7d32,stroke-width:3px - style US fill:#e8f5e8,stroke:#2e7d32,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - - - -.. image:: diagrams/transforms_8.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "PassThroughTransform: 1D → 1D Identity" + LS["Lower Coordinate Space
1D: [0, 59]
Coord: index"] + US["Upper Coordinate Space
1D: [0, 59]
Coord: index"] + + DATA["Linear Buffer in Memory"] + end + + LS -.->|"Perfect Identity
idx → idx"| US + US -.->|"Perfect Identity
idx → idx"| LS + + DATA -->|"Same buffer
same view"| LS + DATA -->|"Same buffer
same view"| US **C++ Implementation:** @@ -555,39 +437,21 @@ PadTransform PadTransform adds padding to tensor dimensions, mapping coordinates from upper dimension space (with padding) to lower dimension space (original data). -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "PadTransform: 1D → 1D with Padding" - LS["Lower Coordinate Space
1D: [0, 2] (original data)"] - US["Upper Coordinate Space
1D: [0, 4] (with padding)"] - - DATA["Tensor Data in Memory"] - end - - LS -->|"Forward Transform
idx + left_pad"| US - US -->|"Inverse Transform
idx - left_pad"| LS - - DATA -.->|"Original view"| LS - DATA -.->|"Padded view"| US - - style LS fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style US fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - - - -.. image:: diagrams/transforms_9.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "PadTransform: 1D → 1D with Padding" + LS["Lower Coordinate Space
1D: [0, 2] (original data)"] + US["Upper Coordinate Space
1D: [0, 4] (with padding)"] + + DATA["Tensor Data in Memory"] + end + + LS -->|"Forward Transform
idx + left_pad"| US + US -->|"Inverse Transform
idx - left_pad"| LS + + DATA -.->|"Original view"| LS + DATA -.->|"Padded view"| US **C++ Implementation:** @@ -633,106 +497,63 @@ XorTransform XorTransform applies a 2D XOR mapping for specialized memory access patterns. It performs XOR operations on coordinates to create transformed memory layouts for specific algorithmic optimizations, particularly useful for avoiding :ref:`LDS bank conflicts `. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "XorTransform: 2D → 2D XOR Mapping" - LS["Lower Coordinate Space
2D: [4, 8]
XOR-transformed coords"] - US["Upper Coordinate Space
2D: [4, 8]
Normal coords"] - - DATA["Same Tensor Data"] - end - - LS -->|"Forward Transform
apply XOR reverse"| US - US -->|"Inverse Transform
apply XOR mapping"| LS - - DATA -.->|"XOR pattern
view"| LS - DATA -.->|"Normal
view"| US - - style LS fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style US fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - - - -.. image:: diagrams/transforms_10.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "XorTransform: 2D → 2D XOR Mapping" + LS["Lower Coordinate Space
2D: [4, 8]
XOR-transformed coords"] + US["Upper Coordinate Space
2D: [4, 8]
Normal coords"] + + DATA["Same Tensor Data"] + end + + LS -->|"Forward Transform
apply XOR reverse"| US + US -->|"Inverse Transform
apply XOR mapping"| LS + + DATA -.->|"XOR pattern
view"| LS + DATA -.->|"Normal
view"| US SliceTransform ~~~~~~~~~~~~~~ SliceTransform extracts a sub-region from a tensor dimension. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "SliceTransform: 1D → 1D Sub-region" - LS["Lower Coordinate Space
1D: [0, 9] (original range)"] - US["Upper Coordinate Space
1D: [0, 4] (slice range)"] - - DATA["Tensor Data in Memory"] - end - - LS -->|"Forward Transform
idx + slice_begin"| US - US -->|"Inverse Transform
idx - slice_begin"| LS - - DATA -.->|"Full tensor
view"| LS - DATA -.->|"Sub-region
view"| US - - style LS fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style US fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - - - -.. image:: diagrams/transforms_11.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "SliceTransform: 1D → 1D Sub-region" + LS["Lower Coordinate Space
1D: [0, 9] (original range)"] + US["Upper Coordinate Space
1D: [0, 4] (slice range)"] + + DATA["Tensor Data in Memory"] + end + + LS -->|"Forward Transform
idx + slice_begin"| US + US -->|"Inverse Transform
idx - slice_begin"| LS + + DATA -.->|"Full tensor
view"| LS + DATA -.->|"Sub-region
view"| US ModuloTransform ~~~~~~~~~~~~~~~ ModuloTransform applies cyclic wrapping to coordinates using modulo operations. -.. - Original mermaid diagram (edit here, then run update_diagrams.py) - - .. mermaid:: - - graph TB - subgraph "ModuloTransform: 1D → 1D Cyclic" - LS["Lower Coordinate Space
1D: [0, 3] (modulus range)"] - US["Upper Coordinate Space
1D: [0, 15] (full range)"] - - DATA["Tensor Data in Memory"] - end - - LS -->|"Forward Transform
idx * cycle_count"| US - US -->|"Inverse Transform
idx % modulus"| LS - - DATA -.->|" "| LS - DATA -.->|" "| US - - style LS fill:#e3f2fd,stroke:#1976d2,stroke-width:3px - style US fill:#fff3e0,stroke:#f57c00,stroke-width:3px - style DATA fill:#f0f9ff,stroke:#0284c7,stroke-width:2px,stroke-dasharray: 5 5 - - - -.. image:: diagrams/transforms_12.svg - :alt: Diagram - :align: center +.. mermaid:: + + graph TB + subgraph "ModuloTransform: 1D → 1D Cyclic" + LS["Lower Coordinate Space
1D: [0, 3] (modulus range)"] + US["Upper Coordinate Space
1D: [0, 15] (full range)"] + + DATA["Tensor Data in Memory"] + end + + LS -->|"Forward Transform
idx * cycle_count"| US + US -->|"Inverse Transform
idx % modulus"| LS + + DATA -.->|" "| LS + DATA -.->|" "| US Summary ------- diff --git a/docs/conf.py b/docs/conf.py index bb7847e1d6d..cc14d5ed138 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,8 +13,8 @@ html_theme_options = {"flavor": "list"} -with open('../CMakeLists.txt', encoding='utf-8') as f: - match = re.search(r'.*set\(version ([0-9.]+)[^0-9.]+', f.read()) +with open("../CMakeLists.txt", encoding="utf-8") as f: + match = re.search(r".*set\(version ([0-9.]+)[^0-9.]+", f.read()) if not match: raise ValueError("VERSION not found!") version_number = match[1] @@ -35,9 +35,9 @@ external_projects_current_project = "composable_kernel" mathjax3_config = { -'tex': { - 'macros': { - 'diag': '\\operatorname{diag}', + "tex": { + "macros": { + "diag": "\\operatorname{diag}", } } } @@ -45,7 +45,13 @@ for sphinx_var in ROCmDocs.SPHINX_VARS: globals()[sphinx_var] = getattr(docs_core, sphinx_var) -extensions += ['sphinxcontrib.bibtex'] -bibtex_bibfiles = ['refs.bib'] +extensions += [ + "sphinxcontrib.mermaid", + "sphinxcontrib.bibtex", +] -cpp_id_attributes = ["__global__", "__device__", "__host__"] \ No newline at end of file +mermaid_output_format = "raw" +bibtex_bibfiles = ["refs.bib"] + +cpp_id_attributes = ["__global__", "__device__", "__host__"] +extensions = globals().get("extensions", []) + ["sphinxcontrib.datatemplates"] diff --git a/docs/data/reference/precision-support.yaml b/docs/data/reference/precision-support.yaml new file mode 100644 index 00000000000..a74fd71b902 --- /dev/null +++ b/docs/data/reference/precision-support.yaml @@ -0,0 +1,25 @@ +name: "Composable Kernel" +tag: "composable-kernel" +data_types: + - type: "int8" + support: "✅" + - type: "int32" + support: "✅" + - type: "float4 (E2M1)" + support: "✅" + - type: "float6 (E2M3)" + support: "✅" + - type: "float6 (E3M2)" + support: "✅" + - type: "float8 (E4M3)" + support: "✅" + - type: "float8 (E5M2)" + support: "✅" + - type: "float16" + support: "✅" + - type: "bfloat16" + support: "✅" + - type: "float32" + support: "✅" + - type: "float64" + support: "✅" diff --git a/docs/index.rst b/docs/index.rst index 2538269a25d..3041aa05948 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -19,7 +19,6 @@ The Composable Kernel project is located in https://github.com/ROCm/rocm-librari * :doc:`Install Composable Kernel <./install/Composable-Kernel-install>` * :doc:`Build from source <./install/Composable-Kernel-build>` - * :doc:`Composable Kernel Docker images <./install/Composable-Kernel-Docker>` .. grid-item-card:: Conceptual @@ -34,6 +33,7 @@ The Composable Kernel project is located in https://github.com/ROCm/rocm-librari .. grid-item-card:: Reference + * :doc:`Composable Kernel precision support <./reference/Composable_Kernel_data_type_support>` * :doc:`Composable Kernel supported scalar types <./reference/Composable_Kernel_supported_scalar_types>` * :doc:`Composable Kernel custom types <./reference/Composable_Kernel_custom_types>` * :doc:`Composable Kernel vector utilities <./reference/Composable_Kernel_vector_utilities>` diff --git a/docs/install/Composable-Kernel-Docker.rst b/docs/install/Composable-Kernel-Docker.rst deleted file mode 100644 index d40cc2bff5c..00000000000 --- a/docs/install/Composable-Kernel-Docker.rst +++ /dev/null @@ -1,16 +0,0 @@ -.. meta:: - :description: Composable Kernel docker files - :keywords: composable kernel, CK, ROCm, API, docker - -.. _docker-hub: - -******************************************************************** -Composable Kernel Docker containers -******************************************************************** - -Docker images that include all the required prerequisites for building Composable Kernel are available on `Docker Hub `_. - -The images also contain `ROCm `_, `CMake `_, and the `ROCm LLVM compiler infrastructure `_. - -Composable Kernel Docker images are named according to their operating system and ROCm version. For example, a Docker image named ``ck_ub22.04_rocm6.3`` would correspond to an Ubuntu 22.04 image with ROCm 6.3. - diff --git a/docs/install/Composable-Kernel-build.rst b/docs/install/Composable-Kernel-build.rst index c6fb0d2fa1a..c5490765ef7 100644 --- a/docs/install/Composable-Kernel-build.rst +++ b/docs/install/Composable-Kernel-build.rst @@ -6,41 +6,24 @@ Build and install Composable Kernel from source *********************************************** -To build Composable Kernel as part of the ROCm Core SDK, see `TheRock build -instructions -`__. -TheRock is the recommended way to build ROCm components from source. +To build Composable Kernel (CK) as part of the ROCm Core SDK, see `TheRock build +instructions `__. TheRock is the recommended way to build ROCm components from source. -Alternatively, you can build Composable Kernel standalone using the following -instructions. +Alternatively, you can build Composable Kernel standalone using the following instructions. Prerequisites ============= The following prerequisites are required to build and install Composable Kernel: -* cmake -* hip-rocclr -* iputils-ping -* jq -* libelf-dev -* libncurses5-dev -* libnuma-dev -* libpthread-stubs0-dev -* llvm-amdgpu -* mpich -* net-tools -* python3 -* python3-dev -* python3-pip -* redis -* rocm-llvm-dev -* zlib1g-dev -* libzstd-dev -* openssh-server -* clang-format-18 - -Docker images that include all the required prerequisites for building Composable Kernel are available on `Docker Hub `_. +* `CMake `_ 3.21 or later +* `Python `_ 3.8 or later +* `Git `_ +* A C++ compiler from the ROCm install, typically ``/opt/rocm/llvm/bin/clang++`` or ``hipcc`` on Linux + +Composable Kernel uses HIP to compile device code. Set ``CMAKE_PREFIX_PATH`` to the ROCm install prefix and ``CMAKE_CXX_COMPILER`` to the ROCm Clang or ``hipcc`` path when you configure the build. + +Pre-built Docker images that bundle ROCm, CMake, and the LLVM toolchain are on `Docker Hub `_. Build and install ================= @@ -81,30 +64,33 @@ Change directory to the ``build`` directory and generate the makefile using the Other build options are: -* ``DISABLE_DL_KERNELS``: Set this to "ON" to not build deep learning (DL) and data parallel primitive (DPP) instances. +* ``DISABLE_DL_KERNELS``: Set this to "ON" to not build deep learning (DL) and data parallel primitive (DPP) instances. DL and DPP instances are useful on architectures that don't support XDL or WMMA. +* ``CK_USE_FP8_ON_UNSUPPORTED_ARCH``: Set to ``ON`` to build FP8 data type instances on gfx90a without native FP8 support. +* ``GPU_TARGETS``: Target GPU architectures. The standard HIP variable. Composable Kernel forwards the list to HIP, so HIP's compatibility rules apply. List one architecture or a small set from the same family. Set this option to build the tests, examples, and tutorials. Enclose the list in quotation marks and separate entries with semicolons (``;``). For example, ``cmake -D GPU_TARGETS="gfx908;gfx90a"``. +* ``GPU_ARCHS``: Target GPU architectures. Composable Kernel-specific. Use this option to build the Composable Kernel library for architectures from different families. If you set ``GPU_ARCHS``, Composable Kernel clears ``GPU_TARGETS`` before configuring HIP. Composable Kernel then builds only the library and skips the tests, examples, and tutorials. Enclose the list in quotation marks and separate entries with semicolons (``;``). For example, ``cmake -D GPU_ARCHS="gfx908;gfx1100"``. +* ``CMAKE_BUILD_TYPE``: The build type. Can be ``None``, ``Release``, ``Debug``, ``RelWithDebInfo``, or ``MinSizeRel``. CMake uses ``Release`` by default. - .. note:: +.. note:: - DL and DPP instances are useful on architectures that don't support XDL or WMMA. + When both ``GPU_TARGETS`` and ``GPU_ARCHS`` are set, Composable Kernel uses ``GPU_ARCHS`` and clears ``GPU_TARGETS``. When neither is set, Composable Kernel picks a default target list based on the detected HIP version. Composable Kernel drops the unsupported architectures ``gfx900``, ``gfx906``, and ``gfx90c``, along with any target the installed compiler can't build for. -* ``CK_USE_FP8_ON_UNSUPPORTED_ARCH``: Set to ``ON`` to build FP8 data type instances on gfx90a without native FP8 support. -* ``GPU_TARGETS``: Target architectures. Target architectures in this list must all be different versions of the same architectures. Enclose the list of targets in quotation marks. Separate multiple targets with semicolons (``;``). For example, ``cmake -D GPU_TARGETS="gfx908;gfx90a"``. This option is required to build tests and examples. -* ``GPU_ARCHS``: Target architectures. Target architectures in this list are not limited to different versions of the same architectures. Enclose the list of targets in quotation marks. Separate multiple targets with semicolons (``;``). For example, ``cmake -D GPU_TARGETS="gfx908;gfx1100"``. -* ``CMAKE_BUILD_TYPE``: The build type. Can be ``None``, ``Release``, ``Debug``, ``RelWithDebInfo``, or ``MinSizeRel``. CMake will use ``Release`` by default. +Build Composable Kernel using the generated makefile. With a default configuration, the build produces the Composable Kernel libraries, the ``ckProfiler`` benchmarking tool, the example binaries, the tutorial binaries, and the test binaries. The output is saved to ``build/lib/`` and ``build/bin/``. The Composable Kernel headers stay in the source tree until ``make install`` copies them to the install location. .. note:: - If neither ``GPU_TARGETS`` nor ``GPU_ARCHS`` is specified, Composable Kernel will be built for all targets supported by the compiler. - -Build Composable Kernel using the generated makefile. This will build the library, the examples, and the tests, and save them to ``bin``. + A default Composable Kernel build can take an hour or more on a workstation. Most of the time goes to compiling operator instances, and build time scales with the number of GPU architectures you select. Limit ``GPU_TARGETS`` to your hardware to cut build time. .. code-block:: bash make -j20 -The ``-j`` option speeds up the build by using multiple threads in parallel. For example, ``-j20`` uses twenty threads in parallel. On average, each thread will use 2GB of memory. Make sure that the number of threads you use doesn't exceed the available memory in your system. +The ``-j`` option runs build steps in parallel. For example, ``-j20`` runs up to twenty jobs at a time. Each parallel job can use several gigabytes of memory because Composable Kernel instance files expand large template instantiations, and link jobs use more memory than compile jobs. Pick a ``-j`` value that fits your available RAM, and lower it if compiles fail with out-of-memory errors. + +.. note:: + + Don't run ``-j`` without a number. Bare ``-j`` launches an unbounded number of jobs and can exhaust memory. -Using ``-j`` alone will launch an unlimited number of threads and is not recommended. + With Ninja, set ``-D CK_PARALLEL_COMPILE_JOBS=N`` and ``-D CK_PARALLEL_LINK_JOBS=M`` at configure time to cap compile and link jobs separately. These options have no effect with Make. Install the Composable Kernel library: diff --git a/docs/install/Composable-Kernel-install.rst b/docs/install/Composable-Kernel-install.rst index 7bbf5867c05..f1830b41899 100644 --- a/docs/install/Composable-Kernel-install.rst +++ b/docs/install/Composable-Kernel-install.rst @@ -4,42 +4,33 @@ .. _installation: -************************* +************************** Install Composable Kernel -************************* +************************** -Before you begin, verify that your system is supported. For more information, -see :ref:`ROCm Core SDK components `. +Before you begin, verify that your system is supported. For more information, see :ref:`ROCm Core SDK components `. -For advanced workflows, source builds, or custom configurations, see -:doc:`./Composable-Kernel-build`. +For advanced workflows, source builds, or custom configurations, see :doc:`./Composable-Kernel-build`. .. _install-rocm: Install the ROCm Core SDK ========================= -Composable Kernel (CK) is included with the ROCm Core SDK on Linux and Windows. -For the most complete installation, we recommend that developers use the -``amdrocm-core-sdk`` meta package on Linux. - -For instructions, see :doc:`Install AMD ROCm `. Use the -selector panel on that page to view instructions appropriate for your system -environment. +Composable Kernel (CK) is included with the ROCm Core SDK on Linux and Windows. For the complete Core SDK installation, use the +``amdrocm-core-sdk`` package. See :doc:`Install AMD ROCm ` for more information. .. _install-base: -Install the ROCm CK package on Linux -==================================== +Install the Composable Kernel package on Linux +================================================ -Alternatively, if you want to install Composable Kernel as part of the ROCm -without additional ROCm libraries and tools, install the ``amdrocm-ck`` -package. +Alternatively, you can use the ``amdrocm-ck`` package to install Composable Kernel without the full ROCm Core SDK. 1. Complete the :doc:`ROCm installation prerequisites ` to install dependencies and configure GPU access permissions. -2. Install the ROCm CK package that matches your desired ROCm version. Package +2. Install the Composable Kernel package that matches your desired ROCm version. Package names use the following format: .. code-block:: shell-session @@ -64,27 +55,27 @@ package. .. code-block:: bash - sudo apt install amdrocm-ck + sudo apt install amdrocm-ck- .. tab-item:: RHEL-based distros .. code-block:: bash - sudo dnf install amdrocm-ck + sudo dnf install amdrocm-ck- .. tab-item:: SLES .. code-block:: bash - sudo zypper install amdrocm-ck + sudo zypper install amdrocm-ck- .. _install-nightly: Install a nightly build ======================= -The `TheRock `__ build system also publishes -nightly builds for the ROCm Core SDK and its components, including Composable -Kernel. See `Nightly release status -`__ for details. +The `TheRock `__ build system also publishes nightly builds for the ROCm Core SDK and its components, including Composable Kernel. See `Nightly release status `__ for details. + +.. note:: + If you choose to install from a nightly build artifact, you'll need to set ``HIP_PLATFORM=amd`` and ``LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/rocm/lib`` after installation. \ No newline at end of file diff --git a/docs/reference/Composable_Kernel_data_type_support.rst b/docs/reference/Composable_Kernel_data_type_support.rst new file mode 100644 index 00000000000..6407fa8f94c --- /dev/null +++ b/docs/reference/Composable_Kernel_data_type_support.rst @@ -0,0 +1,67 @@ +.. meta:: + :description: Composable Kernel library precision support + :keywords: composable kernel, scalar, data types, support, CK, ROCm, precision + +.. _composablekernel-data-type-support: + +*************************************************** +Composable Kernel precision support +*************************************************** + +This topic lists the data type support for the Composable Kernel library on AMD +GPUs. + +This page lists the data types supported by the library itself and does not +indicate hardware support. A type listed here is only usable if the GPU +architecture also supports it; otherwise it is unsupported. For data type support +across the other ROCm libraries and by GPU architecture, see the +:doc:`Data types and precision support page `. + +.. _composablekernel-input-output-type-support: + +Supported data types overview +============================= + +The following table summarizes the input and output data types supported by +Composable Kernel. + +.. list-table:: + :header-rows: 1 + + * + - Icon + - Definition + * + - ✅ + - Fully supported as both an input and output type. + * + - ⚠️ + - Partially supported as an input or output type. + +Data types not listed in the table below are not supported. + +.. datatemplate:yaml:: /data/reference/precision-support.yaml + + .. list-table:: + :header-rows: 1 + :widths: 70, 30 + + * + - Data type + - Support + {% for data_type in data.data_types %} + * + - {{ data_type.type }} + - {{ data_type.support }} + {% endfor %} + +Related references +================== + +For details about the underlying C++ types used by Composable Kernel, see the +following pages: + +* :doc:`Supported scalar data types ` — + the C++ scalar types, their bit widths, and bit-layout descriptions. +* :doc:`Custom types ` — the custom types + Composable Kernel defines for specialized operations. diff --git a/docs/reference/Composable_Kernel_supported_scalar_types.rst b/docs/reference/Composable_Kernel_supported_scalar_types.rst index 7ea1a9eaeb0..47c646b69bd 100644 --- a/docs/reference/Composable_Kernel_supported_scalar_types.rst +++ b/docs/reference/Composable_Kernel_supported_scalar_types.rst @@ -2,6 +2,8 @@ :description: Composable Kernel supported scalar types :keywords: composable kernel, scalar, data types, support, CK, ROCm +.. _composablekernel-supported-scalar-types: + *************************************************** Composable Kernel supported scalar data types *************************************************** diff --git a/docs/sphinx/_toc.yml.in b/docs/sphinx/_toc.yml.in index d5140261b91..ad6de3413b4 100644 --- a/docs/sphinx/_toc.yml.in +++ b/docs/sphinx/_toc.yml.in @@ -9,8 +9,6 @@ subtrees: title: Install Composable Kernel - file: install/Composable-Kernel-build.rst title: Build from source - - file: install/Composable-Kernel-Docker.rst - title: Docker images - caption: Conceptual entries: @@ -30,6 +28,8 @@ subtrees: - caption: Reference entries: + - file: reference/Composable_Kernel_data_type_support.rst + title: Precision support - file: reference/Composable_Kernel_supported_scalar_types.rst title: Scalar types - file: reference/Composable_Kernel_custom_types.rst diff --git a/docs/sphinx/requirements.in b/docs/sphinx/requirements.in index f2fb27e2b94..1936e87b233 100644 --- a/docs/sphinx/requirements.in +++ b/docs/sphinx/requirements.in @@ -1,2 +1,4 @@ rocm-docs-core[api_reference]==1.31.3 sphinxcontrib-bibtex==2.6.5 +sphinxcontrib-mermaid>=1.0 +sphinxcontrib-datatemplates==0.11.0 diff --git a/docs/sphinx/requirements.txt b/docs/sphinx/requirements.txt index e36975219d8..674797c6e03 100644 --- a/docs/sphinx/requirements.txt +++ b/docs/sphinx/requirements.txt @@ -10,12 +10,12 @@ alabaster==1.0.0 # via sphinx asttokens==3.0.1 # via stack-data -attrs==25.4.0 +attrs==26.1.0 # via # jsonschema # jupyter-cache # referencing -babel==2.17.0 +babel==2.18.0 # via # pydata-sphinx-theme # sphinx @@ -23,15 +23,15 @@ beautifulsoup4==4.14.3 # via pydata-sphinx-theme breathe==4.36.0 # via rocm-docs-core -certifi==2026.1.4 +certifi==2026.5.20 # via requests cffi==2.0.0 # via # cryptography # pynacl -charset-normalizer==3.4.4 +charset-normalizer==3.4.7 # via requests -click==8.3.1 +click==8.4.1 # via # click-log # doxysphinx @@ -41,11 +41,11 @@ click-log==0.4.0 # via doxysphinx comm==0.2.3 # via ipykernel -cryptography==46.0.3 +cryptography==48.0.0 # via pyjwt -debugpy==1.8.19 +debugpy==1.8.21 # via ipykernel -decorator==5.2.1 +decorator==5.3.1 # via ipython docutils==0.21.2 # via @@ -66,30 +66,31 @@ fastjsonschema==2.21.2 # rocm-docs-core gitdb==4.0.12 # via gitpython -gitpython==3.1.46 +gitpython==3.1.50 # via rocm-docs-core -greenlet==3.3.0 +greenlet==3.5.1 # via sqlalchemy -idna==3.15 +idna==3.18 # via requests -imagesize==1.4.1 +imagesize==2.0.0 # via sphinx -importlib-metadata==8.7.1 +importlib-metadata==9.0.0 # via # jupyter-cache # myst-nb -ipykernel==7.1.0 +ipykernel==7.2.0 # via myst-nb -ipython==8.38.0 +ipython==8.39.0 # via # ipykernel # myst-nb -jedi==0.19.2 +jedi==0.20.0 # via ipython jinja2==3.1.6 # via # myst-parser # sphinx + # sphinxcontrib-mermaid jsonschema==4.26.0 # via nbformat jsonschema-specifications==2025.9.1 @@ -118,17 +119,17 @@ markdown-it-py==3.0.0 # myst-parser markupsafe==3.0.3 # via jinja2 -matplotlib-inline==0.2.1 +matplotlib-inline==0.2.2 # via # ipykernel # ipython -mdit-py-plugins==0.5.0 +mdit-py-plugins==0.6.1 # via myst-parser mdurl==0.1.2 # via markdown-it-py mpire==2.10.2 # via doxysphinx -myst-nb==1.3.0 +myst-nb==1.4.0 # via rocm-docs-core myst-parser==4.0.1 # via myst-nb @@ -143,40 +144,40 @@ nbformat==5.10.4 # nbclient nest-asyncio==1.6.0 # via ipykernel -packaging==25.0 +packaging==26.2 # via # ipykernel # pydata-sphinx-theme # sphinx -parso==0.8.5 +parso==0.8.7 # via jedi pexpect==4.9.0 # via ipython -platformdirs==4.5.1 +platformdirs==4.10.0 # via jupyter-core prompt-toolkit==3.0.52 # via ipython -psutil==7.2.1 +psutil==7.2.2 # via ipykernel ptyprocess==0.7.0 # via pexpect pure-eval==0.2.3 # via stack-data -pybtex==0.25.1 +pybtex==0.26.1 # via # pybtex-docutils # sphinxcontrib-bibtex pybtex-docutils==1.0.3 # via sphinxcontrib-bibtex -pycparser==2.23 +pycparser==3.0 # via cffi pydata-sphinx-theme==0.15.4 # via # rocm-docs-core # sphinx-book-theme -pygithub==2.8.1 +pygithub==2.9.1 # via rocm-docs-core -pygments==2.19.2 +pygments==2.20.0 # via # accessible-pygments # ipython @@ -185,7 +186,7 @@ pygments==2.19.2 # sphinx pyjson5==1.6.9 # via doxysphinx -pyjwt[crypto]==2.10.1 +pyjwt[crypto]==2.13.0 # via pygithub pynacl==1.6.2 # via pygithub @@ -201,6 +202,7 @@ pyyaml==6.0.3 # pybtex # rocm-docs-core # sphinx-external-toc + # sphinxcontrib-mermaid pyzmq==27.1.0 # via # ipykernel @@ -209,7 +211,7 @@ referencing==0.37.0 # via # jsonschema # jsonschema-specifications -requests==2.33.0 +requests==2.34.2 # via # pygithub # sphinx @@ -221,11 +223,11 @@ rpds-py==0.30.0 # referencing six==1.17.0 # via python-dateutil -smmap==5.0.2 +smmap==5.0.3 # via gitdb -snowballstemmer==3.0.1 +snowballstemmer==3.1.1 # via sphinx -soupsieve==2.8.1 +soupsieve==2.8.4 # via beautifulsoup4 sphinx==8.1.3 # via @@ -238,47 +240,57 @@ sphinx==8.1.3 # sphinx-copybutton # sphinx-design # sphinx-external-toc + # sphinx-multitoc-numbering # sphinx-notfound-page # sphinxcontrib-bibtex + # sphinxcontrib-mermaid sphinx-book-theme==1.1.4 # via rocm-docs-core sphinx-copybutton==0.5.2 # via rocm-docs-core sphinx-design==0.6.1 # via rocm-docs-core -sphinx-external-toc==1.0.1 +sphinx-external-toc==1.1.0 # via rocm-docs-core +sphinx-multitoc-numbering==0.1.3 + # via sphinx-external-toc sphinx-notfound-page==1.1.0 # via rocm-docs-core sphinxcontrib-applehelp==2.0.0 # via sphinx sphinxcontrib-bibtex==2.6.5 # via -r requirements.in +sphinxcontrib-datatemplates==0.11.0 + # via -r requirements.in sphinxcontrib-devhelp==2.0.0 # via sphinx sphinxcontrib-htmlhelp==2.1.0 # via sphinx sphinxcontrib-jsmath==1.0.1 # via sphinx +sphinxcontrib-mermaid==2.0.2 + # via -r requirements.in sphinxcontrib-qthelp==2.0.0 # via sphinx +sphinxcontrib-runcmd==0.2.0 + # via sphinxcontrib-datatemplates sphinxcontrib-serializinghtml==2.0.0 # via sphinx -sqlalchemy==2.0.45 +sqlalchemy==2.0.50 # via jupyter-cache stack-data==0.6.3 # via ipython -tabulate==0.9.0 +tabulate==0.10.0 # via jupyter-cache -tomli==2.4.0 +tomli==2.4.1 # via sphinx -tornado==6.5.5 +tornado==6.5.6 # via # ipykernel # jupyter-client tqdm==4.67.3 # via mpire -traitlets==5.14.3 +traitlets==5.15.1 # via # ipykernel # ipython @@ -296,13 +308,14 @@ typing-extensions==4.15.0 # myst-nb # pydata-sphinx-theme # pygithub + # pyjwt # referencing # sqlalchemy urllib3==2.7.0 # via # pygithub # requests -wcwidth==0.2.14 +wcwidth==0.7.0 # via prompt-toolkit -zipp==3.23.0 +zipp==4.1.0 # via importlib-metadata diff --git a/example/01_gemm/CMakeLists.txt b/example/01_gemm/CMakeLists.txt index bc2e6a78e7c..83aea5a33b9 100644 --- a/example/01_gemm/CMakeLists.txt +++ b/example/01_gemm/CMakeLists.txt @@ -25,8 +25,6 @@ add_example_dependencies(example_gemm_xdl example_gemm_xdl_fp16) add_example_executable(example_gemm_xdl_fp16_v2 gemm_xdl_fp16_v2.cpp) add_example_dependencies(example_gemm_xdl example_gemm_xdl_fp16_v2) -add_example_executable(example_gemm_xdl_fp16_streamk_v3 gemm_xdl_fp16_streamk_v3.cpp) -add_example_dependencies(example_gemm_xdl example_gemm_xdl_fp16_streamk_v3) add_example_executable(example_gemm_xdl_fp16_v3 gemm_xdl_fp16_v3.cpp) add_example_dependencies(example_gemm_xdl example_gemm_xdl_fp16_v3) add_example_executable(example_gemm_xdl_fp8_v3 gemm_xdl_fp8_v3.cpp) @@ -35,10 +33,6 @@ add_example_dependencies(example_gemm_xdl example_gemm_xdl_fp8_v3) add_example_executable(example_gemm_xdl_fp16_fp8_v3 gemm_xdl_fp16_fp8_v3.cpp) add_example_dependencies(example_gemm_xdl example_gemm_xdl_fp16_fp8_v3) - -add_example_executable(example_gemm_xdl_fp16_fp8_streamk_v3 gemm_xdl_fp16_fp8_streamk_v3.cpp) -add_example_dependencies(example_gemm_xdl example_gemm_xdl_fp16_fp8_streamk_v3) - add_example_executable(example_gemm_xdl_bf16_v3 gemm_xdl_bf16_v3.cpp) add_example_dependencies(example_gemm_xdl example_gemm_xdl_bf16_v3) @@ -80,8 +74,6 @@ endif(USE_BITINT_EXTENSION_INT4) add_example_executable(example_gemm_xdl_fp64 gemm_xdl_fp64.cpp) add_example_dependencies(example_gemm_xdl example_gemm_xdl_fp64) -add_example_executable(example_gemm_xdl_streamk gemm_xdl_streamk.cpp) - list(APPEND gpu_list gfx90a gfx942 gfx950 gfx1250) set(target 0) foreach(gpu IN LISTS GPU_TARGETS) @@ -95,19 +87,6 @@ foreach(gpu IN LISTS GPU_TARGETS) endif() endforeach() -list(APPEND gpu_list gfx90a gfx942 gfx950 gfx1200 gfx1201 gfx12-generic gfx1250) -set(target 0) -foreach(gpu IN LISTS GPU_TARGETS) - if(gpu IN_LIST gpu_list AND target EQUAL 0) - add_example_executable(example_gemm_xdl_bf16_streamk_v3 gemm_xdl_bf16_streamk_v3.cpp) - add_example_dependencies(example_gemm_xdl example_gemm_xdl_bf16_streamk_v3) - - add_example_executable(example_gemm_xdl_fp8_streamk_v3 gemm_xdl_fp8_streamk_v3.cpp) - add_example_dependencies(example_gemm_xdl example_gemm_xdl_fp8_streamk_v3) - set(target 1) - endif() -endforeach() - list(APPEND gpu_list_tf32 gfx942 gfx950) set(target 0) foreach(gpu IN LISTS GPU_TARGETS) diff --git a/example/01_gemm/README.md b/example/01_gemm/README.md index ae0e918b8d0..7e82067df2c 100644 --- a/example/01_gemm/README.md +++ b/example/01_gemm/README.md @@ -162,8 +162,6 @@ Split-K is supported (requires zeroing output buffer if splitK > 1). - **DeviceGemmMultipleDLayernorm**: GEMM fused with layernorm - **DeviceGemmMultipleDMultipleR**: GEMM fused with reductions and custom global reductions - **DeviceGemmReduce**: GEMM fused with reduction -- **DeviceGemm_Streamk_V2**: Stream K with reduction instead of AtomicAdd -- **DeviceGemmStreamK**: Stream K using AtomicAdd --- diff --git a/example/01_gemm/common.hpp b/example/01_gemm/common.hpp index a7dca891fd5..07eed72aa50 100644 --- a/example/01_gemm/common.hpp +++ b/example/01_gemm/common.hpp @@ -42,33 +42,6 @@ struct ProblemSize final ck::index_t StrideC = -1; }; -struct ProblemSizeStreamK final -{ - ck::index_t M = 3840; - ck::index_t N = 4096; - ck::index_t K = 4096; - - ck::index_t StrideA = -1; - ck::index_t StrideB = -1; - ck::index_t StrideC = -1; - - ck::index_t NumSKBlocks = -1; // number of stream-k blocks -}; -struct ProblemSizeStreamK_universal final -{ - ck::index_t M = 3840; - ck::index_t N = 4096; - ck::index_t K = 4096; - - ck::index_t StrideA = -1; - ck::index_t StrideB = -1; - ck::index_t StrideC = -1; - - ck::index_t Grid_size = -1; // defaults to max occupancy - ck::index_t Streamk_sel = 1; // defaults to 1-tile SK - ck::StreamKReductionStrategy reduction_strategy = ck::StreamKReductionStrategy::Atomic; -}; - struct ProblemSizeSplitK final { ck::index_t M = 3840; @@ -148,123 +121,6 @@ bool parse_cmd_args(int argc, return true; } -template <> -bool parse_cmd_args(int argc, - char* argv[], - ProblemSizeStreamK_universal& problem_size, - ExecutionConfig& config) -{ - if(argc == 1) - { - // use default case - } - else if(argc == 4) - { - config.do_verification = std::stoi(argv[1]); - config.init_method = std::stoi(argv[2]); - config.time_kernel = std::stoi(argv[3]); - } - else if(argc >= 10) - { - config.do_verification = std::stoi(argv[1]); - config.init_method = std::stoi(argv[2]); - config.time_kernel = std::stoi(argv[3]); - - problem_size.M = std::stoi(argv[4]); - problem_size.N = std::stoi(argv[5]); - problem_size.K = std::stoi(argv[6]); - - problem_size.StrideA = std::stoi(argv[7]); - problem_size.StrideB = std::stoi(argv[8]); - problem_size.StrideC = std::stoi(argv[9]); - - if(argc >= 11) - { - problem_size.Streamk_sel = std::stoi(argv[10]); - - if(argc >= 12) - { - problem_size.Grid_size = std::stoi(argv[11]); - - if(argc >= 13) - { - int reduction_strategy = std::stoi(argv[12]); - problem_size.reduction_strategy = reduction_strategy == 0 - ? ck::StreamKReductionStrategy::Atomic - : ck::StreamKReductionStrategy::Reduction; - } - } - } - } - else - { - std::cerr - << "arg1: verification (0=no, 1=CPU, 2=GPU, 3=CPU and GPU)" << std::endl - << "arg2: initialization (0=no init, 1=integer value, 2=decimal value)" << std::endl - << "arg3: time kernel (0=no, 1=yes)" << std::endl - << "arg4 to 9: M (256x), N(128x), K(32x), StrideA, StrideB, StrideC (default: -1 or 0)" - << std::endl - << "arg10: stream-k select (-1: default config, 0: all DP, 1: 1-tile SK, 2: 2-tile SK)" - << std::endl - << "arg11: Grid_size(-1 for max occupancy)" << std::endl - << "arg12: Reduction strategy (0: Atomic, 1: Reduction)" << std::endl; - return false; - } - - return true; -} - -template <> -bool parse_cmd_args(int argc, - char* argv[], - ProblemSizeStreamK& problem_size, - ExecutionConfig& config) -{ - if(argc == 1) - { - // use default case - } - else if(argc == 4) - { - config.do_verification = std::stoi(argv[1]); - config.init_method = std::stoi(argv[2]); - config.time_kernel = std::stoi(argv[3]); - } - else if(argc >= 10) - { - config.do_verification = std::stoi(argv[1]); - config.init_method = std::stoi(argv[2]); - config.time_kernel = std::stoi(argv[3]); - - problem_size.M = std::stoi(argv[4]); - problem_size.N = std::stoi(argv[5]); - problem_size.K = std::stoi(argv[6]); - - problem_size.StrideA = std::stoi(argv[7]); - problem_size.StrideB = std::stoi(argv[8]); - problem_size.StrideC = std::stoi(argv[9]); - - if(argc >= 11) - { - problem_size.NumSKBlocks = std::stoi(argv[10]); - } - } - else - { - std::cerr - << "arg1: verification (0=no, 1=CPU, 2=GPU, 3=CPU and GPU)" << std::endl - << "arg2: initialization (0=no init, 1=integer value, 2=decimal value)" << std::endl - << "arg3: time kernel (0=no, 1=yes)" << std::endl - << "arg4 to 9: M (256x), N(128x), K(32x), StrideA, StrideB, StrideC (default: -1 or 0)" - << std::endl - << "arg10: stream-k select (0: all DP, 1: 1-tile SK, 2: 2-tile SK)" - << "\narg11: Grid_size(-1 for max occupancy)" << std::endl; - return false; - } - - return true; -} - template <> bool parse_cmd_args(int argc, char* argv[], diff --git a/example/01_gemm/gemm_xdl_bf16_streamk_v3.cpp b/example/01_gemm/gemm_xdl_bf16_streamk_v3.cpp deleted file mode 100644 index 754cc8f6f53..00000000000 --- a/example/01_gemm/gemm_xdl_bf16_streamk_v3.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. -// SPDX-License-Identifier: MIT - -#include "common.hpp" - -#include "ck/tensor_operation/gpu/device/impl/device_gemm_xdl_cshuffle_streamk_v3.hpp" - -using ADataType = ck::bhalf_t; -using BDataType = ck::bhalf_t; -using CDataType = ck::bhalf_t; -using AccDataType = float; -using CShuffleDataType = ck::bhalf_t; - -using ALayout = Row; -using BLayout = Col; -using CLayout = Row; - -using AElementOp = PassThrough; -using BElementOp = PassThrough; -using CElementOp = PassThrough; - -static constexpr auto GemmDefault = ck::tensor_operation::device::GemmSpecialization::Default; - -// clang-format off -using DeviceGemmV2_Streamk_Instance = - ck::tensor_operation::device::DeviceGemm_Xdl_CShuffle_Streamk_V3< - ALayout, BLayout, CLayout, - ADataType, BDataType, CDataType, AccDataType, CShuffleDataType, - PassThrough, PassThrough, PassThrough, GemmDefault, - 256, - 128, 128, - 64, 8, 8, - 16, 16, - 4, 4, - S<8, 32, 1>, S<1, 0, 2>, S<1, 0, 2>, - 2, 8, 8, 0, - S<8, 32, 1>, S<1, 0, 2>, S<1, 0, 2>, - 2, 8, 8, 0, - 1, 2, S<1, 32, 1, 8>, 8, - ck::BlockGemmPipelineScheduler::Intrawave,ck::BlockGemmPipelineVersion::v3>; -// clang-format on - -using ReferenceGemmInstance = ck::tensor_operation::host:: - ReferenceGemm; - -using ReferenceGemmInstanceGPU = ck::tensor_operation::device::ReferenceGemm; - -#include "run_gemm_example_streamk_v2.inc" - -int main(int argc, char* argv[]) { return !run_gemm_universal_streamk_example(argc, argv); } diff --git a/example/01_gemm/gemm_xdl_fp16_fp8_streamk_v3.cpp b/example/01_gemm/gemm_xdl_fp16_fp8_streamk_v3.cpp deleted file mode 100644 index e7c00610742..00000000000 --- a/example/01_gemm/gemm_xdl_fp16_fp8_streamk_v3.cpp +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. -// SPDX-License-Identifier: MIT - -#include "common.hpp" - -#include "ck/tensor_operation/gpu/device/impl/device_gemm_xdl_cshuffle_streamk_v3.hpp" - -using ADataType = ck::half_t; -using BDataType = ck::f8_t; -using AccDataType = float; -using CShuffleDataType = ck::half_t; -using CDataType = ck::half_t; - -using ALayout = Row; -using BLayout = Col; -using CLayout = Row; - -using AElementOp = PassThrough; -using BElementOp = PassThrough; -using CElementOp = PassThrough; - -static constexpr auto GemmDefault = ck::tensor_operation::device::GemmSpecialization::Default; - -// clang-format off -using DeviceGemmV2_Streamk_Instance = - ck::tensor_operation::device::DeviceGemm_Xdl_CShuffle_Streamk_V3< - ALayout, BLayout, CLayout, - ADataType, BDataType, CDataType, AccDataType, CShuffleDataType, - AElementOp, BElementOp, CElementOp, GemmDefault, - 64, - 32, 32, - 256, 8, 16, - 16, 16, - 2, 2, - S<32, 2, 1>, S<1, 0, 2>, S<1, 0, 2>, - 2, 8, 8, 0, - S<16, 4, 1>, S<1, 0, 2>, S<1, 0, 2>, - 2, 16, 16, 0, - 1, 1, S<1, 16, 1, 4>, 4, - ck::BlockGemmPipelineScheduler::Interwave, ck::BlockGemmPipelineVersion::v1>; -// clang-format on - -using ReferenceGemmInstanceGPU = ck::tensor_operation::device::ReferenceGemm; - -using ReferenceGemmInstance = ck::tensor_operation::host::ReferenceGemm; - -#include "run_gemm_example_streamk_v2.inc" - -int main(int argc, char* argv[]) { return !run_gemm_universal_streamk_example(argc, argv); } diff --git a/example/01_gemm/gemm_xdl_fp16_streamk_v3.cpp b/example/01_gemm/gemm_xdl_fp16_streamk_v3.cpp deleted file mode 100644 index 0997afcdca1..00000000000 --- a/example/01_gemm/gemm_xdl_fp16_streamk_v3.cpp +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. -// SPDX-License-Identifier: MIT - -#include "common.hpp" - -#include "ck/tensor_operation/gpu/device/impl/device_gemm_xdl_cshuffle_streamk_v3.hpp" - -using ADataType = ck::half_t; -using BDataType = ck::half_t; -using AccDataType = float; -using CShuffleDataType = float; -using CDataType = ck::half_t; - -using ALayout = Row; -using BLayout = Row; -using CLayout = Row; - -using AElementOp = PassThrough; -using BElementOp = PassThrough; -using CElementOp = PassThrough; - -static constexpr auto GemmDefault = ck::tensor_operation::device::GemmSpecialization::MNPadding; - -// clang-format off -using DeviceGemmV2_Streamk_Instance = - ck::tensor_operation::device::DeviceGemm_Xdl_CShuffle_Streamk_V3< - ALayout, BLayout, CLayout, - ADataType, BDataType, CDataType, AccDataType, CShuffleDataType, - PassThrough, PassThrough, PassThrough, GemmDefault, - 256, - 224, 256, - 64, 8, 2, - 16, 16, - 7, 8, - S<8, 32, 1>, S<1, 0, 2>, S<1, 0, 2>, - 2, 8, 8, 0, - S<8, 32, 1>, S<0, 2, 1>, S<0, 2, 1>, - 1, 8, 2, 0, - 1, 2, S<1, 32, 1, 8>, 8, - ck::BlockGemmPipelineScheduler::Intrawave,ck::BlockGemmPipelineVersion::v3>; -// clang-format on - -using ReferenceGemmInstance = ck::tensor_operation::host:: - ReferenceGemm; - -using ReferenceGemmInstanceGPU = ck::tensor_operation::device::ReferenceGemm; - -#include "run_gemm_example_streamk_v2.inc" - -int main(int argc, char* argv[]) { return !run_gemm_universal_streamk_example(argc, argv); } diff --git a/example/01_gemm/gemm_xdl_fp8_streamk_v3.cpp b/example/01_gemm/gemm_xdl_fp8_streamk_v3.cpp deleted file mode 100644 index e4a01c2c13d..00000000000 --- a/example/01_gemm/gemm_xdl_fp8_streamk_v3.cpp +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. -// SPDX-License-Identifier: MIT - -#include "common.hpp" - -#include "ck/tensor_operation/gpu/device/impl/device_gemm_xdl_cshuffle_streamk_v3.hpp" - -using ADataType = ck::f8_t; -using BDataType = ck::f8_t; -using AccDataType = float; -using CShuffleDataType = ck::half_t; -using CDataType = ck::half_t; - -using ALayout = Row; -using BLayout = Col; -using CLayout = Row; - -using AElementOp = PassThrough; -using BElementOp = PassThrough; -using CElementOp = PassThrough; - -static constexpr auto GemmDefault = ck::tensor_operation::device::GemmSpecialization::Default; - -// clang-format off -using DeviceGemmV2_Streamk_Instance = - ck::tensor_operation::device::DeviceGemm_Xdl_CShuffle_Streamk_V3< - ALayout, BLayout, CLayout, - ADataType, BDataType, CDataType, AccDataType, CShuffleDataType, - PassThrough, PassThrough, PassThrough, GemmDefault, - 256, - 128, 256, - 128, 16, 16, - 16, 16, - 4, 8, - S<8, 32, 1>, S<1, 0, 2>, S<1, 0, 2>, - 2, 16, 16, 1, - S<8, 32, 1>, S<1, 0, 2>, S<1, 0, 2>, - 2, 16, 16, 1, - 1, 2, S<1, 32, 1, 8>, 8, - ck::BlockGemmPipelineScheduler::Intrawave,ck::BlockGemmPipelineVersion::v3, ck::f8_t>; -// clang-format on - -using ReferenceGemmInstance = ck::tensor_operation::host:: - ReferenceGemm; -using ReferenceGemmInstanceGPU = ck::tensor_operation::device::ReferenceGemm; - -#include "run_gemm_example_streamk_v2.inc" - -int main(int argc, char* argv[]) { return !run_gemm_universal_streamk_example(argc, argv); } diff --git a/example/01_gemm/gemm_xdl_streamk.cpp b/example/01_gemm/gemm_xdl_streamk.cpp deleted file mode 100644 index caf98c1cff3..00000000000 --- a/example/01_gemm/gemm_xdl_streamk.cpp +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. -// SPDX-License-Identifier: MIT - -#include "common.hpp" - -#include "ck/tensor_operation/gpu/device/impl/device_gemm_xdl_streamk.hpp" - -using ADataType = ck::half_t; -using BDataType = ck::half_t; -using AccDataType = float; -using CShuffleDataType = float; -using CDataType = ck::half_t; - -using F16 = ck::half_t; - -using ALayout = Row; -using BLayout = Row; -using CLayout = Row; - -using AElementOp = PassThrough; -using BElementOp = PassThrough; -using CElementOp = PassThrough; - -// clang-format off -using DeviceGemmStreamK = ck::tensor_operation::device::DeviceGemmXdlStreamK -// ######| AData| BData| CData| AccData| ALayout| BLayout| CLayout| A| B| C| Block| MPer| NPer| K0Per| K1| MPer| NPer| MXdl| NXdl| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockLds| BBlockTransfer| BBlockTransfer| BBlockTransfer| BlockTransfer| BBlockTransfer| BBlockTransfer| BBlockLds| CShuffle| CShuffle| CBlockTransferClusterLengths| CBlockTransfer| -// ######| Type| Type| Type| Type| | | | Elementwise| Elementwise| Elementwise| Size| Block| Block| Block| | XDL| XDL| Per| Per| ThreadCluster| ThreadCluster| SrcAccessOrder| SrcVectorDim| SrcScalar| DstScalar| AddExtraM| ThreadCluster| ThreadCluster| SrcAccessOrder| SrcVectorDim| SrcScalar| DstScalar| AddExtraN| MXdlPerWave| NXdlPerWave| _MBlock_MWaveMPerXdl| ScalarPerVector| -// ######| | | | | | | | Operation| Operation| Operation| | | | | | | | Wave| Wave| Lengths_K0_M_K1| ArrangeOrder| | | PerVector| PerVector_K1| | Lengths_K0_N_K1| ArrangeOrder| | | PerVector| PerVector_K1| | PerShuffle| PerShuffle| _NBlock_NWaveNPerXdl| _NWaveNPerXdl| -// ######| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - < ADataType, BDataType, CDataType, AccDataType, ALayout, BLayout, CLayout, AElementOp, BElementOp, CElementOp, 256, 128, 128, 4, 8, 32, 32, 2, 2, S<4, 64, 1>, S<1, 0, 2>, S<1, 0, 2>, 2, 8, 8, 1, S<4, 64, 1>, S<0, 2, 1>, S<0, 2, 1>, 1, 2, 8, 1, 1, 1, S<1, 32, 1, 8>, 8>; - - // < ADataType, BDataType, CDataType, AccDataType, ALayout, BLayout, CLayout, AElementOp, BElementOp, CElementOp, 256, 256, 128, 4, 8, 32, 32, 4, 2, S<4, 64, 1>, S<1, 0, 2>, S<1, 0, 2>, 2, 8, 8, 1, S<4, 64, 1>, S<0, 2, 1>, S<0, 2, 1>, 1, 2, 2, 1, 1, 1, S<1, 32, 1, 8>, 8>; - // < ADataType, BDataType, CDataType, AccDataType, ALayout, BLayout, CLayout, AElementOp, BElementOp, CElementOp, 128, 32, 64, 4, 8, 32, 32, 1, 1, S<4, 32, 1>, S<1, 0, 2>, S<1, 0, 2>, 2, 8, 8, 1, S<4, 32, 1>, S<0, 2, 1>, S<0, 2, 1>, 1, 2, 8, 1, 1, 1, S<1, 16, 1, 8>, 8>; - // < ADataType, BDataType, CDataType, AccDataType, ALayout, BLayout, CLayout, AElementOp, BElementOp, CElementOp, 128, 32, 128, 4, 8, 32, 32, 1, 1, S<8, 16, 1>, S<1, 0, 2>, S<1, 0, 2>, 2, 8, 8, 1, S<8, 16, 1>, S<0, 2, 1>, S<0, 2, 1>, 1, 2, 2, 1, 1, 1, S<1, 32, 1, 4>, 8>; - -// instance for double rate mfma instruction on gfx950 -using DeviceGemmStreamK2 = ck::tensor_operation::device::DeviceGemmXdlStreamK -// ######| AData| BData| CData| AccData| ALayout| BLayout| CLayout| A| B| C| Block| MPer| NPer| K0Per| K1| MPer| NPer| MXdl| NXdl| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockTransfer| ABlockLds| BBlockTransfer| BBlockTransfer| BBlockTransfer| BlockTransfer| BBlockTransfer| BBlockTransfer| BBlockLds| CShuffle| CShuffle| CBlockTransferClusterLengths| CBlockTransfer| -// ######| Type| Type| Type| Type| | | | Elementwise| Elementwise| Elementwise| Size| Block| Block| Block| | XDL| XDL| Per| Per| ThreadCluster| ThreadCluster| SrcAccessOrder| SrcVectorDim| SrcScalar| DstScalar| AddExtraM| ThreadCluster| ThreadCluster| SrcAccessOrder| SrcVectorDim| SrcScalar| DstScalar| AddExtraN| MXdlPerWave| NXdlPerWave| _MBlock_MWaveMPerXdl| ScalarPerVector| -// ######| | | | | | | | Operation| Operation| Operation| | | | | | | | Wave| Wave| Lengths_K0_M_K1| ArrangeOrder| | | PerVector| PerVector_K1| | Lengths_K0_N_K1| ArrangeOrder| | | PerVector| PerVector_K1| | PerShuffle| PerShuffle| _NBlock_NWaveNPerXdl| _NWaveNPerXdl| -// ######| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | - < ADataType, BDataType, CDataType, AccDataType, ALayout, BLayout, CLayout, AElementOp, BElementOp, CElementOp, 256, 256, 128, 4, 16, 32, 32, 4, 2, S<4, 64, 1>, S<1, 0, 2>, S<1, 0, 2>, 2, 8, 8, 1, S<4, 32, 1>, S<0, 2, 1>, S<0, 2, 1>, 1, 4, 8, 1, 1, 1, S<1, 32, 1, 8>, 8>; - -// clang-format on - -using DeviceGemmInstance = DeviceGemmStreamK; -using DeviceGemmInstance2 = DeviceGemmStreamK2; - -using ReferenceGemmInstance = ck::tensor_operation::host:: - ReferenceGemm; - -using ReferenceGemmInstanceGPU = ck::tensor_operation::device::ReferenceGemm; - -#include "run_gemm_example_streamk.inc" - -int main(int argc, char* argv[]) { return !run_gemm_streamk_example(argc, argv); } diff --git a/example/01_gemm/run_gemm_example_streamk.inc b/example/01_gemm/run_gemm_example_streamk.inc deleted file mode 100644 index 2761ce28e92..00000000000 --- a/example/01_gemm/run_gemm_example_streamk.inc +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. -// SPDX-License-Identifier: MIT - -#pragma once - -#include "ck/host_utility/device_prop.hpp" -#include "ck/tensor_operation/gpu/device/device_gemm_streamk.hpp" - -template -bool run_gemm(const ProblemType& problem_size, const ExecutionConfig& config) -{ -#if defined(BUILD_INT4_EXAMPLE) && defined(CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4) - static_assert(sizeof(ck::int4_t) == sizeof(int8_t)); -#endif - - using namespace ck::literals; - - auto M = problem_size.M; - auto N = problem_size.N; - auto K = problem_size.K; - auto StrideA = problem_size.StrideA; - auto StrideB = problem_size.StrideB; - auto StrideC = problem_size.StrideC; - - auto f_host_tensor_descriptor = - [](std::size_t row, std::size_t col, std::size_t stride, auto layout) { - if constexpr(std::is_same_v) - { - return HostTensorDescriptor({row, col}, {stride, 1_uz}); - } - else - { - return HostTensorDescriptor({row, col}, {1_uz, stride}); - } - }; - - auto f_get_default_stride = - [](std::size_t row, std::size_t col, ck::index_t stride, auto layout) { - if(stride == -1 || stride == 0) - { - // give a chance if stride is -1, return a default packed stride - if constexpr(std::is_same_v) - { - return static_cast(col); - } - else - { - return static_cast(row); - } - } - else - return static_cast(stride); - }; - - StrideA = f_get_default_stride(M, K, StrideA, ALayout{}); - StrideB = f_get_default_stride(K, N, StrideB, BLayout{}); - StrideC = f_get_default_stride(M, N, StrideC, CLayout{}); - - Tensor a_m_k(f_host_tensor_descriptor(M, K, StrideA, ALayout{})); - Tensor b_k_n(f_host_tensor_descriptor(K, N, StrideB, BLayout{})); - - switch(config.init_method) - { - case 0: - ck::utils::FillConstant{ck::type_convert(1.f)}(a_m_k); - ck::utils::FillConstant{ck::type_convert(1.f)}(b_k_n); - break; - case 1: - ck::utils::FillUniformDistributionIntegerValue{-5.f, 5.f}(a_m_k); - ck::utils::FillUniformDistributionIntegerValue{-5.f, 5.f}(b_k_n); - break; - case 2: - ck::utils::FillUniformDistribution{-1.f, 1.f}(a_m_k); - ck::utils::FillUniformDistribution{-1.f, 1.f}(b_k_n); - break; - case 3: - ck::utils::FillUniformDistributionIntegerValue{1.f, 1.f}(a_m_k); - ck::utils::FillUniformDistributionIntegerValue{-5.f, 5.f}(b_k_n); - break; - case 4: - ck::utils::FillUniformDistributionIntegerValue{-5.f, 5.f}(a_m_k); - ck::utils::FillUniformDistributionIntegerValue{1.f, 1.f}(b_k_n); - break; - case 5: - ck::utils::FillUniformDistributionIntegerValue{-2.f, 2.f}(a_m_k); - ck::utils::FillUniformDistributionIntegerValue{-2.f, 2.f}(b_k_n); - break; - default: - ck::utils::FillUniformDistribution{-0.1f, 0.1f}(a_m_k); - ck::utils::FillUniformDistribution{-0.1f, 0.1f}(b_k_n); - } - - Tensor c_m_n_host_result(f_host_tensor_descriptor(M, N, StrideC, CLayout{})); - Tensor c_m_n_device_result(f_host_tensor_descriptor(M, N, StrideC, CLayout{})); - Tensor c_m_n_device_ref_result(f_host_tensor_descriptor(M, N, StrideC, CLayout{})); - - std::cout << "a_m_k: " << a_m_k.mDesc << std::endl; - std::cout << "b_k_n: " << b_k_n.mDesc << std::endl; - std::cout << "c_m_n: " << c_m_n_host_result.mDesc << std::endl; - -#ifdef BUILD_INT4_EXAMPLE - DeviceMem a_m_k_device_buf(sizeof(KernelADataType) * a_m_k.mDesc.GetElementSpaceSize()); - DeviceMem b_k_n_device_buf(sizeof(KernelBDataType) * b_k_n.mDesc.GetElementSpaceSize()); - DeviceMem c_m_n_device_buf(sizeof(KernelCDataType) * - c_m_n_device_result.mDesc.GetElementSpaceSize()); - - const Tensor a_m_k_converted(a_m_k); - const Tensor b_k_n_converted(b_k_n); - - a_m_k_device_buf.ToDevice(a_m_k_converted.mData.data()); - b_k_n_device_buf.ToDevice(b_k_n_converted.mData.data()); -#else - DeviceMem a_m_k_device_buf(sizeof(ADataType) * a_m_k.mDesc.GetElementSpaceSize()); - DeviceMem b_k_n_device_buf(sizeof(BDataType) * b_k_n.mDesc.GetElementSpaceSize()); - DeviceMem c_m_n_device_buf(sizeof(CDataType) * c_m_n_device_result.mDesc.GetElementSpaceSize()); - DeviceMem c_m_n_device_ref_buf(sizeof(CDataType) * - c_m_n_device_ref_result.mDesc.GetElementSpaceSize()); - - a_m_k_device_buf.ToDevice(a_m_k.mData.data()); - b_k_n_device_buf.ToDevice(b_k_n.mData.data()); -#endif - DeviceMem workspace; - - auto a_element_op = AElementOp{}; - auto b_element_op = BElementOp{}; - auto c_element_op = CElementOp{}; - - using BaseStreamK = ck::tensor_operation::device::DeviceGemmStreamK; - - // do GEMM - static_assert(std::is_base_of::value && - std::is_base_of::value); - auto gemm = DeviceGemmInstance{}; - auto gemm2 = DeviceGemmInstance2{}; // instance for double rate mfma instruction - BaseStreamK* op_ptr = (ck::get_device_name() == "gfx950") ? static_cast(&gemm2) - : static_cast(&gemm); - - float ave_time = 0; - auto invoker_ptr = op_ptr->MakeInvokerPointer(); - - auto argument_ptr = op_ptr->MakeArgumentPointer( -#ifdef BUILD_INT4_EXAMPLE - static_cast(a_m_k_device_buf.GetDeviceBuffer()), - static_cast(b_k_n_device_buf.GetDeviceBuffer()), - static_cast(c_m_n_device_buf.GetDeviceBuffer()), -#else - static_cast(a_m_k_device_buf.GetDeviceBuffer()), - static_cast(b_k_n_device_buf.GetDeviceBuffer()), - static_cast(c_m_n_device_buf.GetDeviceBuffer()), -#endif - M, - N, - K, - StrideA, - StrideB, - StrideC, - a_element_op, - b_element_op, - c_element_op, - problem_size.NumSKBlocks); - - if(!op_ptr->IsSupportedArgument(argument_ptr.get())) - { - std::cerr << op_ptr->GetTypeString() << " does not support this problem" << std::endl; - - return true; - } - - auto argument = argument_ptr.get(); - std::size_t workspace_size = op_ptr->GetWorkSpaceSize(argument); - if(workspace_size != 0) - { - workspace.Realloc(workspace_size); - op_ptr->SetWorkSpacePointer(argument, workspace.GetDeviceBuffer()); - } - - ave_time = invoker_ptr->Run(argument_ptr.get(), StreamConfig{nullptr, config.time_kernel}); - - std::size_t flop = 2_uz * M * N * K; - std::size_t num_btype = - sizeof(ADataType) * M * K + sizeof(BDataType) * K * N + sizeof(CDataType) * M * N; - - float tflops = static_cast(flop) / 1.E9 / ave_time; - - float gb_per_sec = num_btype / 1.E6 / ave_time; - - std::cout << "Perf: " << ave_time << " ms, " << tflops << " TFlops, " << gb_per_sec << " GB/s, " - << op_ptr->GetTypeString() << std::endl; - - bool pass = true; - - if((config.do_verification == 1) || (config.do_verification == 3)) - { - // CPU verification - auto ref_gemm = ReferenceGemmInstance{}; - auto ref_invoker = ref_gemm.MakeInvoker(); - - auto ref_argument = ref_gemm.MakeArgument( - a_m_k, b_k_n, c_m_n_host_result, a_element_op, b_element_op, c_element_op); - - std::cout << "Running verification on CPU." << std::endl; - ref_invoker.Run(ref_argument); - -#ifdef BUILD_INT4_EXAMPLE - Tensor c_m_n_device_result_converted(c_m_n_host_result.mDesc); - - c_m_n_device_buf.FromDevice(c_m_n_device_result_converted.mData.data()); - - c_m_n_device_result = c_m_n_device_result_converted.CopyAsType(); - - return ck::utils::check_err(c_m_n_device_result_converted, c_m_n_host_result); -#else - c_m_n_device_buf.FromDevice(c_m_n_device_result.mData.data()); - - pass &= ck::utils::check_err(c_m_n_device_result, - c_m_n_host_result, - "Error: Incorrect results!", - get_rtol(), - get_atol()); -#endif - } - - if((config.do_verification == 2) || (config.do_verification == 3)) - { - // GPU verification - auto ref_gemm_gpu = ReferenceGemmInstanceGPU{}; - auto ref_invoker_gpu = ref_gemm_gpu.MakeInvoker(); - - auto ref_argument_gpu = ref_gemm_gpu.MakeArgument( - static_cast(a_m_k_device_buf.GetDeviceBuffer()), - static_cast(b_k_n_device_buf.GetDeviceBuffer()), - static_cast(c_m_n_device_ref_buf.GetDeviceBuffer()), - M, - N, - K, - a_element_op, - b_element_op, - c_element_op); - - std::cout << "Running verification on GPU." << std::endl; - ref_invoker_gpu.Run(ref_argument_gpu, StreamConfig{}); - - c_m_n_device_ref_buf.FromDevice(c_m_n_device_ref_result.mData.data()); - c_m_n_device_buf.FromDevice(c_m_n_device_result.mData.data()); - - pass &= ck::utils::check_err(c_m_n_device_result, - c_m_n_device_ref_result, - "Error: Incorrect results!", - get_rtol(), - get_atol()); - } - - return pass == true; -} - -bool run_gemm_streamk_example(int argc, char* argv[]) -{ - ProblemSizeStreamK problem_size; - ExecutionConfig config; - - return !parse_cmd_args(argc, argv, problem_size, config) || run_gemm(problem_size, config); -} diff --git a/example/01_gemm/run_gemm_example_streamk_v2.inc b/example/01_gemm/run_gemm_example_streamk_v2.inc deleted file mode 100644 index 4416c601785..00000000000 --- a/example/01_gemm/run_gemm_example_streamk_v2.inc +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. -// SPDX-License-Identifier: MIT - -#pragma once - -template -bool run_gemm(const ProblemType& problem_size, const ExecutionConfig& config) -{ -#if defined(BUILD_INT4_EXAMPLE) && defined(CK_EXPERIMENTAL_BIT_INT_EXTENSION_INT4) - static_assert(sizeof(ck::int4_t) == sizeof(int8_t)); -#endif - - using namespace ck::literals; - - auto M = problem_size.M; - auto N = problem_size.N; - auto K = problem_size.K; - auto StrideA = problem_size.StrideA; - auto StrideB = problem_size.StrideB; - auto StrideC = problem_size.StrideC; - auto Grid_size = problem_size.Grid_size; - auto Streamk_sel = problem_size.Streamk_sel; - - auto reduction_strategy = problem_size.reduction_strategy; - if(reduction_strategy == ck::StreamKReductionStrategy::Atomic) - { - std::cout << "Using Atomic reduction strategy" << std::endl; - } - else - { - std::cout << "Using Parallel reduction strategy" << std::endl; - } - - auto f_host_tensor_descriptor = - [](std::size_t row, std::size_t col, std::size_t stride, auto layout) { - if constexpr(std::is_same_v) - { - return HostTensorDescriptor({row, col}, {stride, 1_uz}); - } - else - { - return HostTensorDescriptor({row, col}, {1_uz, stride}); - } - }; - - auto f_get_default_stride = - [](std::size_t row, std::size_t col, ck::index_t stride, auto layout) { - if(stride == -1 || stride == 0) - { - // give a chance if stride is -1, return a default packed stride - if constexpr(std::is_same_v) - { - return static_cast(col); - } - else - { - return static_cast(row); - } - } - else - return static_cast(stride); - }; - - auto f_get_default_streamk_policy = [](ck::index_t streamk_sel) { - if(streamk_sel == -1) - { - return static_cast(4); - } - else - return static_cast(streamk_sel); - }; - - StrideA = f_get_default_stride(M, K, StrideA, ALayout{}); - StrideB = f_get_default_stride(K, N, StrideB, BLayout{}); - StrideC = f_get_default_stride(M, N, StrideC, CLayout{}); - - Streamk_sel = f_get_default_streamk_policy(Streamk_sel); - - Tensor a_m_k(f_host_tensor_descriptor(M, K, StrideA, ALayout{})); - Tensor b_k_n(f_host_tensor_descriptor(K, N, StrideB, BLayout{})); - - switch(config.init_method) - { - case 0: - a_m_k.GenerateTensorValue(GeneratorTensor_1{1}); - b_k_n.GenerateTensorValue(GeneratorTensor_1{1}); - break; - case 1: - a_m_k.GenerateTensorValue(GeneratorTensor_2{-2, 2}); - b_k_n.GenerateTensorValue(GeneratorTensor_2{-2, 2}); - break; - case 2: - a_m_k.GenerateTensorValue(GeneratorTensor_1{1}); - b_k_n.GenerateTensorValue(GeneratorTensor_2{-2, 2}); - break; - case 3: - a_m_k.GenerateTensorValue(GeneratorTensor_2{-2, 2}); - b_k_n.GenerateTensorValue(GeneratorTensor_1{1}); - break; - default: - a_m_k.GenerateTensorValue(GeneratorTensor_3{0.0, 1.0}); - b_k_n.GenerateTensorValue(GeneratorTensor_3{-0.5, 0.5}); - } - - Tensor c_m_n_host_result(f_host_tensor_descriptor(M, N, StrideC, CLayout{})); - Tensor c_m_n_device_result(f_host_tensor_descriptor(M, N, StrideC, CLayout{})); - Tensor c_m_n_device_ref_result(f_host_tensor_descriptor(M, N, StrideC, CLayout{})); - - std::cout << "a_m_k: " << a_m_k.mDesc << std::endl; - std::cout << "b_k_n: " << b_k_n.mDesc << std::endl; - std::cout << "c_m_n: " << c_m_n_host_result.mDesc << std::endl; - -#ifdef BUILD_INT4_EXAMPLE - DeviceMem a_m_k_device_buf(sizeof(KernelADataType) * a_m_k.mDesc.GetElementSpaceSize()); - DeviceMem b_k_n_device_buf(sizeof(KernelBDataType) * b_k_n.mDesc.GetElementSpaceSize()); - DeviceMem c_m_n_device_buf(sizeof(KernelCDataType) * - c_m_n_device_result.mDesc.GetElementSpaceSize()); - - const Tensor a_m_k_converted(a_m_k); - const Tensor b_k_n_converted(b_k_n); - - a_m_k_device_buf.ToDevice(a_m_k_converted.mData.data()); - b_k_n_device_buf.ToDevice(b_k_n_converted.mData.data()); -#else - DeviceMem a_m_k_device_buf(sizeof(ADataType) * a_m_k.mDesc.GetElementSpaceSize()); - DeviceMem b_k_n_device_buf(sizeof(BDataType) * b_k_n.mDesc.GetElementSpaceSize()); - DeviceMem c_m_n_device_buf(sizeof(CDataType) * c_m_n_device_result.mDesc.GetElementSpaceSize()); - DeviceMem c_m_n_device_ref_buf(sizeof(CDataType) * - c_m_n_device_ref_result.mDesc.GetElementSpaceSize()); - - a_m_k_device_buf.ToDevice(a_m_k.mData.data()); - b_k_n_device_buf.ToDevice(b_k_n.mData.data()); -#endif - DeviceMem workspace; - - auto a_element_op = AElementOp{}; - auto b_element_op = BElementOp{}; - auto c_element_op = CElementOp{}; - - // do GEMM - auto gemm = DeviceGemmV2_Streamk_Instance{}; - auto invoker = gemm.MakeInvoker(); - float ave_time = 0; - - auto argument = gemm.MakeArgument( -#ifdef BUILD_INT4_EXAMPLE - static_cast(a_m_k_device_buf.GetDeviceBuffer()), - static_cast(b_k_n_device_buf.GetDeviceBuffer()), - static_cast(c_m_n_device_buf.GetDeviceBuffer()), -#else - static_cast(a_m_k_device_buf.GetDeviceBuffer()), - static_cast(b_k_n_device_buf.GetDeviceBuffer()), - static_cast(c_m_n_device_buf.GetDeviceBuffer()), -#endif - M, - N, - K, - StrideA, - StrideB, - StrideC, - Streamk_sel, - Grid_size, - a_element_op, - b_element_op, - c_element_op, - reduction_strategy); - - if(!gemm.IsSupportedArgument(argument)) - { - std::cerr << gemm.GetTypeString() << " does not support this problem" << std::endl; - - return true; - } - - std::size_t workspace_size = gemm.GetWorkSpaceSize(&argument); - if(workspace_size != 0) - { - workspace.Realloc(workspace_size); - gemm.SetWorkSpacePointer(&argument, workspace.GetDeviceBuffer()); - } - - bool pass = true; - if((config.do_verification == 1) || (config.do_verification == 3)) - { - auto ref_gemm = ReferenceGemmInstance{}; - auto ref_invoker = ref_gemm.MakeInvoker(); - - auto ref_argument = ref_gemm.MakeArgument( - a_m_k, b_k_n, c_m_n_host_result, PassThrough{}, PassThrough{}, PassThrough{}); - - ref_invoker.Run(ref_argument); - - ave_time = invoker.Run(argument, StreamConfig{nullptr, false, 1}); -#ifdef BUILD_INT4_EXAMPLE - Tensor c_m_n_device_result_converted(c_m_n_host_result.mDesc); - - c_m_n_device_buf.FromDevice(c_m_n_device_result_converted.mData.data()); - - c_m_n_device_result = c_m_n_device_result_converted.CopyAsType(); - - return ck::utils::check_err(c_m_n_device_result_converted, c_m_n_host_result); -#else - c_m_n_device_buf.FromDevice(c_m_n_device_result.mData.data()); - - pass &= ck::utils::check_err(c_m_n_device_result, - c_m_n_host_result, - "Error: Incorrect results!", - get_rtol(), - get_atol()); -#endif - } - - if((config.do_verification == 2) || (config.do_verification == 3)) - { - // GPU verification - auto ref_gemm_gpu = ReferenceGemmInstanceGPU{}; - auto ref_invoker_gpu = ref_gemm_gpu.MakeInvoker(); - - auto ref_argument_gpu = ref_gemm_gpu.MakeArgument( - static_cast(a_m_k_device_buf.GetDeviceBuffer()), - static_cast(b_k_n_device_buf.GetDeviceBuffer()), - static_cast(c_m_n_device_ref_buf.GetDeviceBuffer()), - M, - N, - K, - a_element_op, - b_element_op, - c_element_op); - - std::cout << "Running verification on GPU." << std::endl; - ref_invoker_gpu.Run(ref_argument_gpu, StreamConfig{}); - - c_m_n_device_ref_buf.FromDevice(c_m_n_device_ref_result.mData.data()); - c_m_n_device_buf.FromDevice(c_m_n_device_result.mData.data()); - - pass &= ck::utils::check_err(c_m_n_device_result, - c_m_n_device_ref_result, - "Error: Incorrect results!", - get_rtol(), - get_atol()); - } - - if(config.time_kernel) - { - ave_time = invoker.Run(argument, StreamConfig{nullptr, config.time_kernel}); - - std::size_t flop = 2_uz * M * N * K; - std::size_t num_btype = - sizeof(ADataType) * M * K + sizeof(BDataType) * K * N + sizeof(CDataType) * M * N; - - float tflops = static_cast(flop) / 1.E9 / ave_time; - - float gb_per_sec = num_btype / 1.E6 / ave_time; - - std::cout << "Perf: " << ave_time << " ms, " << tflops << " TFlops, " << gb_per_sec - << " GB/s, " << gemm.GetTypeString() - << (reduction_strategy == ck::StreamKReductionStrategy::Atomic ? " (Atomic)" - : " (Reduction)") - << std::endl; - } - return pass; -} - -bool run_gemm_universal_streamk_example(int argc, char* argv[]) -{ - ProblemSizeStreamK_universal problem_size; - ExecutionConfig config; - - return !parse_cmd_args(argc, argv, problem_size, config) || run_gemm(problem_size, config); -} diff --git a/example/32_batched_gemm_scale_softmax_gemm/grouped_query_attention_forward_wmma_fp16.cpp b/example/32_batched_gemm_scale_softmax_gemm/grouped_query_attention_forward_wmma_fp16.cpp index 66b2aa8508f..4b714a5f9eb 100644 --- a/example/32_batched_gemm_scale_softmax_gemm/grouped_query_attention_forward_wmma_fp16.cpp +++ b/example/32_batched_gemm_scale_softmax_gemm/grouped_query_attention_forward_wmma_fp16.cpp @@ -3,7 +3,7 @@ /* Grouped Query Attention, -Ainslie, Joshua, James Lee-Thorp, Michiel de Jong, Yury Zemlyanskiy, Federico Lebrón, and Sumit +Ainslie, Joshua, James Lee-Thorp, Michiel de Jong, Yury Zemlyanskiy, Federico Lebron, and Sumit Sanghai. "GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints." arXiv, May 22, 2023. https://doi.org/10.48550/arXiv.2305.13245. diff --git a/example/64_fpAintB_gemm/fp16int8_gemm_wmma.cpp b/example/64_fpAintB_gemm/fp16int8_gemm_wmma.cpp index 450d1b643f9..dd7b43fff64 100644 --- a/example/64_fpAintB_gemm/fp16int8_gemm_wmma.cpp +++ b/example/64_fpAintB_gemm/fp16int8_gemm_wmma.cpp @@ -6,7 +6,7 @@ #include "ck/tensor_operation/gpu/device/impl/device_fpAintB_gemm_wmma.hpp" // Implementation follows the paper: -// Kim, Young Jin, Rawn Henry, Raffy Fahim, and Hany Hassan Awadalla. "Who Says Elephants Can’t Run: +// Kim, Young Jin, Rawn Henry, Raffy Fahim, and Hany Hassan Awadalla. "Who Says Elephants Can't Run: // Bringing Large Scale MoE Models into Cloud Scale Production." arXiv, November 17, 2022. // https://doi.org/10.48550/arXiv.2211.10017. Assume weight (Matrix B) is add preprocess to // unsigned. diff --git a/example/ck_tile/01_fmha/CMakeLists.txt b/example/ck_tile/01_fmha/CMakeLists.txt index 0650bd3de01..c1c731a3871 100644 --- a/example/ck_tile/01_fmha/CMakeLists.txt +++ b/example/ck_tile/01_fmha/CMakeLists.txt @@ -2,8 +2,8 @@ # SPDX-License-Identifier: MIT set(INST_TARGETS ${SUPPORTED_GPU_TARGETS}) -# Currently only gfx9 and gfx12 archs are supported by FMHA -list(FILTER INST_TARGETS INCLUDE REGEX "gfx9|gfx12") +# Currently only gfx9, gfx11, and gfx12 archs are supported by FMHA +list(FILTER INST_TARGETS INCLUDE REGEX "gfx9|gfx1[12]") if(NOT INST_TARGETS) message(WARNING "Skipping Tile Engine FMHA compilation: No supported GPU targets (gfx9, gfx11, gfx12) found in SUPPORTED_GPU_TARGETS: ${SUPPORTED_GPU_TARGETS}") return() @@ -64,7 +64,7 @@ set(FMHA_BWD_CODE_GEN_COMMON_ARGS # there is no corresponding instance for parameters). if(BUILD_TESTING) # Filters are in the order of FMHA_FWD_KNOWN_APIS: fwd,fwd_splitkv_combine@fwd_splitkv,fwd_appendkv,pagedkv_prefill - list(APPEND FMHA_FWD_CODE_GEN_COMMON_ARGS --filter *_nlogits*_nskip*_nsink*,*@*_nlogits*_nbias*_nsink*,*,*_nlogits*_nskip*_pagedkv*) + list(APPEND FMHA_FWD_CODE_GEN_COMMON_ARGS --filter *_nlogits*_nskip*,*@*_nlogits*_nbias*,*,*_nlogits*_nskip*_pagedkv*) endif() # generate a list of kernels, but not actually emit files at config sta diff --git a/example/ck_tile/01_fmha/codegen/cpp_symbol_map.py b/example/ck_tile/01_fmha/codegen/cpp_symbol_map.py index 79fe6492a67..61e40716814 100644 --- a/example/ck_tile/01_fmha/codegen/cpp_symbol_map.py +++ b/example/ck_tile/01_fmha/codegen/cpp_symbol_map.py @@ -144,6 +144,7 @@ def get_mask_cpp_check_expr(mask: str) -> str: "qs": "ck_tile::BlockFmhaPipelineQSKSVS", "qr_async_trload": "ck_tile::BlockFmhaPipelineQRKSVSAsyncTrload", "qr_async_trload_v3": "ck_tile::BlockFmhaFwdV3Pipeline", + "qr_tdm": "ck_tile::BlockFmhaPipelineQRKSVSTdm", } PIPELINE_ENUM_MAP = { @@ -155,6 +156,7 @@ def get_mask_cpp_check_expr(mask: str) -> str: "qr_pagedkv": "ck_tile::BlockFmhaPipelineEnum::QRKSVS", "qr_async_trload": "ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD", "qr_async_trload_v3": "ck_tile::BlockFmhaPipelineEnum::QRKSVS_ASYNC_TRLOAD_V3", + "qr_tdm": "ck_tile::BlockFmhaPipelineEnum::QRKSVS_TDM", } BOOL_MAP = { diff --git a/example/ck_tile/01_fmha/codegen/ops/fmha_batch_prefill.py b/example/ck_tile/01_fmha/codegen/ops/fmha_batch_prefill.py index 72d5970bbfd..b687cb97612 100644 --- a/example/ck_tile/01_fmha/codegen/ops/fmha_batch_prefill.py +++ b/example/ck_tile/01_fmha/codegen/ops/fmha_batch_prefill.py @@ -32,6 +32,14 @@ preprocessor_check="defined(__gfx94__) || defined(__gfx950__)", ) +# Architecture trait for tiles that are only valid / only wanted on gfx942 +# (e.g. MI308). Used to gate a tile's device-side compilation so it is skipped +# on other archs +GFX942_ARCH = ArchTrait( + "gfx942", + preprocessor_check="defined(__gfx942__)", +) + DTYPE_BITS = { "fp32": 32, "fp16": 16, @@ -167,6 +175,7 @@ FMHA_FWD_API = """ #include #include +#include namespace {{ bool get_num_cus(unsigned& num_cu) {{ @@ -206,6 +215,11 @@ return r; }} + // Host-side arch identity, used to mirror device-only arch gates (e.g. tiles + // restricted via F_arch) in the host dispatch so we never select an + // arm whose device image was elided for this arch. + [[maybe_unused]] const std::string device_name = ck_tile::get_device_name(); + [[maybe_unused]] auto get_num_blocks = [&](unsigned kM0) {{ return get_num_thread_blocks(a.batch, a.nhead_q, a.max_seqlen_q, kM0); }}; @@ -226,7 +240,7 @@ """ FMHA_FWD_API_INNER_DISPATCH = """ {F_if}((t.is_group_mode == {F_mode}) && (t.is_v_rowmajor == {F_vlayout}) && (t.has_logits_soft_cap == {F_logits}) && ({F_mask_check}) && (t.bias_type == {F_bias_check}) && (t.has_lse == {F_lse}) && (t.has_dropout == {F_dropout}) && (t.qscale_type == {F_qscale_check}) && (t.has_sink == {F_sink}) && - ({F_scheck}) && ({F_skcheck}) && ({F_dcheck}) && ({F_dvcheck}) && ({F_constraint}) && (t.kv_memory_layout == {F_kv_memory_layout}) && (t.kv_lookup_table == {F_kv_lookup_table}) && (t.page_size == {F_page_size}) && (fmha_batch_prefill_select_kv_load_mode(a.page_block_size, {F_bn0}, a.num_total_pages, a.batch_stride_k, kElementBytes) == {F_kv_load_mode})) {{ + ({F_scheck}) && ({F_skcheck}) && ({F_dcheck}) && ({F_dvcheck}) && ({F_constraint}) && ({F_arch_host}) && (t.kv_memory_layout == {F_kv_memory_layout}) && (t.kv_lookup_table == {F_kv_lookup_table}) && (t.page_size == {F_page_size}) && (fmha_batch_prefill_select_kv_load_mode(a.page_block_size, {F_bn0}, a.num_total_pages, a.batch_stride_k, a.batch_stride_v, kElementBytes, a.k_ptr, a.v_ptr) == {F_kv_load_mode})) {{ using trait_ = fmha_fwd_batch_prefill_traits_<{F_hdim}, {F_dtype}, {F_mode}, {F_bm0}, {F_bn0}, {F_bk0}, {F_bn1}, {F_bk1}, {F_bk0max}, {F_vlayout}, {F_pipeline_enum}, {F_logits}, {F_mask}, {F_bias}, {F_lse}, {F_dropout}, {F_qscale}, {F_spad}, {F_skpad}, {F_dpad}, {F_dvpad}, false, false, {F_sink}, {F_page_size}, {F_kv_memory_layout}, {F_kv_lookup_table}, {F_kv_load_mode}>; return fmha_batch_prefill_(s, a); }} @@ -277,6 +291,9 @@ class FmhaFwdApiTrait: kv_lookup_table: str page_size: int = 1 # page block size use_global_load: bool = False # use global_load_lds_* for >2GB KV cache + # Host-side arch predicate mirroring a tile's device-only F_arch gate. + # "true" means arch-agnostic (no host restriction). + arch_host: str = "true" @property def name(self) -> str: @@ -486,6 +503,7 @@ def api(self) -> str: F_dcheck=trait.dcheck, F_dvcheck=trait.dvcheck, F_constraint=trait.constraint, + F_arch_host=trait.arch_host, F_spad=BOOL_MAP[trait.spad], F_skpad=BOOL_MAP[trait.skpad], F_dpad=BOOL_MAP[trait.dpad], @@ -547,6 +565,11 @@ class FmhaFwdTileSize: F_wk1: int # gemm1 warp size along k F_occupancy: int # occupancy, -1 will let pipeline decide the occupancy, other value will overwrite occupancy F_constraint: CppConstraint = field(default_factory=lambda: CppConstraint()) + # Optional compile-time arch guard for this tile's device code. When set, + # the kernel body is only instantiated during the device pass for matching + # archs (host pass always keeps it so the host symbol still exists). This is + # independent from F_constraint, which is a runtime dispatch predicate. + F_arch: Optional[ArchTrait] = None @property def name(self) -> str: @@ -619,11 +642,20 @@ def template(self) -> str: F_page_size=self.F_page_size, F_sink=BOOL_MAP[self.F_pipeline.F_sink], F_kv_load_mode=KV_LOAD_MODE_ENUM_MAP[self.F_use_global_load], - F_arch_check=CDNA3_PLUS_ARCH.preprocessor_check - if self.F_use_global_load - else "true", + F_arch_check=self._arch_check(), ) + def _arch_check(self) -> str: + # Combine any arch guards that apply to this kernel. + checks = [] + if self.F_use_global_load: + checks.append(CDNA3_PLUS_ARCH.preprocessor_check) + if self.F_tile.F_arch is not None: + checks.append(self.F_tile.F_arch.preprocessor_check) + if not checks: + return "true" + return " && ".join(f"({c})" for c in checks) + @property def name(self) -> str: # TODO: we don't encode idx here @@ -668,6 +700,11 @@ def api_trait(self) -> FmhaFwdApiTrait: kv_lookup_table=self.F_pipeline.F_kv_lookup_table, page_size=self.F_page_size, use_global_load=self.F_use_global_load, + arch_host=( + self.F_tile.F_arch.device_name_check + if self.F_tile.F_arch is not None + else "true" + ), ) @@ -677,12 +714,18 @@ def get_hdim_tile_size_dict(dtype: str) -> Optional[dict]: if dtype in ["fp16", "bf16"]: return { 128 : [FmhaFwdTileSize(128, 128, 32, 128, 32, 128, 4, 1, 1, 4, 1, 1, 32, 32, 16, 32, 32, 16, -1)], - 256 : [FmhaFwdTileSize(128, 128, 32, 256, 32, 256, 4, 1, 1, 4, 1, 1, 32, 32, 16, 32, 32, 16, -1)], + 256 : [ + FmhaFwdTileSize(128, 32, 16, 256, 16, 256, 4, 1, 1, 4, 1, 1, 32, 32, 16, 32, 32, 16, 2, CppConstraint("num_cus < 128"), GFX942_ARCH), + FmhaFwdTileSize(128, 128, 32, 256, 32, 256, 4, 1, 1, 4, 1, 1, 32, 32, 16, 32, 32, 16, -1), + ], } # fmt: skip elif dtype in ["fp8bf16"]: return { 128 : [FmhaFwdTileSize(128, 128, 32, 128, 32, 128, 4, 1, 1, 4, 1, 1, 32, 32, 32, 32, 32, 32, -1)], - 256 : [FmhaFwdTileSize(128, 128, 32, 256, 32, 256, 4, 1, 1, 4, 1, 1, 32, 32, 32, 32, 32, 32, -1)], + 256 : [ + FmhaFwdTileSize(128, 64, 32, 256, 32, 256, 4, 1, 1, 4, 1, 1, 32, 32, 32, 32, 32, 32, 2, CppConstraint("num_cus < 128"), GFX942_ARCH), + FmhaFwdTileSize(128, 128, 32, 256, 32, 256, 4, 1, 1, 4, 1, 1, 32, 32, 32, 32, 32, 32, -1), + ], } # fmt: skip else: return None diff --git a/example/ck_tile/01_fmha/codegen/ops/fmha_bwd.py b/example/ck_tile/01_fmha/codegen/ops/fmha_bwd.py index 8079b3d8581..dae78e243ce 100644 --- a/example/ck_tile/01_fmha/codegen/ops/fmha_bwd.py +++ b/example/ck_tile/01_fmha/codegen/ops/fmha_bwd.py @@ -28,6 +28,13 @@ FMHA_BWD_KERNEL_HEADER = """// SPDX-License-Identifier: MIT // Copyright (c) 2018-2025, Advanced Micro Devices, Inc. All rights reserved.\n // auto generated by generate.py +#if defined(__HIP_DEVICE_COMPILE__) && \\ + (defined(__gfx1100__) || defined(__gfx1101__) || defined(__gfx1102__) || \\ + defined(__gfx1103__) || defined(__gfx1150__) || defined(__gfx1151__) || \\ + defined(__gfx1152__) || defined(__gfx1153__) || defined(__gfx11_generic__)) +#undef CK_TILE_USE_AMD_BUFFER_ATOMIC_ADD_FLOAT +#define CK_TILE_USE_AMD_BUFFER_ATOMIC_ADD_FLOAT 1 +#endif #include "fmha_bwd.hpp" """ diff --git a/example/ck_tile/01_fmha/codegen/ops/fmha_fwd.py b/example/ck_tile/01_fmha/codegen/ops/fmha_fwd.py index 38ba926b4e9..e9efbe599e0 100644 --- a/example/ck_tile/01_fmha/codegen/ops/fmha_fwd.py +++ b/example/ck_tile/01_fmha/codegen/ops/fmha_fwd.py @@ -310,7 +310,7 @@ def name(self) -> str: def scheck(self) -> str: if self.mode == "group": return "true/*group mode spad always true*/" # group mode only generate spad/skpad == true - if self.pipeline_tag in ["qr_async", "qr_async_trload", "qr_async_trload_v3"]: + if self.pipeline_tag in ["qr_async", "qr_async_trload", "qr_async_trload_v3", "qr_tdm"]: if self.spad == "t": return "true" # always support else: @@ -345,7 +345,7 @@ def skcheck(self) -> str: return f"true /*a.seqlen_k % {self.bn0} != 0*/" # TODO: order of get_pipelines() matters! (ugly) else: return f"(a.cu_seqlen_k_ptr == nullptr) && (a.seqlen_k != 0 && a.seqlen_k % {self.bn0} == 0)" - elif self.pipeline_tag in ["qr_async_trload", "qr_async_trload_v3"]: + elif self.pipeline_tag in ["qr_async_trload", "qr_async_trload_v3", "qr_tdm"]: if self.skpad == "t": return "true" else: @@ -355,18 +355,12 @@ def skcheck(self) -> str: @property def dcheck(self) -> str: - if self.pipeline_tag == "qr_async": - vec = int((32 * 4) / DTYPE_BITS[self.dtype]) - if self.dpad == "t": - return f"a.hdim_q % {vec} == 0" - else: - assert False - elif self.pipeline_tag == "qr_hpad": + if self.pipeline_tag == "qr_hpad": if self.dpad == "t": return "a.hdim_q % 8 == 0" else: assert False - elif self.pipeline_tag in ["qr", "qs", "qr_async_trload", "qr_async_trload_v3"]: + elif self.pipeline_tag in ["qr", "qs", "qr_async", "qr_async_trload", "qr_async_trload_v3", "qr_tdm"]: bk0submax = K0_MAX_SUBMAX_MAP[self.bk0max] if self.dpad == "t": return f"true /*a.hdim_q % {bk0submax} != 0*/" # TODO: order of get_pipelines() matters! (ugly) @@ -377,18 +371,12 @@ def dcheck(self) -> str: @property def dvcheck(self) -> str: - if self.pipeline_tag == "qr_async": - vec = int((32 * 4) / DTYPE_BITS[self.dtype]) - if self.dvpad == "t": - return f"a.hdim_v % {vec} == 0" - else: - assert False - elif self.pipeline_tag == "qr_hpad": + if self.pipeline_tag == "qr_hpad": if self.dvpad == "t": return "a.hdim_v % 8 == 0" else: assert False - elif self.pipeline_tag in ["qr", "qs", "qr_async_trload", "qr_async_trload_v3"]: + elif self.pipeline_tag in ["qr", "qs", "qr_async", "qr_async_trload", "qr_async_trload_v3", "qr_tdm"]: bk0submax = K0_MAX_SUBMAX_MAP[self.bk0max] if self.dvpad == "t": return f"true /*a.hdim_v % {bk0submax} != 0*/" # TODO: order of get_pipelines() matters! (ugly) @@ -1046,6 +1034,9 @@ def get_pipelines( pipelines.append(FmhaFwdPipeline("qr", "row", "f", "f", "f", "f", logits, bias, lse, dropout, qscale, mask, skip, "f", sink)) # fmt: skip pipelines.append(FmhaFwdPipeline("qr", "row", "t", "t", "t", "t", logits, bias, lse, dropout, qscale, mask, skip, "f", sink)) # fmt: skip else: + # skpad=f + dpad=t/dvpad=t variant covers padded head dims (e.g. d=16, d=160) + # when seqlen_k is divisible by bn0. Restored after #6526 changed it to + # "f","f","f","f", which left those cases with no dispatchable qr_async kernel. pipelines.append(FmhaFwdPipeline("qr_async", "row", "t", "f", "t", "t", logits, bias, lse, dropout, qscale, mask, skip, "f", sink)) # fmt: skip pipelines.append(FmhaFwdPipeline("qr_async", "row", "t", "t", "t", "t", logits, bias, lse, dropout, qscale, mask, skip, "f", sink)) # fmt: skip if receipt == 1 and bias != "bias": @@ -1060,9 +1051,11 @@ def get_pipelines( ["f", "t"], ): if hdim == 64: - pipelines.append(FmhaFwdPipeline("qr", "row", "t", "f", "t", "t", logits, bias, "f", "f", qscale, mask, "f", "f", sink)) # fmt: skip + pipelines.append(FmhaFwdPipeline("qr", "row", "f", "f", "f", "f", logits, bias, "f", "f", qscale, mask, "f", "f", sink)) # fmt: skip pipelines.append(FmhaFwdPipeline("qr", "row", "t", "t", "t", "t", logits, bias, "f", "f", qscale, mask, "f", "f", sink)) # fmt: skip else: + # skpad=f + dpad=t/dvpad=t variant covers padded head dims when seqlen_k is + # divisible by bn0. Restored after #6526 changed it to "f","f","f","f". pipelines.append(FmhaFwdPipeline("qr_async", "row", "t", "f", "t", "t", logits, bias, "f", "f", qscale, mask, "f", "f", sink)) # fmt: skip pipelines.append(FmhaFwdPipeline("qr_async", "row", "t", "t", "t", "t", logits, bias, "f", "f", qscale, mask, "f", "f", sink)) # fmt: skip return pipelines @@ -1169,6 +1162,9 @@ def get_pipelines( ): pipelines.append(FmhaFwdPipeline("qr", "col", "f", "f", "f", "f", logits, bias, lse, dropout, qscale, mask, "f", "f", sink)) # fmt: skip pipelines.append(FmhaFwdPipeline("qr", "col", "t", "t", "t", "t", logits, bias, lse, dropout, qscale, mask, "f", "f", sink)) # fmt: skip + if hdim > 64 and dtype in cls._DT_MXFP8: + pipelines.append(FmhaFwdPipeline("qr_async", "col", "f", "f", "f", "f", logits, bias, lse, dropout, qscale, mask, "f", "f", sink)) # fmt: skip + pipelines.append(FmhaFwdPipeline("qr_async", "col", "t", "t", "t", "t", logits, bias, lse, dropout, qscale, mask, "f", "f", sink)) # fmt: skip return pipelines @@ -1355,7 +1351,8 @@ def get_hdim_tile_size_dict(cls, dtype: str) -> Optional[dict]: # bm0, bn0, bk0, bn1, bk1, ( 32, 32) : [FmhaFwdTileSize( 64, 64, 32, 32, 32, 64, 4, 1, 1, 4, 1, 1, 16, 16, 32, 16, 16, 32, -1)], ( 64, 64) : [FmhaFwdTileSize( 64, 64, 32, 64, 32, 64, 4, 1, 1, 4, 1, 1, 16, 16, 32, 16, 16, 32, -1)], - (128, 128) : [FmhaFwdTileSize( 64, 64, 32, 128, 32, 128, 4, 1, 1, 4, 1, 1, 16, 16, 32, 16, 16, 32, -1)], + (128, 128) : [FmhaFwdTileSize( 64, 64, 32, 128, 32, 128, 4, 1, 1, 4, 1, 1, 16, 16, 32, 16, 16, 32, -1, CppConstraint("a.max_seqlen_q < 2048")), + FmhaFwdTileSize(128, 64, 32, 128, 32, 128, 4, 1, 1, 4, 1, 1, 16, 16, 32, 16, 16, 32, -1)], (192, 128) : [FmhaFwdTileSize( 64, 64, 32, 128, 32, 256, 4, 1, 1, 4, 1, 1, 16, 16, 32, 16, 16, 32, -1)], (256, 256) : [FmhaFwdTileSize( 64, 64, 32, 256, 32, 256, 4, 1, 1, 4, 1, 1, 16, 16, 32, 16, 16, 32, -1)], } # fmt: skip @@ -1381,6 +1378,24 @@ def get_pipelines( pipelines = [] if dtype in cls._DT_FP16_BF16: qscale = "no" + # qr_tdm: gfx1250 TDM pipeline, preferred for d=128. + # Emitted first so runtime dispatcher selects qr_tdm over qr + # when both match (dispatch order = list order in generated code). + # NOTE: dropout is not yet implemented in qr_tdm — only emit + # dropout="f" so dropout workloads fall through to qr. + if hdim == 128 and hdim_v == 128: + for logits, mask, bias, lse, sink in itertools.product( + ["t", "f"], + get_mask_map(mask_impl).keys(), + BIAS_MAP.keys(), + ["t", "f"], + ["t", "f"], + ): + pipelines.append(FmhaFwdPipeline("qr_tdm", "row", "f", "f", "f", "f", logits, bias, lse, "f", qscale, mask, "f", "f", sink)) # fmt: skip + pipelines.append(FmhaFwdPipeline("qr_tdm", "row", "f", "f", "t", "t", logits, bias, lse, "f", qscale, mask, "f", "f", sink)) # fmt: skip + + # qr: generic pipeline fallback for trait combos not covered by + # qr_tdm (e.g., bias, dropout, skip, d!=128). for logits, mask, bias, lse, dropout, skip, sink in itertools.product( ["t", "f"], get_mask_map(mask_impl).keys(), @@ -1465,10 +1480,9 @@ def fit(problem_ctx: ProblemContext, kernel_ctx: KernelContext) -> bool: def fit(problem_ctx: ProblemContext, kernel_ctx: KernelContext) -> bool: cond = problem_ctx.dtype in ["fp16", "bf16"] cond &= kernel_ctx.pipeline.F_vlayout == "row" - cond &= kernel_ctx.pipeline.F_bias in ["no", "alibi"] + cond &= kernel_ctx.pipeline.F_bias in ["no", "alibi", "bias"] cond &= kernel_ctx.pipeline.F_qscale == "no" cond &= kernel_ctx.pipeline.F_skip == "f" - cond &= kernel_ctx.pipeline.F_sink == "f" return cond return Product(name="Flash attention integration", rule=fit) diff --git a/example/ck_tile/01_fmha/codegen/ops/fmha_fwd_splitkv.py b/example/ck_tile/01_fmha/codegen/ops/fmha_fwd_splitkv.py index 849f463afa0..ed025dcf5fc 100644 --- a/example/ck_tile/01_fmha/codegen/ops/fmha_fwd_splitkv.py +++ b/example/ck_tile/01_fmha/codegen/ops/fmha_fwd_splitkv.py @@ -128,7 +128,7 @@ namespace {{ template void run_instance(const ck_tile::stream_config& s, fmha_fwd_splitkv_args a) {{ - if constexpr ({F_hdim} == 128 && {F_bias} == ck_tile::BlockAttentionBiasEnum::NO_BIAS + if constexpr ({F_bias} == ck_tile::BlockAttentionBiasEnum::NO_BIAS && (std::is_same_v<{F_mask}, ck_tile::SimplifiedGenericAttentionMask> || std::is_same_v<{F_mask}, FmhaMasks::NoMask>)) {{ if (a.max_seqlen_q == 1 && a.nhead_k < a.nhead_q) {{ @@ -283,7 +283,7 @@ """ FMHA_FWD_SPLITKV_API_INNER_DISPATCH = """{F_if}((t.is_group_mode == {F_mode}) && (t.is_v_rowmajor == {F_vlayout}) && (t.has_logits_soft_cap == {F_logits}) && ({F_mask_check}) && (t.bias_type == {F_bias_check}) && (t.do_fp8_static_quant == {F_squant}) && - ((a.block_table_ptr != nullptr) == {F_pagedkv}) && (t.has_sink == {F_sink}) && ({F_scheck}) && ({F_skcheck}) && ({F_dcheck}) && ({F_dvcheck})) {{ + ((a.block_table_ptr != nullptr) == {F_pagedkv}) && (t.has_sink == {F_sink}) && ({F_scheck}) && ({F_seqtune}) && ({F_skcheck}) && ({F_dcheck}) && ({F_dvcheck})) {{ using traits_ = fmha_fwd_splitkv_traits_<{F_hdim}, {F_dtype}, {F_mode}, {F_bm0}, {F_bn0}, {F_bk0}, {F_bn1}, {F_bk1}, {F_bk0max}, {F_vlayout}, {F_pipeline_enum}, {F_logits}, {F_mask}, {F_bias}, true, {F_squant}, {F_pagedkv},{F_sink}, {F_spad}, {F_skpad}, {F_dpad}, {F_dvpad}>; // get combine kernel tile sizes @@ -364,6 +364,14 @@ def scheck(self) -> str: else: assert False + def seqtune(self, max_bm0: int) -> str: + if self.bm0 == max_bm0: + return "true/*fall back to largest tile*/" + else: + if self.mode == "group": + return f"a.max_seqlen_q <= {self.bm0}" + return f"a.seqlen_q <= {self.bm0}" + @property def skcheck(self) -> str: if self.mode == "group": @@ -561,6 +569,7 @@ def api(self) -> str: for i_dtype, (dtype, pool_by_dtype) in enumerate(pool_by_arch.items()): per_hdim_case = str() for i_hdim, (hdim, pool_by_hdim) in enumerate(pool_by_dtype.items()): + max_bm0 = max((t.bm0 for t in pool_by_hdim), default=0) inners = str() for i_trait, trait in enumerate(pool_by_hdim): inners += FMHA_FWD_SPLITKV_API_INNER_DISPATCH.format( @@ -579,6 +588,7 @@ def api(self) -> str: F_pagedkv=BOOL_MAP[trait.pagedkv], F_sink=BOOL_MAP[trait.sink], F_scheck=trait.scheck, + F_seqtune=trait.seqtune(max_bm0), F_skcheck=trait.skcheck, F_dcheck=trait.dcheck, F_dvcheck=trait.dvcheck, @@ -763,6 +773,7 @@ def get_pipelines(dtype, hdim, mask_impl) -> List[FmhaFwdSplitKVPipeline]: pipelines.append(Pipeline("qr", "row", "t", "f", "f", "f", logits, bias, "t", squant, pagedkv, sink, mask)) # fmt: skip pipelines.append(Pipeline("qr", "row", "t", "t", "f", "f", logits, bias, "t", squant, pagedkv, sink, mask)) # fmt: skip pipelines.append(Pipeline("qr", "row", "t", "t", "t", "t", logits, bias, "t", squant, pagedkv, sink, mask)) # fmt: skip + pipelines.append(Pipeline("qr_nwarp_sshuffle", "row", "t", "t", "f", "f", logits, bias, "t", squant, pagedkv, sink, mask)) # fmt: skip elif dtype in ["fp8", "bf8"]: for logits, mask, bias in itertools.product( ["t", "f"], get_mask_map(mask_impl).keys(), BIAS_MAP.keys() @@ -846,11 +857,15 @@ class KernelComponentFactoryGfx11(KernelComponentFactoryBase): def get_hdim_tile_size_dict(dtype: str) -> Optional[dict]: if dtype in ["fp16", "bf16"]: return { - # bm0, bn0, bk0, bn1, bk1, - "32" : FmhaFwdTileSize( 64, 64, 16, 32, 32, 32, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1), - "64" : FmhaFwdTileSize( 64, 64, 32, 64, 32, 64, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1), - "128": FmhaFwdTileSize( 64, 64, 32, 128, 32, 128, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1), - "256": FmhaFwdTileSize( 64, 64, 32, 256, 32, 256, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1), + # bm0, bn0, bk0, bn1, bk1, + "32" : [FmhaFwdTileSize( 16, 64, 16, 32, 32, 32, 1, 2, 1, 1, 2, 1, 16, 16, 16, 16, 16, 16, -1), + FmhaFwdTileSize( 64, 64, 16, 32, 32, 32, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1)], + "64" : [FmhaFwdTileSize( 16, 64, 32, 64, 32, 64, 1, 4, 1, 1, 4, 1, 16, 16, 16, 16, 16, 16, -1), + FmhaFwdTileSize( 64, 64, 32, 64, 32, 64, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1)], + "128": [FmhaFwdTileSize( 16, 64, 32, 128, 32, 128, 1, 4, 1, 1, 4, 1, 16, 16, 16, 16, 16, 16, -1), + FmhaFwdTileSize( 64, 64, 32, 128, 32, 128, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1)], + "256": [FmhaFwdTileSize( 16, 64, 32, 256, 32, 256, 1, 4, 1, 1, 4, 1, 16, 16, 16, 16, 16, 16, -1), + FmhaFwdTileSize( 64, 64, 32, 256, 32, 256, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1)], } # fmt: skip else: return None @@ -863,11 +878,15 @@ class KernelComponentFactoryGfx12(KernelComponentFactoryBase): def get_hdim_tile_size_dict(dtype: str) -> Optional[dict]: if dtype in ["fp16", "bf16"]: return { - # bm0, bn0, bk0, bn1, bk1, - "32" : FmhaFwdTileSize( 64, 64, 16, 32, 32, 32, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1), - "64" : FmhaFwdTileSize( 64, 64, 32, 64, 32, 64, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1), - "128": FmhaFwdTileSize( 64, 64, 32, 128, 32, 128, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1), - "256": FmhaFwdTileSize( 64, 64, 32, 256, 32, 256, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1), + # bm0, bn0, bk0, bn1, bk1, + "32" : [FmhaFwdTileSize( 16, 64, 16, 32, 32, 32, 1, 2, 1, 1, 2, 1, 16, 16, 16, 16, 16, 16, -1), + FmhaFwdTileSize( 64, 64, 16, 32, 32, 32, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1)], + "64" : [FmhaFwdTileSize( 16, 64, 32, 64, 32, 64, 1, 4, 1, 1, 4, 1, 16, 16, 16, 16, 16, 16, -1), + FmhaFwdTileSize( 64, 64, 32, 64, 32, 64, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1)], + "128": [FmhaFwdTileSize( 16, 128, 32, 128, 32, 128, 1, 8, 1, 1, 8, 1, 16, 16, 16, 16, 16, 16, -1), + FmhaFwdTileSize( 64, 64, 32, 128, 32, 128, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1)], + "256": [FmhaFwdTileSize( 16, 128, 32, 256, 32, 256, 1, 8, 1, 1, 8, 1, 16, 16, 16, 16, 16, 16, -1), + FmhaFwdTileSize( 64, 64, 32, 256, 32, 256, 4, 1, 1, 4, 1, 1, 16, 16, 16, 16, 16, 16, -1)], } # fmt: skip elif dtype in ["fp8", "bf8"]: return { @@ -930,11 +949,17 @@ def get_fwd_splitkv_blobs( d = factory.get_hdim_tile_size_dict(dtype) if d is None: continue - # for hdim_str, mode, mask, bias, lse in itertools.product(d.keys(), MODE_MAP.keys(), MASK_MAP.keys(), ["t", "f"], ["t", "f"]): for hdim_str, mode in itertools.product(d.keys(), MODE_MAP.keys()): - tile = d[hdim_str] + tiles = d[hdim_str] + if not isinstance(tiles, list): + tiles = [tiles] hdim = int(hdim_str) - for pipeline in factory.get_pipelines(dtype, hdim, mask_impl): + for tile, pipeline in itertools.product( + tiles, factory.get_pipelines(dtype, hdim, mask_impl) + ): + # Use qr_nwarp_sshuffle with multiple N warps and qr otherwise + if (tile.F_rn0 != 1) != (pipeline.tag == "qr_nwarp_sshuffle"): + continue if mode == "group": if pipeline.F_spad != "t" or pipeline.F_skpad != "t": # in group mode, spad/skpad must be true, since we can't predict if seqlen of current batch need pad or not diff --git a/example/ck_tile/01_fmha/example_fmha_fwd.cpp b/example/ck_tile/01_fmha/example_fmha_fwd.cpp index 122d232a1c9..826bbc25324 100644 --- a/example/ck_tile/01_fmha/example_fmha_fwd.cpp +++ b/example/ck_tile/01_fmha/example_fmha_fwd.cpp @@ -119,7 +119,9 @@ auto create_args(int argc, char* argv[]) "", "Batch-mode only: per-batch effective seqlen for KV (exclude PAD).\n" "Comma-separated list of length 'b'. If empty, no override.") - .insert("init_sink", "0", "value to init the output tensor sink value for validation"); + .insert("init_sink", "0", "value to init the output tensor sink value for validation") + .insert( + "pack_gqa", "1", "1: enable Pack-GQA (fold GQA Q heads into seqlen for non-causal)"); bool result = arg_parser.parse(argc, argv); return std::make_tuple(result, arg_parser); @@ -163,6 +165,7 @@ auto run(const ck_tile::ArgParser& arg_parser) std::string init_method = arg_parser.get_str("init"); uint32_t seed = arg_parser.get_uint32("seed"); int init_sink_value = arg_parser.get_int("init_sink"); + int pack_gqa = arg_parser.get_int("pack_gqa"); ck_tile::stream_config stream_config{nullptr, true, @@ -210,6 +213,7 @@ auto run(const ck_tile::ArgParser& arg_parser) seed, do_validation, init_sink_value, + pack_gqa, stream_config, json); } diff --git a/example/ck_tile/01_fmha/fmha_bwd.hpp b/example/ck_tile/01_fmha/fmha_bwd.hpp index 20e4a822413..93e770a0cdf 100644 --- a/example/ck_tile/01_fmha/fmha_bwd.hpp +++ b/example/ck_tile/01_fmha/fmha_bwd.hpp @@ -18,6 +18,17 @@ #include #include +// Function pointer type for workspace packing (no captures, points to code segment) +using PrepareWorkspaceHostFunc = size_t (*)(void*, // host_ws + ck_tile::index_t, // batch + ck_tile::index_t, // hdim_q + ck_tile::index_t, // nhead_q + ck_tile::index_t, // seqlen_q + ck_tile::index_t, // seqlen_k + const ck_tile::index_t*, // seqstart_q + const ck_tile::index_t* // seqstart_k +); + struct FmhaBwdFp32 { }; @@ -588,6 +599,56 @@ float fmha_bwd(const fmha_bwd_traits&, fmha_bwd_args, const ck_tile::stream_conf struct fmha_bwd_launcher { + // POD closure for graph capture (trivially destructible, no heap allocation) + struct GraphClosure + { + PrepareWorkspaceHostFunc func_ptr; + void* pin_w_ptr; + const ck_tile::index_t* seqstart_q_ptr; + const ck_tile::index_t* seqstart_k_ptr; + ck_tile::index_t batch; + ck_tile::index_t hdim_q; + ck_tile::index_t nhead_q; + ck_tile::index_t seqlen_q; + ck_tile::index_t seqlen_k; + + static void invoke(void* ud) + { + auto* closure = static_cast(ud); + if(closure->func_ptr) + { + // Callback runs on the HIP driver helper thread across a C ABI boundary; + // any exception escaping it would call std::terminate. + try + { + closure->func_ptr(closure->pin_w_ptr, + closure->batch, + closure->hdim_q, + closure->nhead_q, + closure->seqlen_q, + closure->seqlen_k, + closure->seqstart_q_ptr, + closure->seqstart_k_ptr); + } + catch(const std::exception& e) + { + // The H2D queued after this callback will copy indeterminate + // metadata to device and the kernel will produce wrong results; + // unlikely in practice since pack_workspace_host only throws on + // precondition violations. + std::cerr << "fmha_bwd_launcher: pack_workspace_host threw: " << e.what() + << '\n'; + } + catch(...) + { + std::cerr << "fmha_bwd_launcher: pack_workspace_host threw unknown\n"; + } + } + } + }; + static_assert(std::is_trivially_destructible_v, + "GraphClosure must be trivially destructible for placement-new without dtor"); + std::function run{ [](fmha_bwd_args, const ck_tile::stream_config&) { std::cerr << "fmha_bwd: no kernel found for given traits, skipping run\n"; @@ -603,8 +664,28 @@ struct fmha_bwd_launcher ~fmha_bwd_launcher() noexcept { schedule_pin_staging_release(); } // Stream-async: zero dq_acc, D2H seqstart, host-pack metadata, H2D into device_ws. - // `pinned_host_alloc` returns a shared_ptr to a pinned host buffer; its deleter - // is invoked on the stream tail after the H2D completes. + // + // `pinned_host_alloc` returns a shared_ptr to a pinned host buffer. + // + // **Deleter behavior differs by mode**: + // - Normal mode: deleter is invoked on the stream tail after H2D completes. + // - Graph capture mode: deleter is NOT invoked; caller must keep buffer alive + // until hipGraphDestroy (see precondition #2 below). + // + // REQUIRED PRECONDITIONS for `pinned_host_alloc`: + // + // 1. **Capture-safe allocation**: The allocator must NOT call synchronizing APIs + // (e.g., bare hipHostMalloc) during active stream capture, as these invalidate + // the capture and cause hipStreamEndCapture to fail. Use a caching allocator + // that serves from cache during capture (e.g., PyTorch CachingHostAllocator). + // + // 2. **Buffer lifetime in graph mode**: In graph capture mode (detected via + // hipStreamIsCapturing), the returned buffer is NOT freed automatically after + // the H2D completes. The caller MUST keep the buffer alive for the graph's + // entire lifetime (until hipGraphDestroy), otherwise graph replay will read + // from freed memory. In normal (non-graph) mode, the buffer is automatically + // freed on the stream tail after the H2D. + // void prepare_workspace_async( // void* device_ws_ptr, const int* seqstart_q_dev, @@ -634,8 +715,20 @@ struct fmha_bwd_launcher const size_t seqstart_stride = ck_tile::integer_least_multiple(seqstart_bytes, static_cast(16)); const size_t pin_w_offset = 2 * seqstart_stride; - const size_t total_bytes = pin_w_offset + host_ws_size_; - auto pin_base = pinned_host_alloc(total_bytes); + const size_t data_size = pin_w_offset + host_ws_size_; + + // Check if we're in graph capture mode + hipStreamCaptureStatus capture_status; + HIP_CHECK_ERROR(hipStreamIsCapturing(stream, &capture_status)); + const bool is_graph_capture = (capture_status == hipStreamCaptureStatusActive); + + // Allocate pinned buffer with extra aligned space for closure + // Both modes use placement new for closure (POD, trivially destructible) + constexpr size_t closure_align = alignof(GraphClosure); + constexpr size_t closure_size = sizeof(GraphClosure); + const size_t aligned_data = (data_size + closure_align - 1) & ~(closure_align - 1); + const size_t total_bytes = aligned_data + closure_size; + auto pin_base = pinned_host_alloc(total_bytes); if(needs_zero_dq_acc_ && workspace_size > host_ws_size_) HIP_CHECK_ERROR(hipMemsetAsync(static_cast(device_ws_ptr) + host_ws_size_, @@ -643,12 +736,14 @@ struct fmha_bwd_launcher workspace_size - host_ws_size_, stream)); - char* base = static_cast(pin_base.get()); - int* pin_q = reinterpret_cast(base); - int* pin_k = reinterpret_cast(base + seqstart_stride); - void* pin_w = base + pin_w_offset; - const int* seqstart_q_pinned = traits_.is_group_mode ? pin_q : nullptr; - const int* seqstart_k_pinned = traits_.is_group_mode ? pin_k : nullptr; + char* base = static_cast(pin_base.get()); + int* pin_q = reinterpret_cast(base); + int* pin_k = reinterpret_cast(base + seqstart_stride); + void* pin_w = base + pin_w_offset; + const ck_tile::index_t* seqstart_q_pinned = + traits_.is_group_mode ? reinterpret_cast(pin_q) : nullptr; + const ck_tile::index_t* seqstart_k_pinned = + traits_.is_group_mode ? reinterpret_cast(pin_k) : nullptr; if(traits_.is_group_mode) { @@ -662,55 +757,56 @@ struct fmha_bwd_launcher pin_k, seqstart_k_dev, seqstart_bytes, hipMemcpyDeviceToHost, stream)); } - auto pack_closure = std::make_unique>( - [=, fn = pack_workspace_host_]() { fn(pin_w, seqstart_q_pinned, seqstart_k_pinned); }); - // Callback runs on the HIP driver helper thread across a C ABI boundary; - // any exception escaping it would call std::terminate. - HIP_CHECK_ERROR(hipLaunchHostFunc( - stream, - [](void* ud) { - std::unique_ptr> c{static_cast*>(ud)}; - try - { - (*c)(); - } - catch(const std::exception& e) - { - // The H2D queued after this callback will copy indeterminate - // metadata to device and the kernel will produce wrong results; - // unlikely in practice since pack_workspace_host_ only throws on - // precondition violations. - std::cerr << "fmha_bwd_launcher: pack_workspace_host threw: " << e.what() - << '\n'; - } - catch(...) - { - std::cerr << "fmha_bwd_launcher: pack_workspace_host threw unknown\n"; - } - }, - pack_closure.get())); - // Ownership transferred to the callback only after a successful launch. - pack_closure.release(); + // === UNIFIED PATH: Both modes use placement new for POD closure === + // Construct closure in aligned location within pinned buffer (all POD, trivially + // destructible) + void* closure_addr = base + aligned_data; + auto* closure = new(closure_addr) GraphClosure{ + prepare_ws_func_, // Function pointer (points to code segment, always valid) + pin_w, + seqstart_q_pinned, + seqstart_k_pinned, + batch_, // Copy captured data (independent of launcher lifetime) + hdim_q_, + nhead_q_, + seqlen_q_, + seqlen_k_}; + + HIP_CHECK_ERROR(hipLaunchHostFunc(stream, GraphClosure::invoke, closure)); HIP_CHECK_ERROR( hipMemcpyAsync(device_ws_ptr, pin_w, host_ws_size_, hipMemcpyHostToDevice, stream)); - // Release any previous in-flight buffer before taking a new one. - schedule_pin_staging_release(); - pin_staging_ = std::move(pin_base); - release_stream_ = stream; + if(!is_graph_capture) + { + // Normal mode: transfer ownership of pinned buffer and schedule release. + // The H2D memcpy above copies host-prepared metadata to device workspace. + // Pinned buffer must stay alive until H2D completes, so we schedule its + // release on the stream tail (via hipLaunchHostFunc callback). + schedule_pin_staging_release(); // Release any previous in-flight buffer first + pin_staging_ = std::move(pin_base); + release_stream_ = stream; + } + // Graph mode: pin_base stays owned by caller (via shared_ptr ref-count). + // Caller must keep it alive for the graph's lifetime. Closure and data pointers + // within pin_base remain valid as long as caller holds pin_base. } private: fmha_bwd_traits traits_{}; size_t host_ws_size_ = 0; bool needs_zero_dq_acc_ = false; - // Pure CPU; safe to invoke from a hipLaunchHostFunc callback. - std::function - pack_workspace_host_{[](void*, const int*, const int*) { - std::cerr - << "fmha_bwd: no kernel found for given traits, skipping pack_workspace_host\n"; - }}; + + // Function pointer (points to code segment, survives launcher destruction) + PrepareWorkspaceHostFunc prepare_ws_func_ = nullptr; + + // Captured data (copied to closure in graph mode) + ck_tile::index_t batch_ = 0; + ck_tile::index_t hdim_q_ = 0; + ck_tile::index_t nhead_q_ = 0; + ck_tile::index_t seqlen_q_ = 0; + ck_tile::index_t seqlen_k_ = 0; + std::shared_ptr pin_staging_; hipStream_t release_stream_ = nullptr; @@ -756,15 +852,16 @@ struct fmha_bwd_launcher t.is_group_mode ? t.seqlen_q : t.batch * t.seqlen_q; device_ws_size = fmha_bwd_dq_dk_dv_dq_ws_device_upper_bound_( t.batch, t.hdim_q, t.nhead_q, total_seqlen_q_padded, t.max_seqlen_k); - pack_workspace_host_ = [batch = t.batch, - hdim_q = t.hdim_q, - nhead_q = t.nhead_q, - seqlen_q = t.seqlen_q, - seqlen_k = t.seqlen_k // - ](void* host_ws, const int* seqstart_q, const int* seqstart_k) { - fmha_bwd_dq_dk_dv_dq_prepare_ws_host_( - host_ws, batch, hdim_q, nhead_q, seqlen_q, seqlen_k, seqstart_q, seqstart_k); - }; + + // Store function pointer (directly assign template-instantiated function) + prepare_ws_func_ = &fmha_bwd_dq_dk_dv_dq_prepare_ws_host_; + + // Store captured data as member variables + batch_ = t.batch; + hdim_q_ = t.hdim_q; + nhead_q_ = t.nhead_q; + seqlen_q_ = t.seqlen_q; + seqlen_k_ = t.seqlen_k; } workspace_size = host_ws_size_ + device_ws_size; needs_zero_dq_acc_ = fmha_bwd_dq_dk_dv_needs_zero_dq_acc_(); diff --git a/example/ck_tile/01_fmha/fmha_fwd.hpp b/example/ck_tile/01_fmha/fmha_fwd.hpp index fdf3fe8e7fe..50ba8ffb6ae 100644 --- a/example/ck_tile/01_fmha/fmha_fwd.hpp +++ b/example/ck_tile/01_fmha/fmha_fwd.hpp @@ -677,29 +677,55 @@ struct fmha_batch_prefill_args // Selects the KV-cache load mode for a batch-prefill dispatch arm. // GLOBAL_LOAD_LDS: required when (a) the page is smaller than one K/V tile -// so per-page SRD is impossible, AND (b) the total KV-pool byte size -// exceeds INT32_MAX so SRD's 32-bit byte offset cannot address it. +// so per-page SRD is impossible, AND (b) the SRD voffset arithmetic would +// overflow for either K or V. The hardware computes +// addr = (base[63:32] << 32) | ((base[31:0] + voffset) & 0xFFFFFFFF) +// and the voffset chain in ck_tile is signed int32 (index_t), so it wraps +// once base[31:0] + max_voffset exceeds INT32_MAX (0x7FFFFFFF, ~2GB) - NOT +// 0xFFFFFFFF - even when the KV pool itself is well under 2GB. K and V are +// independently allocated, so each is checked separately; either one +// crossing the bound forces GLOBAL_LOAD_LDS. // BUFFER_LOAD: every other case - the SGPR-resident SRD path is fastest. -// Inputs are taken as plain integers so the helper has no template parameter -// and can be called from each codegen-emitted dispatcher arm with the arm's -// compile-time kN0 / element_bytes substituted as constants. +// k_base_ptr/v_base_ptr are the VAs of the first elements of the K and V caches; +// the low 32 bits of each determine whether the voffset addition wraps. inline ck_tile::BlockAttentionKVCacheLoadModeEnum fmha_batch_prefill_select_kv_load_mode(ck_tile::index_t page_block_size, ck_tile::index_t kN0, ck_tile::index_t num_total_pages, ck_tile::index_t batch_stride_k, - ck_tile::index_t element_bytes) + ck_tile::index_t batch_stride_v, + ck_tile::index_t element_bytes, + const void* k_base_ptr, + const void* v_base_ptr) { - // Promote every operand to long_index_t so overflow is impossible regardless - // of multiplication order. A bare `static_cast(num_total_pages) - // * batch_stride_k * element_bytes` only works because of left-to-right - // associativity - a future reorder of the operands would silently truncate. - const auto kv_pool_bytes = static_cast(num_total_pages) * - static_cast(batch_stride_k) * - static_cast(element_bytes); - return (page_block_size < kN0 && kv_pool_bytes > INT32_MAX) - ? ck_tile::BlockAttentionKVCacheLoadModeEnum::GLOBAL_LOAD_LDS - : ck_tile::BlockAttentionKVCacheLoadModeEnum::BUFFER_LOAD; + if(page_block_size >= kN0) + return ck_tile::BlockAttentionKVCacheLoadModeEnum::BUFFER_LOAD; + + // Maximum byte offsets that buffer_load will add to K/V base pointers. + // Each page is addressed as page_id * batch_stride * element_bytes. + const auto k_pool_bytes = static_cast(num_total_pages) * + static_cast(batch_stride_k) * + static_cast(element_bytes); + const auto v_pool_bytes = static_cast(num_total_pages) * + static_cast(batch_stride_v) * + static_cast(element_bytes); + + // Low 32 bits of each base VA. K and V are independently allocated and may + // have different low-32 values, so both are checked. Compare against + // INT32_MAX (not UINT32_MAX): the low32 bits themselves are unsigned, but the + // voffset they are added to is signed int32, so the effective address is + // already wrong once base[31:0] + pool crosses 0x7FFFFFFF. A sum in the + // (2GB, 4GB] range still fits in 32 unsigned bits but has passed the signed + // wrap point - that is exactly the band this check must route to global load. + const auto k_lo32 = + static_cast(reinterpret_cast(k_base_ptr)) & 0xFFFFFFFFULL; + const auto v_lo32 = + static_cast(reinterpret_cast(v_base_ptr)) & 0xFFFFFFFFULL; + const bool srd_would_overflow = + (k_lo32 + k_pool_bytes) > INT32_MAX || (v_lo32 + v_pool_bytes) > INT32_MAX; + + return srd_would_overflow ? ck_tile::BlockAttentionKVCacheLoadModeEnum::GLOBAL_LOAD_LDS + : ck_tile::BlockAttentionKVCacheLoadModeEnum::BUFFER_LOAD; } template diff --git a/example/ck_tile/01_fmha/fmha_fwd_runner.hpp b/example/ck_tile/01_fmha/fmha_fwd_runner.hpp index 0b51dffa466..638fbe1a9f9 100644 --- a/example/ck_tile/01_fmha/fmha_fwd_runner.hpp +++ b/example/ck_tile/01_fmha/fmha_fwd_runner.hpp @@ -165,8 +165,10 @@ int override_num_splits_if_necessary( if(num_splits < 1 && p_drop == 0.0f) { + // props.multiProcessorCount for >=gfx10 is the number of WGPs (each has 2 CUs) + const int num_blocks_per_SM = props.warpSize == 32 ? 4 : 2; return num_splits_heuristic( - batch * nhead * num_m_blocks, props.multiProcessorCount * 2, 128); + batch * nhead * num_m_blocks, props.multiProcessorCount * num_blocks_per_SM, 128); } return num_splits; @@ -252,6 +254,7 @@ fwd_result fmha_fwd_run(mode_enum mode, uint32_t seed, int do_validation, int init_sink_value, + int pack_gqa, const ck_tile::stream_config& stream_config, std::optional json = std::nullopt) { @@ -648,8 +651,18 @@ fwd_result fmha_fwd_run(mode_enum mode, // legalize num_splits according to other options if(num_splits < 1) { + int nhead_merged = nhead; + int max_seqlen_q_merged = max_seqlen_q; + // When max_seqlen_q == 1 and multiple head groups are merged (kMergeNumHeadGroupsSeqLenQ) + // then more splits are required + if(bias.type == bias_enum::no_bias && mask.type == mask_enum::no_mask && + max_seqlen_q == 1 && nhead_k < nhead) + { + nhead_merged = nhead_k; + max_seqlen_q_merged = max_seqlen_q * (nhead / nhead_k); + } num_splits = override_num_splits_if_necessary( - batch, nhead, max_seqlen_q, hdim_v, p_drop, num_splits); + batch, nhead_merged, max_seqlen_q_merged, hdim_v, p_drop, num_splits); } if(128 < num_splits) { @@ -690,6 +703,19 @@ fwd_result fmha_fwd_run(mode_enum mode, ? seqstart_k_with_padding_host.back() : seqstart_k_host.back())); + // Compute Pack-GQA dimensions early so buffer allocations use the right sizes + const int nhead_ratio = nhead / nhead_k; + int pack_gqa_nhead = nhead; + int pack_gqa_seqlen_q = shape_seqlen_q; + if(pack_gqa && nhead_ratio > 1 && mask.type == mask_enum::no_mask && + bias.type == bias_enum::no_bias && i_perm && o_perm && mode == mode_enum::batch && + q_eff_lens_per_batch.empty() && kv_eff_lens_per_batch.empty() && + qscale.type != quant_scale_enum::mx) + { + pack_gqa_nhead = nhead_k; + pack_gqa_seqlen_q = nhead_ratio * shape_seqlen_q; + } + const ck_tile::index_t num_block_scale_q = (mode == mode_enum::batch) ? ck_tile::integer_divide_ceil(shape_seqlen_q, block_scale_size_q_) @@ -738,14 +764,16 @@ fwd_result fmha_fwd_run(mode_enum mode, std::max(shape_seqlen_q, shape_seqlen_k), rotary_dim, next_seed()); ck_tile::HostTensor lse_acc_host( - 1 < num_splits || use_kvcache - ? std::array{shape_batch, nhead, num_splits, shape_seqlen_q} - : std::array{1, 1, 1, 1}); + 1 < num_splits || use_kvcache ? std::array{shape_batch, + pack_gqa_nhead, + num_splits, + pack_gqa_seqlen_q} + : std::array{1, 1, 1, 1}); ck_tile::HostTensor o_acc_host( 1 < num_splits || use_kvcache ? std::array{shape_batch, - nhead, + pack_gqa_nhead, num_splits, - shape_seqlen_q, + pack_gqa_seqlen_q, hdim_v} : std::array{1, 1, 1, 1, 1}); @@ -777,14 +805,14 @@ fwd_result fmha_fwd_run(mode_enum mode, // batch mode of lse data layout is [batch, nhead, seqlen_q] // group mode of lse data layout is [nhead, total_seqlen_q] ck_tile::HostTensor lse_host( - lse ? std::array{shape_batch, nhead, shape_seqlen_q} + lse ? std::array{shape_batch, pack_gqa_nhead, pack_gqa_seqlen_q} : std::array{1, 1, 1} /* dummy shape for simplifying code */); ck_tile::HostTensor o_host( - get_lengths(o_perm, shape_batch, nhead, shape_seqlen_q, hdim_v)); + get_lengths(o_perm, shape_batch, pack_gqa_nhead, pack_gqa_seqlen_q, hdim_v)); ck_tile::HostTensor randval_host( - p_drop > 0 ? get_lengths(true, shape_batch, nhead, shape_seqlen_q, max_seqlen_k) + p_drop > 0 ? get_lengths(true, shape_batch, pack_gqa_nhead, pack_gqa_seqlen_q, max_seqlen_k) : std::array{1, 1, 1, 1}); ck_tile::HostTensor block_table_host( @@ -1172,7 +1200,17 @@ fwd_result fmha_fwd_run(mode_enum mode, } }; - const auto init_args = [&, k_paddings_ = seqlen_kpads](auto& args) { + // Pack-GQA: print status (dimensions already computed earlier for buffer allocation) + if(pack_gqa_nhead != nhead) + { + std::cout << "[Pack-GQA] Enabled: nhead " << nhead << "->" << pack_gqa_nhead + << ", seqlen_q " << shape_seqlen_q << "->" << pack_gqa_seqlen_q << std::endl; + } + + const auto init_args = [&, + pack_gqa_nhead_ = pack_gqa_nhead, + pack_gqa_seqlen_q_ = pack_gqa_seqlen_q, + k_paddings_ = seqlen_kpads](auto& args) { /// NOTE: we broadcast bias from [1, 1, seqlen_q, seqlen_k] to [batch, nhead, seqlen_q, /// seqlen_k] in this example, hence both the 'batch_stride_bias' & /// 'nhead_stride_bias' are 0. @@ -1198,7 +1236,7 @@ fwd_result fmha_fwd_run(mode_enum mode, const ck_tile::index_t stride_o_acc = (hdim_v); const ck_tile::index_t stride_o = (o_perm ? hdim_v : nhead * hdim_v); // setup nhead_stride_* arguments - const ck_tile::index_t nhead_stride_q = (i_perm ? shape_seqlen_q * hdim_q : hdim_q); + const ck_tile::index_t nhead_stride_q = (i_perm ? pack_gqa_seqlen_q_ * hdim_q : hdim_q); const ck_tile::index_t nhead_stride_k = (0 < page_block_size ? (i_perm ? page_block_size * hdim_q : hdim_q) : (i_perm ? shape_seqlen_k * hdim_q : hdim_q)); @@ -1219,16 +1257,16 @@ fwd_result fmha_fwd_run(mode_enum mode, }(); const ck_tile::index_t nhead_stride_bias = (i_perm ? 0 * shape_seqlen_q * max_seqlen_k : 0 * max_seqlen_k); - const ck_tile::index_t nhead_stride_randval = (shape_seqlen_q * max_seqlen_k); - const ck_tile::index_t nhead_stride_lse = shape_seqlen_q; - const ck_tile::index_t nhead_stride_lse_acc = (num_splits * shape_seqlen_q); - const ck_tile::index_t nhead_stride_o_acc = (num_splits * shape_seqlen_q * hdim_v); - const ck_tile::index_t nhead_stride_o = (o_perm ? shape_seqlen_q * hdim_v : hdim_v); + const ck_tile::index_t nhead_stride_randval = (pack_gqa_seqlen_q_ * max_seqlen_k); + const ck_tile::index_t nhead_stride_lse = pack_gqa_seqlen_q_; + const ck_tile::index_t nhead_stride_lse_acc = (num_splits * pack_gqa_seqlen_q_); + const ck_tile::index_t nhead_stride_o_acc = (num_splits * pack_gqa_seqlen_q_ * hdim_v); + const ck_tile::index_t nhead_stride_o = (o_perm ? pack_gqa_seqlen_q_ * hdim_v : hdim_v); const ck_tile::index_t nhead_stride_q_descale = num_block_scale_q; const ck_tile::index_t nhead_stride_k_descale = num_block_scale_kv; const ck_tile::index_t nhead_stride_v_descale = num_block_scale_kv; // setup batch_stride_* arguments - const ck_tile::index_t batch_stride_q = (nhead * shape_seqlen_q * hdim_q); + const ck_tile::index_t batch_stride_q = (pack_gqa_nhead_ * pack_gqa_seqlen_q_ * hdim_q); const ck_tile::index_t batch_stride_k = (0 < page_block_size ? (nhead_k * page_block_size * hdim_q) : (nhead_k * shape_seqlen_k * hdim_q)); @@ -1236,20 +1274,23 @@ fwd_result fmha_fwd_run(mode_enum mode, const ck_tile::index_t batch_stride_v = (0 < page_block_size ? (nhead_k * hdim_v * page_block_size) : (nhead_k * hdim_v * shape_seqlen_k)); - const ck_tile::index_t batch_stride_vnew = (nhead_k * hdim_v * seqlen_knew); - const ck_tile::index_t batch_stride_bias = (0 * nhead * shape_seqlen_q * max_seqlen_k); - const ck_tile::index_t batch_stride_randval = (nhead * shape_seqlen_q * max_seqlen_k); - const ck_tile::index_t batch_stride_lse = (nhead * shape_seqlen_q); - const ck_tile::index_t batch_stride_lse_acc = (nhead * num_splits * shape_seqlen_q); - const ck_tile::index_t batch_stride_o_acc = (nhead * num_splits * shape_seqlen_q * hdim_v); - const ck_tile::index_t batch_stride_o = (nhead * shape_seqlen_q * hdim_v); + const ck_tile::index_t batch_stride_vnew = (nhead_k * hdim_v * seqlen_knew); + const ck_tile::index_t batch_stride_bias = (0 * nhead * shape_seqlen_q * max_seqlen_k); + const ck_tile::index_t batch_stride_randval = + (pack_gqa_nhead_ * pack_gqa_seqlen_q_ * max_seqlen_k); + const ck_tile::index_t batch_stride_lse = (pack_gqa_nhead_ * pack_gqa_seqlen_q_); + const ck_tile::index_t batch_stride_lse_acc = + (pack_gqa_nhead_ * num_splits * pack_gqa_seqlen_q_); + const ck_tile::index_t batch_stride_o_acc = + (pack_gqa_nhead_ * num_splits * pack_gqa_seqlen_q_ * hdim_v); + const ck_tile::index_t batch_stride_o = (pack_gqa_nhead_ * pack_gqa_seqlen_q_ * hdim_v); const ck_tile::index_t batch_stride_block_table = (max_num_page_blocks / batch); const ck_tile::index_t batch_stride_q_descale = num_block_scale_q * nhead; const ck_tile::index_t batch_stride_k_descale = num_block_scale_kv * nhead_k; const ck_tile::index_t batch_stride_v_descale = num_block_scale_kv * nhead_k; // setup split_stride_* arguments (only used in split-kv kernel) - const ck_tile::index_t split_stride_lse_acc = (shape_seqlen_q); - const ck_tile::index_t split_stride_o_acc = (shape_seqlen_q * hdim_v); + const ck_tile::index_t split_stride_lse_acc = (pack_gqa_seqlen_q_); + const ck_tile::index_t split_stride_o_acc = (pack_gqa_seqlen_q_ * hdim_v); args.q_ptr = q_buf.GetDeviceBuffer(); args.k_ptr = k_buf.GetDeviceBuffer(); @@ -1259,14 +1300,14 @@ fwd_result fmha_fwd_run(mode_enum mode, else args.sink_ptr = nullptr; args.batch = batch; - args.seqlen_q = shape_seqlen_q; // unused in group mode + args.seqlen_q = pack_gqa_seqlen_q_; // unused in group mode, or packed seqlen args.hdim_q = hdim_q; args.hdim_v = hdim_v; - args.nhead_q = nhead; + args.nhead_q = pack_gqa_nhead_; args.nhead_k = nhead_k; if constexpr(std::is_same_v>) { - args.num_head_q_total = nhead; + args.num_head_q_total = pack_gqa_nhead_; args.head_start = 0; } @@ -1315,8 +1356,8 @@ fwd_result fmha_fwd_run(mode_enum mode, args.lse_ptr = lse_buf.GetDeviceBuffer(); args.o_ptr = o_buf.GetDeviceBuffer(); - args.seqlen_k = shape_seqlen_k; // unused in group mode (or kvcache enabled) - args.max_seqlen_q = max_seqlen_q; + args.seqlen_k = shape_seqlen_k; // unused in group mode (or kvcache enabled) + args.max_seqlen_q = pack_gqa_seqlen_q_; // use packed seqlen for grid size args.scale_s = scale_s; @@ -2304,9 +2345,21 @@ fwd_result fmha_fwd_run(mode_enum mode, if(lse) { ck_tile::HostTensor lse_host_result({nhead, real_seqlen_q}); - lse_host_result.ForEach([&](auto& self, auto idx) { - self(idx) = lse_host(b_idx, idx[0], idx[1] + query_offset); - }); + if(pack_gqa_nhead != nhead) + { + lse_host_result.ForEach([&](auto& self, auto idx) { + ck_tile::index_t packed_head = idx[0] / nhead_ratio; + ck_tile::index_t packed_seq = + (idx[0] % nhead_ratio) * real_seqlen_q + idx[1] + query_offset; + self(idx) = lse_host(b_idx, packed_head, packed_seq); + }); + } + else + { + lse_host_result.ForEach([&](auto& self, auto idx) { + self(idx) = lse_host(b_idx, idx[0], idx[1] + query_offset); + }); + } // Use smaller rtol/atol as LSE is computed and stored in fp32, so there is no // precision loss due to conversion @@ -2329,30 +2382,73 @@ fwd_result fmha_fwd_run(mode_enum mode, } if(p_drop > 0) { - ck_tile::HostTensor randval_host_ref( - {nhead, real_seqlen_q, real_seqlen_k}); - ck_tile::reference_batched_dropout_randval( - randval_host_ref, wb, drop_seed, drop_offset); - ck_tile::reference_batched_dropout( - p_host_ref, randval_host_ref, p_undrop_in_uint8_t, rp_undrop); + const bool is_pack_gqa_active = (pack_gqa_nhead != nhead); + if(is_pack_gqa_active) + { + const int nhead_ratio_local = nhead / nhead_k; + ck_tile::HostTensor randval_packed_ref( + {pack_gqa_nhead, pack_gqa_seqlen_q, real_seqlen_k}); + ck_tile::reference_batched_dropout_randval( + randval_packed_ref, wb, drop_seed, drop_offset); + + ck_tile::HostTensor randval_host_ref( + {nhead, real_seqlen_q, real_seqlen_k}); + randval_host_ref.ForEach([&](auto& self, const auto& idx) { + ck_tile::index_t h = idx[0]; + ck_tile::index_t s = idx[1]; + ck_tile::index_t k = idx[2]; + ck_tile::index_t packed_head = h / nhead_ratio_local; + ck_tile::index_t packed_seq = (h % nhead_ratio_local) * real_seqlen_q + s; + self(idx) = randval_packed_ref(packed_head, packed_seq, k); + }); - ck_tile::HostTensor randval_host_result( - {nhead, real_seqlen_q, real_seqlen_k}); - randval_host_result.ForEach([&](auto& self, const auto& idx) { - self(idx) = randval_host(b_idx, idx[0], idx[1] + query_offset, idx[2]); - }); - masked_s_host_ref.ForEach([&](const auto& self, const auto& idx) { - // Ignore all masked values in validation check - if(std::isinf(self(idx))) + ck_tile::reference_batched_dropout( + p_host_ref, randval_host_ref, p_undrop_in_uint8_t, rp_undrop); + + ck_tile::HostTensor randval_host_result( + {pack_gqa_nhead, pack_gqa_seqlen_q, real_seqlen_k}); + randval_host_result.ForEach([&](auto& self, const auto& idx) { + self(idx) = randval_host(b_idx, idx[0], idx[1] + query_offset, idx[2]); + }); + bool cur_pass = ck_tile::check_err(randval_host_result, + randval_packed_ref, + "DROPOUT RANDVAL Error: Incorrect results!"); + pass &= cur_pass; + if(!cur_pass) { - randval_host_ref(idx) = 0; - randval_host_result(idx) = 0; + break; } - }); - bool cur_pass = ck_tile::check_err(randval_host_result, - randval_host_ref, - "DROPOUT RANDVAL Error: Incorrect results!"); - pass &= cur_pass; + } + else + { + ck_tile::HostTensor randval_host_ref( + {nhead, real_seqlen_q, real_seqlen_k}); + ck_tile::reference_batched_dropout_randval( + randval_host_ref, wb, drop_seed, drop_offset); + ck_tile::reference_batched_dropout( + p_host_ref, randval_host_ref, p_undrop_in_uint8_t, rp_undrop); + + ck_tile::HostTensor randval_host_result( + {nhead, real_seqlen_q, real_seqlen_k}); + randval_host_result.ForEach([&](auto& self, const auto& idx) { + self(idx) = randval_host(b_idx, idx[0], idx[1] + query_offset, idx[2]); + }); + masked_s_host_ref.ForEach([&](const auto& self, const auto& idx) { + if(std::isinf(self(idx))) + { + randval_host_ref(idx) = 0; + randval_host_result(idx) = 0; + } + }); + bool cur_pass = ck_tile::check_err(randval_host_result, + randval_host_ref, + "DROPOUT RANDVAL Error: Incorrect results!"); + pass &= cur_pass; + if(!cur_pass) + { + break; + } + } } if constexpr(is_mx) @@ -2422,7 +2518,16 @@ fwd_result fmha_fwd_run(mode_enum mode, ck_tile::HostTensor o_host_result({nhead, real_seqlen_q, hdim_v}); // clang-format off // permute - if(o_perm) o_host_result.ForEach([&](auto& self, auto idx) { self(idx) = o_host(b_idx, idx[0], idx[1] + query_offset, idx[2]); }); + if(pack_gqa_nhead != nhead) + { + // Pack-GQA: o_host uses packed layout, unpack for comparison + o_host_result.ForEach([&](auto& self, auto idx) { + ck_tile::index_t packed_head = idx[0] / nhead_ratio; + ck_tile::index_t packed_seq = (idx[0] % nhead_ratio) * real_seqlen_q + idx[1] + query_offset; + self(idx) = o_host(b_idx, packed_head, packed_seq, idx[2]); + }); + } + else if(o_perm) o_host_result.ForEach([&](auto& self, auto idx) { self(idx) = o_host(b_idx, idx[0], idx[1] + query_offset, idx[2]); }); else o_host_result.ForEach([&](auto& self, auto idx) { self(idx) = o_host(b_idx, idx[1] + query_offset, idx[0], idx[2]); }); // clang-format on auto [rtol, atol] = get_elimit(init_method); diff --git a/example/ck_tile/01_fmha/script/benchmark_fwd.sh b/example/ck_tile/01_fmha/script/benchmark_fwd.sh index f2b3a48dcb6..12dc305ab58 100755 --- a/example/ck_tile/01_fmha/script/benchmark_fwd.sh +++ b/example/ck_tile/01_fmha/script/benchmark_fwd.sh @@ -53,4 +53,4 @@ $EXE $base_group_args -s_qpad=1152,896,576,320 -s_kpad=1152,896,576,320 $EXE $base_group_args -s_qpad=1536,1152,768,384 -s_kpad=1536,1152,768,384 # high physical pad -$EXE $base_group_args -s_qpad=2048,1536,1024,512 -s_kpad=2048,1536,1024,512 +$EXE $base_group_args -s_qpad=2048,1536,1024,512 -s_kpad=2048,1536,1024,512 \ No newline at end of file diff --git a/example/ck_tile/03_gemm/CMakeLists.txt b/example/ck_tile/03_gemm/CMakeLists.txt index 85094df6770..81949dd00a2 100644 --- a/example/ck_tile/03_gemm/CMakeLists.txt +++ b/example/ck_tile/03_gemm/CMakeLists.txt @@ -21,8 +21,8 @@ if(GPU_TARGETS MATCHES "gfx94|gfx95|gfx90a|gfx125") list(APPEND EXAMPLE_GEMM_COMPILE_OPTIONS -mllvm -enable-noalias-to-md-conversion=0) list(APPEND EXAMPLE_WEIGHT_PRESHUFFLE_COMPILE_OPTIONS -Wno-unused-local-typedef) list(APPEND EXAMPLE_WEIGHT_PRESHUFFLE_COMPILE_OPTIONS -Wno-gnu-line-marker) - #list(APPEND EXAMPLE_WEIGHT_PRESHUFFLE_COMPILE_OPTIONS --save-temps) - list(APPEND EXAMPLE_WEIGHT_PRESHUFFLE_COMPILE_OPTIONS "SHELL: -mllvm -greedy-reverse-local-assignment=1 -mllvm -enable-noalias-to-md-conversion=0") + # list(APPEND EXAMPLE_WEIGHT_PRESHUFFLE_COMPILE_OPTIONS --save-temps) + list(APPEND EXAMPLE_WEIGHT_PRESHUFFLE_COMPILE_OPTIONS "SHELL: -mllvm -greedy-reverse-local-assignment=1 -mllvm -enable-noalias-to-md-conversion=1") target_compile_options(tile_example_gemm_basic PRIVATE ${EXAMPLE_GEMM_COMPILE_OPTIONS}) target_compile_options(tile_example_gemm_universal PRIVATE ${EXAMPLE_GEMM_COMPILE_OPTIONS}) target_compile_options(tile_example_gemm_weight_preshuffle PRIVATE ${EXAMPLE_WEIGHT_PRESHUFFLE_COMPILE_OPTIONS}) diff --git a/example/ck_tile/03_gemm/gemm_basic.cpp b/example/ck_tile/03_gemm/gemm_basic.cpp index 7d6a2adc384..413b30fec8d 100644 --- a/example/ck_tile/03_gemm/gemm_basic.cpp +++ b/example/ck_tile/03_gemm/gemm_basic.cpp @@ -44,7 +44,6 @@ int run_gemm_example(ck_tile::ArgParser& arg_parser) #ifdef CK_GFX950_SUPPORT else if(data_type == "tf32") { - // Pass tf32_t as A/B types - epilogue auto-detects and maps to float for data operations return run_gemm_example_prec_type static float gemm(const ck_tile::GemmHostArgs& args, const ck_tile::stream_config& s) { - // ADataTypeCompute: compute type (tf32_t for TF32 mode, used for warp gemm selection) - // ADataTypeBuf: buffer/storage type (fp32 when tf32) - using ADataTypeCompute = ADataType_; - using BDataTypeCompute = BDataType_; - using ADataTypeBuf = ck_tile::if_select_t; - using BDataTypeBuf = ck_tile::if_select_t; - - if constexpr(std::is_same_v) + if constexpr(std::is_same_v) { - static_assert(std::is_same_v, - "ADataTypeCompute and BDataTypeCompute must be the same"); + static_assert(std::is_same_v, + "ADataType and BDataType must be the same"); } if constexpr(Persistent) @@ -37,12 +30,13 @@ struct BasicInvoker std::cout << "WARNING: Ignoring persistent kernel option for basic gemm." << std::endl; } - constexpr bool is_fp32_input = std::is_same_v; - constexpr bool is_tf32_compute = std::is_same_v; + constexpr bool is_fp32_or_tf32_input = + std::is_same_v || std::is_same_v; + constexpr bool is_tf32_compute = std::is_same_v; // This part comes from the Codegen - constexpr ck_tile::index_t M_Tile = is_fp32_input ? 128 : 256; - constexpr ck_tile::index_t N_Tile = is_fp32_input ? 128 : 256; + constexpr ck_tile::index_t M_Tile = is_fp32_or_tf32_input ? 128 : 256; + constexpr ck_tile::index_t N_Tile = is_fp32_or_tf32_input ? 128 : 256; constexpr ck_tile::index_t K_Tile = 64; #if CK_TILE_USE_WMMA @@ -53,17 +47,19 @@ struct BasicInvoker constexpr ck_tile::index_t M_Warp_Tile = 16; constexpr ck_tile::index_t N_Warp_Tile = 16; constexpr ck_tile::index_t K_Warp_Tile = - ck_tile::get_k_warp_tile(); + ck_tile::get_k_warp_tile(); ck_tile::ignore = is_tf32_compute; #else // gfx950: fp32 uses 16x16x16 tile (native MFMA) // tf32 uses 32x32x16 tile (3x bf16 32x32x16 MFMA emulation) - constexpr ck_tile::index_t M_Warp = (is_fp32_input && !is_tf32_compute) ? 4 : 2; - constexpr ck_tile::index_t N_Warp = (is_fp32_input && !is_tf32_compute) ? 4 : 2; + constexpr ck_tile::index_t M_Warp = (is_fp32_or_tf32_input && !is_tf32_compute) ? 4 : 2; + constexpr ck_tile::index_t N_Warp = (is_fp32_or_tf32_input && !is_tf32_compute) ? 4 : 2; constexpr ck_tile::index_t K_Warp = 1; - constexpr ck_tile::index_t M_Warp_Tile = (is_fp32_input && !is_tf32_compute) ? 16 : 32; - constexpr ck_tile::index_t N_Warp_Tile = (is_fp32_input && !is_tf32_compute) ? 16 : 32; + constexpr ck_tile::index_t M_Warp_Tile = + (is_fp32_or_tf32_input && !is_tf32_compute) ? 16 : 32; + constexpr ck_tile::index_t N_Warp_Tile = + (is_fp32_or_tf32_input && !is_tf32_compute) ? 16 : 32; constexpr ck_tile::index_t K_Warp_Tile = 16; #endif @@ -81,15 +77,15 @@ struct BasicInvoker BLayout, CLayout>; - using AComputeDataType = std:: - conditional_t, BDataType_, ADataType_>; + using AComputeDataType = + std::conditional_t, BDataType, ADataType>; using BComputeDataType = - std::conditional_t || - std::is_same_v, - ADataType_, - BDataType_>; - using CodegenPipelineProblem = ck_tile::GemmPipelineProblem || + std::is_same_v, + ADataType, + BDataType>; + using CodegenPipelineProblem = ck_tile::GemmPipelineProblem; using GemmEpilogue = ck_tile::CShuffleEpilogue< - ck_tile::CShuffleEpilogueProblem, AccDataType, CDataType, @@ -141,7 +137,7 @@ struct BasicInvoker } // Declare rotating_mem_ptr here so it stays in scope until it is needed - std::unique_ptr> rotating_mem_ptr; + std::unique_ptr> rotating_mem_ptr; std::function preprocess; auto clear_gemm_output = [&]() { @@ -154,21 +150,16 @@ struct BasicInvoker { std::cout << "Flushing cache..." << std::endl; - ck_tile::HostTensor a_m(ck_tile::host_tensor_descriptor( + ck_tile::HostTensor a_m(ck_tile::host_tensor_descriptor( args.M, args.K, args.stride_A, is_row_major(ALayout{}))); - ck_tile::HostTensor b_n(ck_tile::host_tensor_descriptor( + ck_tile::HostTensor b_n(ck_tile::host_tensor_descriptor( args.K, args.N, args.stride_B, is_row_major(BLayout{}))); auto size_a_buffer = a_m.get_element_space_size_in_bytes(); auto size_b_buffer = b_n.get_element_space_size_in_bytes(); - rotating_mem_ptr = - std::make_unique>( - kargs.as_ptr[0], - kargs.bs_ptr[0], - s.rotating_count_, - size_a_buffer, - size_b_buffer); + rotating_mem_ptr = std::make_unique>( + kargs.as_ptr[0], kargs.bs_ptr[0], s.rotating_count_, size_a_buffer, size_b_buffer); rotating_mem_ptr->Print(); preprocess = [&]() { diff --git a/example/ck_tile/03_gemm/gemm_utils.hpp b/example/ck_tile/03_gemm/gemm_utils.hpp index 2574b1dbc42..676677408f0 100644 --- a/example/ck_tile/03_gemm/gemm_utils.hpp +++ b/example/ck_tile/03_gemm/gemm_utils.hpp @@ -3,16 +3,15 @@ #pragma once -#include -#include - #include "ck_tile/core.hpp" -#include "ck_tile/core/numeric/pk_fp4.hpp" #include "ck_tile/host/kernel_launch.hpp" #include "ck_tile/ops/epilogue.hpp" #include "ck_tile/ops/gemm.hpp" #include "ck_tile/utility/json_dump.hpp" +#include +#include + struct GemmConfigBase { static constexpr bool kPadM = false; @@ -41,12 +40,9 @@ struct GemmConfigBase ck_tile::DataCachePrefetchKind::None; static constexpr ck_tile::DataCachePrefetchKind DataCachePrefetchB = ck_tile::DataCachePrefetchKind::None; + static constexpr bool Async = false; }; -// Type trait for tf32 storage type (tf32 uses float for memory layout calculations) -template -using prec_storage_type = ck_tile::if_select_t; - template struct GemmConfigMemoryInterwave : public GemmConfigBase { @@ -93,7 +89,7 @@ struct GemmConfigComputeV3 : public GemmConfigBase // Compute V3 only support Intrawave scheduler static constexpr ck_tile::index_t M_Tile = 16; static constexpr ck_tile::index_t N_Tile = 64; - static constexpr ck_tile::index_t K_Tile = 256 / sizeof(prec_storage_type); + static constexpr ck_tile::index_t K_Tile = 256 / sizeof(PrecType); static constexpr ck_tile::index_t M_Warp = 1; static constexpr ck_tile::index_t N_Warp = 4; @@ -133,7 +129,33 @@ struct GemmConfigComputeV3_2 : public GemmConfigBase { static constexpr ck_tile::index_t M_Tile = 128; static constexpr ck_tile::index_t N_Tile = 128; - static constexpr ck_tile::index_t K_Tile = 128 / sizeof(prec_storage_type); + static constexpr ck_tile::index_t K_Tile = 128 / sizeof(PrecType); + + static constexpr ck_tile::index_t M_Warp = 2; + static constexpr ck_tile::index_t N_Warp = 2; + static constexpr ck_tile::index_t K_Warp = 1; + + static constexpr ck_tile::index_t M_Warp_Tile = 16; + static constexpr ck_tile::index_t N_Warp_Tile = 16; + static constexpr ck_tile::index_t K_Warp_Tile = + ck_tile::get_k_warp_tile(); + + static constexpr bool DoubleSmemBuffer = false; + static constexpr ck_tile::GemmPipeline Pipeline = ck_tile::GemmPipeline::COMPUTE_V3; + + static constexpr int kBlockPerCu = 2; +}; + +template +struct GemmConfigComputeV3_3 : public GemmConfigBase +{ + static constexpr bool kPadM = true; + static constexpr bool kPadN = true; + static constexpr bool kPadK = true; + + static constexpr ck_tile::index_t M_Tile = 128; + static constexpr ck_tile::index_t N_Tile = 256 / sizeof(PrecType); + static constexpr ck_tile::index_t K_Tile = 128 / sizeof(PrecType); static constexpr ck_tile::index_t M_Warp = 2; static constexpr ck_tile::index_t N_Warp = 2; @@ -148,6 +170,7 @@ struct GemmConfigComputeV3_2 : public GemmConfigBase static constexpr ck_tile::GemmPipeline Pipeline = ck_tile::GemmPipeline::COMPUTE_V3; static constexpr int kBlockPerCu = 2; + static constexpr bool Async = true; }; template @@ -313,7 +336,7 @@ struct GemmConfigPreshufflePrefill : public GemmConfigBase { static constexpr ck_tile::index_t M_Tile = 128; static constexpr ck_tile::index_t N_Tile = 128; - static constexpr ck_tile::index_t K_Tile = 128 / sizeof(prec_storage_type); + static constexpr ck_tile::index_t K_Tile = 128 / sizeof(PrecType); static constexpr ck_tile::index_t M_Warp = 1; static constexpr ck_tile::index_t N_Warp = 4; @@ -322,7 +345,7 @@ struct GemmConfigPreshufflePrefill : public GemmConfigBase static constexpr ck_tile::index_t M_Warp_Tile = 16; static constexpr ck_tile::index_t N_Warp_Tile = 16; static constexpr ck_tile::index_t K_Warp_Tile = - ck_tile::get_k_warp_tile, M_Warp_Tile, true>(); + ck_tile::get_k_warp_tile(); static constexpr int kBlockPerCu = 2; static constexpr auto Scheduler = ck_tile::GemmPipelineScheduler::Default; @@ -331,6 +354,19 @@ struct GemmConfigPreshufflePrefill : public GemmConfigBase static constexpr bool DoubleSmemBuffer = true; static constexpr int N_Repeat = N_Tile / N_Warp_Tile / N_Warp; static constexpr bool TiledMMAPermuteN = N_Repeat % 2 == 0; + + static constexpr bool Async = false; +}; + +template +struct GemmConfigPreshufflePrefillAsync : public GemmConfigPreshufflePrefill +{ + static constexpr ck_tile::index_t N_Tile = 256; + + // N_Repeat is even in this config + static constexpr bool TiledMMAPermuteN = true; + + static constexpr bool Async = true; }; template @@ -360,8 +396,8 @@ struct GemmTypeConfig; template <> struct GemmTypeConfig { - using ADataType = float; - using BDataType = float; + using ADataType = ck_tile::tf32_t; + using BDataType = ck_tile::tf32_t; using AccDataType = float; using CDataType = float; }; diff --git a/example/ck_tile/03_gemm/gemm_weight_preshuffle_invoker.hpp b/example/ck_tile/03_gemm/gemm_weight_preshuffle_invoker.hpp index fcd9243bebf..cb335607bc0 100644 --- a/example/ck_tile/03_gemm/gemm_weight_preshuffle_invoker.hpp +++ b/example/ck_tile/03_gemm/gemm_weight_preshuffle_invoker.hpp @@ -33,6 +33,8 @@ struct WeightPreshuffleInvoker GemmConfig::TileParitionerGroupNum, GemmConfig::TileParitionerM01>; + static constexpr ck_tile::index_t VectorSize = 16; + using GemmUniversalTraits = ck_tile::TileGemmUniversalTraits; + GemmConfig::DataCachePrefetchB, + GemmConfig::Async>; + constexpr auto scheduler = GemmConfig::Scheduler; using AComputeDataType = diff --git a/example/ck_tile/03_gemm/gemm_weight_preshuffle_tdm_data_cache_prefetch.cpp b/example/ck_tile/03_gemm/gemm_weight_preshuffle_tdm_data_cache_prefetch.cpp index 59b938f92d3..6034b84b576 100644 --- a/example/ck_tile/03_gemm/gemm_weight_preshuffle_tdm_data_cache_prefetch.cpp +++ b/example/ck_tile/03_gemm/gemm_weight_preshuffle_tdm_data_cache_prefetch.cpp @@ -182,6 +182,8 @@ struct GemmConfigWeightPreshuffleTDMPrefetch : public GemmConfigBase static constexpr ck_tile::DataCachePrefetchKind DataCachePrefetchB = DataCachePrefetchB_; static constexpr int N_Repeat = N_Tile / N_Warp_Tile / N_Warp; static constexpr bool TiledMMAPermuteN = N_Repeat % 2 == 0; + + static constexpr bool Async = false; }; int main(int argc, char* argv[]) diff --git a/example/ck_tile/03_gemm/run_gemm_example.inc b/example/ck_tile/03_gemm/run_gemm_example.inc index 2698d594889..54313336a29 100644 --- a/example/ck_tile/03_gemm/run_gemm_example.inc +++ b/example/ck_tile/03_gemm/run_gemm_example.inc @@ -209,8 +209,6 @@ std::tuple inline parse_ge return std::make_tuple(M, N, K); } -// ADataType_ and BDataType_ are original types (e.g., tf32_t for TF32 mode) -// They are passed through invoke_gemm to invoker for tf32 auto-detection template float mapping for host tensors and device buffers using TypeConfig = GemmTypeConfig; using ADataTypeBuf = typename TypeConfig::ADataType; using BDataTypeBuf = typename TypeConfig::BDataType; @@ -357,8 +349,8 @@ int run_gemm_example_with_layouts(ck_tile::ArgParser& arg_parser, float ave_time = invoke_gemm, AccDataType, CDataType, @@ -411,12 +403,12 @@ int run_gemm_example_with_layouts(ck_tile::ArgParser& arg_parser, if(arg_parser.get_int("v") == 1) { - ck_tile::reference_gemm( + ck_tile::reference_gemm( a_m_k, b_k_n, c_m_n_ref); const float max_accumulated_value = *std::max_element(c_m_n_ref.mData.begin(), c_m_n_ref.mData.end()); const auto rtol_atol = - calculate_rtol_atol( + calculate_rtol_atol( K, kbatch, max_accumulated_value); pass = do_verify(c_m_n_dev_result, c_m_n_ref, rtol_atol, "CPU"); } @@ -440,8 +432,8 @@ int run_gemm_example_with_layouts(ck_tile::ArgParser& arg_parser, BDataTypeBuf* d_B = static_cast(b_k_n_dev_buf.GetDeviceBuffer()); CDataType* d_C = static_cast(c_m_n_gpu_buf_ref.GetDeviceBuffer()); - ck_tile::reference_gemm_gpu( + calculate_rtol_atol( K, kbatch, max_accumulated_value); pass = do_verify(c_m_n_dev_result, c_m_n_ref, rtol_atol, "GPU"); } diff --git a/example/ck_tile/03_gemm/universal_gemm_invoker.hpp b/example/ck_tile/03_gemm/universal_gemm_invoker.hpp index 79e6d259919..1b7957e66a7 100644 --- a/example/ck_tile/03_gemm/universal_gemm_invoker.hpp +++ b/example/ck_tile/03_gemm/universal_gemm_invoker.hpp @@ -57,6 +57,7 @@ struct UniversalInvoker GemmConfig::TileParitionerGroupNum, GemmConfig::TileParitionerM01>>; + constexpr ck_tile::index_t VectorSize = 16; using GemmUniversalTraits = ck_tile::TileGemmUniversalTraits; + GemmConfig::DataCachePrefetchB, + GemmConfig::Async>; constexpr auto scheduler = GemmConfig::Scheduler; @@ -247,6 +249,7 @@ struct UniversalInvoker GemmConfig::TileParitionerGroupNum, GemmConfig::TileParitionerM01>; + constexpr ck_tile::index_t VectorSize = 16; using GemmUniversalTraits = ck_tile::TileGemmUniversalTraits; + GemmConfig::Preshuffle, + VectorSize, + GemmConfig::DataCachePrefetchA, + GemmConfig::DataCachePrefetchB, + GemmConfig::Async>; constexpr auto scheduler = GemmConfig::Scheduler; using AComputeDataType = diff --git a/example/ck_tile/05_reduce/multiple_reduce_multiblock.cpp b/example/ck_tile/05_reduce/multiple_reduce_multiblock.cpp index 2384dc2aa58..29eedb57dbc 100644 --- a/example/ck_tile/05_reduce/multiple_reduce_multiblock.cpp +++ b/example/ck_tile/05_reduce/multiple_reduce_multiblock.cpp @@ -245,7 +245,7 @@ bool run(const ck_tile::ArgParser& arg_parser) if(pass_op) { - std::cout << "✅ valid results for this operation" << std::endl; + std::cout << "[OK] valid results for this operation" << std::endl; } pass &= pass_op; }); diff --git a/example/ck_tile/18_flatmm/CMakeLists.txt b/example/ck_tile/18_flatmm/CMakeLists.txt index 753f70844fc..48a48e114f2 100644 --- a/example/ck_tile/18_flatmm/CMakeLists.txt +++ b/example/ck_tile/18_flatmm/CMakeLists.txt @@ -46,4 +46,9 @@ if(has_supported_gpu) target_include_directories(tile_example_mx_flatmm PRIVATE mxgemm) target_compile_options(tile_example_mx_flatmm PRIVATE ${EXAMPLE_FLATMM_COMPILE_OPTIONS}) endif() + if (GPU_TARGETS MATCHES "gfx125") + add_executable(tile_example_mx_flatmm_mxgemm_data_cache_prefetch mxgemm/mx_flatmm_data_cache_prefetch.cpp) + target_include_directories(tile_example_mx_flatmm_mxgemm_data_cache_prefetch PRIVATE mxgemm) + target_compile_options(tile_example_mx_flatmm_mxgemm_data_cache_prefetch PRIVATE ${EXAMPLE_FLATMM_COMPILE_OPTIONS}) + endif() endif() diff --git a/example/ck_tile/18_flatmm/mxgemm/mx_flatmm_data_cache_prefetch.cpp b/example/ck_tile/18_flatmm/mxgemm/mx_flatmm_data_cache_prefetch.cpp new file mode 100644 index 00000000000..4a9a0118c2a --- /dev/null +++ b/example/ck_tile/18_flatmm/mxgemm/mx_flatmm_data_cache_prefetch.cpp @@ -0,0 +1,596 @@ +// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. +// SPDX-License-Identifier: MIT + +// This example runs MX flat GEMM using the TDM v1 pipeline with data cache prefetch. +// Instead of using the WeightPreshufflePipelineAGmemBGmemCRegTDM (preshuffle TDM pipeline), +// it uses the compute TDM v1 pipeline (GemmPipelineAgBgCrCompTDMV1) which supports +// hardware data cache prefetch on gfx1250. + +#include + +#include +#include +#include +#include +#include +#include + +#include "ck_tile/core.hpp" +#include "ck_tile/host.hpp" +#include "ck_tile/host/kernel_launch.hpp" +#include "ck_tile/ops/epilogue.hpp" +#include "ck_tile/ops/gemm.hpp" +#include "ck_tile/ops/gemm/kernel/mx_gemm_kernel.hpp" + +template +static constexpr inline auto is_row_major(Layout layout_) +{ + return ck_tile::bool_constant, + ck_tile::tensor_layout::gemm::RowMajor>>{}; +} + +// MX GEMM config using TDM v1 pipeline with data cache prefetch +template +struct MXGemmConfigTDMV1Prefetch +{ + static constexpr ck_tile::index_t M_Tile = 128; + static constexpr ck_tile::index_t N_Tile = 128; + static constexpr ck_tile::index_t K_Tile = 128; + + static constexpr ck_tile::index_t M_Warp = 2; + static constexpr ck_tile::index_t N_Warp = 2; + static constexpr ck_tile::index_t K_Warp = 1; + + // gfx1250 TDM v1 MX scale distribution requires 32x32 warp tiles + static constexpr ck_tile::index_t M_Warp_Tile = 32; + static constexpr ck_tile::index_t N_Warp_Tile = 32; + static constexpr ck_tile::index_t K_Warp_Tile = 128; + + static constexpr bool kPadM = true; + static constexpr bool kPadN = true; + static constexpr bool kPadK = false; + + static constexpr bool TransposeC = true; + static constexpr bool DoubleSmemBuffer = true; + + static constexpr ck_tile::DataCachePrefetchKind DataCachePrefetchA = DataCachePrefetchA_; + static constexpr ck_tile::DataCachePrefetchKind DataCachePrefetchB = DataCachePrefetchB_; + + static constexpr ck_tile::index_t ScaleBlockSize = 32; +}; + +template +float invoke_mx_gemm_tdm_v1(ck_tile::DeviceMem& a_dev_buf, + ck_tile::DeviceMem& b_dev_buf, + ck_tile::DeviceMem& c_dev_buf, + ck_tile::DeviceMem& scale_a_dev_buf, + ck_tile::DeviceMem& scale_b_dev_buf, + ck_tile::index_t M, + ck_tile::index_t N, + ck_tile::index_t K, + ck_tile::index_t stride_A, + ck_tile::index_t stride_B, + ck_tile::index_t stride_C, + int n_warmup, + int n_repeat) +{ + using namespace ck_tile; + + constexpr index_t M_Tile = GemmConfig::M_Tile; + constexpr index_t N_Tile = GemmConfig::N_Tile; + constexpr index_t K_Tile = GemmConfig::K_Tile; + + constexpr index_t M_Warp = GemmConfig::M_Warp; + constexpr index_t N_Warp = GemmConfig::N_Warp; + constexpr index_t K_Warp = GemmConfig::K_Warp; + + constexpr index_t M_Warp_Tile = GemmConfig::M_Warp_Tile; + constexpr index_t N_Warp_Tile = GemmConfig::N_Warp_Tile; + constexpr index_t K_Warp_Tile = GemmConfig::K_Warp_Tile; + + using GemmShape = TileGemmShape, + sequence, + sequence>; + + using TilePartitioner = GemmSpatiallyLocalTilePartitioner; + + using GemmUniversalTraits = TileGemmUniversalTraits; + + using AComputeDataType = ADataType; + using BComputeDataType = BDataType; + + using UniversalGemmProblem = MxGemmPipelineProblem; + + using GemmPipeline = GemmPipelineAgBgCrCompTDMV1< + UniversalGemmProblem, + GemmPipelineAgBgCrCompTDMDefaultPolicy>; + + using GemmEpilogue = TdmEpilogue, // DsDataType + AccDataType, + CDataType, + tuple<>, // DsLayout + CLayout, + element_wise::PassThrough, + TilePartitioner::MPerBlock, + TilePartitioner::NPerBlock, + M_Warp, + N_Warp, + M_Warp_Tile, + N_Warp_Tile, + K_Warp_Tile, + UniversalGemmProblem::TransposeC, + 1, // NumWaveGroups + false, // FixedVectorSize + 1, // VectorSizeC + 1, // BlockedXDLN_PerWarp + GemmConfig::DoubleSmemBuffer, + AComputeDataType, + BComputeDataType>>; + + using Kernel = MxGemmKernel; + + constexpr index_t ScaleBlockSize = GemmConfig::ScaleBlockSize; + + MxGemmHostArgs<1, 1, 0> args({a_dev_buf.GetDeviceBuffer()}, + {scale_a_dev_buf.GetDeviceBuffer()}, + {b_dev_buf.GetDeviceBuffer()}, + {scale_b_dev_buf.GetDeviceBuffer()}, + {}, + c_dev_buf.GetDeviceBuffer(), + 1, // k_batch + M, + N, + K, + {stride_A}, + {stride_B}, + {}, + stride_C); + + auto kargs = Kernel::MakeKernelArgs(args); + + const dim3 grids = Kernel::GridSize(M, N, 1); + const dim3 blocks = Kernel::BlockSize(); + + if(!Kernel::IsSupportedArgument(kargs)) + { + std::cerr << "Wrong! Arguments not supported! Skipping kernel!\n"; + return -1.f; + } + + auto kind_str = [](ck_tile::DataCachePrefetchKind k) { + return k == ck_tile::DataCachePrefetchKind::L1 ? "L1" + : k == ck_tile::DataCachePrefetchKind::L2 ? "L2" + : "None"; + }; + std::cout << "Launching MX GEMM TDM V1 kernel with data cache prefetch" << " (A " + << kind_str(GemmConfig::DataCachePrefetchA) << " / B " + << kind_str(GemmConfig::DataCachePrefetchB) << ")\n" + << " Grid: {" << grids.x << ", " << grids.y << ", " << grids.z << "}" + << ", Blocks: {" << blocks.x << ", " << blocks.y << ", " << blocks.z << "}" + << std::endl; + + float ave_time = + launch_kernel(stream_config{nullptr, true, 1, n_warmup, n_repeat, true, true, 50}, + make_kernel<1>(Kernel{}, grids, blocks, 0, kargs)); + + constexpr int APackedSize = numeric_traits::PackedSize; + constexpr int BPackedSize = numeric_traits::PackedSize; + + std::size_t flop = std::size_t(2) * M * N * K; + std::size_t num_byte = sizeof(ADataType) * M * K / APackedSize + + sizeof(BDataType) * N * K / BPackedSize + sizeof(CDataType) * M * N + + sizeof(AScaleDataType) * M * (K / ScaleBlockSize) + + sizeof(BScaleDataType) * N * (K / ScaleBlockSize); + + float tflops = static_cast(flop) / 1.E9 / ave_time; + float gb_per_sec = num_byte / 1.E6 / ave_time; + + std::cout << " M=" << M << " N=" << N << " K=" << K << " : " << ave_time << " ms, " << tflops + << " TFlops, " << gb_per_sec << " GB/s" << std::endl; + + return ave_time; +} + +auto create_args(int argc, char* argv[]) +{ + ck_tile::ArgParser arg_parser; + arg_parser.insert("m", "128", "m dimension") + .insert("n", "128", "n dimension") + .insert("k", "256", "k dimension") + .insert("stride_a", "0", "Tensor A stride") + .insert("stride_b", "0", "Tensor B stride") + .insert("stride_c", "0", "Tensor C stride") + .insert("v", "1", "0. No validation, 1. Validation on CPU") + .insert("mx_prec", "fp4xfp4", "support: fp4xfp4, fp8xfp8") + .insert("warmup", "50", "number of warmup iterations") + .insert("repeat", "100", "number of benchmark iterations") + .insert("compare", "0", "0: prefetch only, 1: compare with/without prefetch") + .insert("prefetch_a_l1", "0", "0: prefetch A to L2, 1: prefetch A to L1") + .insert("prefetch_b_l1", "0", "0: prefetch B to L2, 1: prefetch B to L1") + .insert("init", "0", "0: random, 1: constant(1)"); + bool result = arg_parser.parse(argc, argv); + return std::make_tuple(result, arg_parser); +} + +/// @brief Pre-shuffle scale buffer for gfx1250 wmma mx scale instruction. +template +void preShuffleScaleBuffer(const ScaleType* src, + ScaleType* dst, + ck_tile::index_t MN, + ck_tile::index_t K) +{ + static_assert(ScaleBlockSize == 32 && sizeof(ScaleType) == 1, + "Only 8-bit scale with ScaleBlockSize=32 supported"); + + constexpr ck_tile::index_t MPerXdlops = 16; + constexpr ck_tile::index_t KPerXdlops = 128; + + int MNPack = 2; + int KPack = 1; + + int MNStep = MPerXdlops; + int KStep = KPerXdlops / ScaleBlockSize; + + int K0 = K / KPack / KStep; + + for(int mn = 0; mn < MN; ++mn) + { + int iMNRepeat = mn / (MNStep * MNPack); + int tempmn = mn % (MNStep * MNPack); + + for(int k = 0; k < K; ++k) + { + int iKRepeat = k / (KStep * KPack); + int tempk = k % (KStep * KPack); + + int outputIndex = (iMNRepeat * MNPack * MNStep) * (KStep * KPack * K0) + + (iKRepeat * KStep * KPack) * (MNStep * MNPack) + + tempmn * (KStep * KPack) + tempk; + + if constexpr(KStride) + dst[outputIndex] = src[mn * K + k]; + else + dst[outputIndex] = src[k * MN + mn]; + } + } +} + +template +int run_mx_gemm_tdm_v1_prefetch(int argc, char* argv[]) +{ + auto [result, arg_parser] = create_args(argc, argv); + if(!result) + return -1; + + using namespace ck_tile; + + constexpr index_t ScaleBlockSize = 32; + + index_t M = arg_parser.get_int("m"); + index_t N = arg_parser.get_int("n"); + index_t K = arg_parser.get_int("k"); + + index_t stride_A = arg_parser.get_int("stride_a"); + index_t stride_B = arg_parser.get_int("stride_b"); + index_t stride_C = arg_parser.get_int("stride_c"); + + index_t init_method = arg_parser.get_int("init"); + index_t n_warmup = arg_parser.get_int("warmup"); + index_t n_repeat = arg_parser.get_int("repeat"); + bool compare = arg_parser.get_int("compare") == 1; + auto prefetch_kind_a = arg_parser.get_int("prefetch_a_l1") == 1 ? DataCachePrefetchKind::L1 + : DataCachePrefetchKind::L2; + auto prefetch_kind_b = arg_parser.get_int("prefetch_b_l1") == 1 ? DataCachePrefetchKind::L1 + : DataCachePrefetchKind::L2; + + stride_A = get_default_stride(M, K, stride_A, is_row_major(ALayout{})); + stride_B = get_default_stride(K, N, stride_B, is_row_major(BLayout{})); + stride_C = get_default_stride(M, N, stride_C, is_row_major(CLayout{})); + + if(K % ScaleBlockSize != 0) + throw std::runtime_error("K must be multiple of ScaleBlockSize"); + + HostTensor a_host(host_tensor_descriptor(M, K, stride_A, is_row_major(ALayout{}))); + HostTensor b_host(host_tensor_descriptor(K, N, stride_B, is_row_major(BLayout{}))); + HostTensor c_rslt_host( + host_tensor_descriptor(M, N, stride_C, is_row_major(CLayout{}))); + + index_t scale_K_dim = K / ScaleBlockSize; + // Pad M to M_Warp_Tile boundary for scale_a (required by hardware layout) + constexpr index_t M_Warp_Tile = MXGemmConfigTDMV1Prefetch::M_Warp_Tile; + index_t scale_padded_M = integer_least_multiple(M, M_Warp_Tile); + + // scale_a: (padded_M, K/ScaleBlockSize) row-major + HostTensor scale_a( + {static_cast(scale_padded_M), static_cast(scale_K_dim)}, + {static_cast(scale_K_dim), std::size_t{1}}); + // scale_b: (N, K/ScaleBlockSize) row-major -> K is the fast-changing dimension + HostTensor scale_b( + {static_cast(N), static_cast(scale_K_dim)}, + {static_cast(scale_K_dim), std::size_t{1}}); + + if(init_method == 0) + { + FillUniformDistribution<>{0.0f, 1.0f}(a_host); + FillUniformDistribution<>{-0.5f, 0.5f}(b_host); + FillUniformDistribution<>{-2.f, 2.f}(scale_a); + FillUniformDistribution<>{-2.f, 2.f}(scale_b); + } + else + { + FillUniformDistribution<>{1.f, 1.f}(a_host); + FillUniformDistribution<>{1.f, 1.f}(b_host); + FillUniformDistribution<>{1.f, 1.f}(scale_a); + FillUniformDistribution<>{1.f, 1.f}(scale_b); + } + + // Pre-shuffle scales for hardware (gfx1250 wmma layout) + HostTensor scale_a_shuffled( + {static_cast(scale_padded_M), static_cast(scale_K_dim)}, + {static_cast(scale_K_dim), std::size_t{1}}); + HostTensor scale_b_shuffled( + {static_cast(N), static_cast(scale_K_dim)}, + {static_cast(scale_K_dim), std::size_t{1}}); + + // Both scale_a and scale_b are row-major (N/M, K/ScaleBlockSize) with K as fast dim + preShuffleScaleBuffer( + scale_a.data(), scale_a_shuffled.data(), scale_padded_M, scale_K_dim); + preShuffleScaleBuffer( + scale_b.data(), scale_b_shuffled.data(), N, scale_K_dim); + + DeviceMem a_dev_buf(a_host.get_element_space_size_in_bytes()); + DeviceMem b_dev_buf(b_host.get_element_space_size_in_bytes()); + DeviceMem c_dev_buf(c_rslt_host.get_element_space_size_in_bytes()); + DeviceMem scale_a_dev_buf(scale_a_shuffled.get_element_space_size_in_bytes()); + DeviceMem scale_b_dev_buf(scale_b_shuffled.get_element_space_size_in_bytes()); + + a_dev_buf.ToDevice(a_host.data()); + b_dev_buf.ToDevice(b_host.data()); + scale_a_dev_buf.ToDevice(scale_a_shuffled.data()); + scale_b_dev_buf.ToDevice(scale_b_shuffled.data()); + c_rslt_host.SetZero(); + + // Run with data cache prefetch enabled + using Kind = DataCachePrefetchKind; + auto kind_str = [](Kind k) { return k == Kind::L1 ? "L1" : "L2"; }; + + std::cout << "\n=== Running MX GEMM with TDM V1 Pipeline - DataCache Prefetch ENABLED (A " + << kind_str(prefetch_kind_a) << " / B " << kind_str(prefetch_kind_b) << ") ===\n" + << std::endl; + + auto run_prefetch = [&](auto prefetch_a_tag, auto prefetch_b_tag) { + using Config = MXGemmConfigTDMV1Prefetch; + return invoke_mx_gemm_tdm_v1(a_dev_buf, + b_dev_buf, + c_dev_buf, + scale_a_dev_buf, + scale_b_dev_buf, + M, + N, + K, + stride_A, + stride_B, + stride_C, + n_warmup, + n_repeat); + }; + + float ave_time_prefetch = 0.f; + ignore = ave_time_prefetch; + if(prefetch_kind_a == Kind::L1 && prefetch_kind_b == Kind::L1) + { + ave_time_prefetch = run_prefetch(std::integral_constant{}, + std::integral_constant{}); + } + else if(prefetch_kind_a == Kind::L1 && prefetch_kind_b == Kind::L2) + { + ave_time_prefetch = run_prefetch(std::integral_constant{}, + std::integral_constant{}); + } + else if(prefetch_kind_a == Kind::L2 && prefetch_kind_b == Kind::L1) + { + ave_time_prefetch = run_prefetch(std::integral_constant{}, + std::integral_constant{}); + } + else + { + ave_time_prefetch = run_prefetch(std::integral_constant{}, + std::integral_constant{}); + } + + c_dev_buf.FromDevice(c_rslt_host.data()); + + // Optionally run without prefetch for comparison + if(compare) + { + std::cout << "\n=== Running MX GEMM with TDM V1 Pipeline - DataCache Prefetch DISABLED " + "===\n" + << std::endl; + + DeviceMem c_dev_buf_noprefetch(c_rslt_host.get_element_space_size_in_bytes()); + + using ConfigNoPrefetch = MXGemmConfigTDMV1Prefetch; + invoke_mx_gemm_tdm_v1(a_dev_buf, + b_dev_buf, + c_dev_buf_noprefetch, + scale_a_dev_buf, + scale_b_dev_buf, + M, + N, + K, + stride_A, + stride_B, + stride_C, + n_warmup, + n_repeat); + + std::cout << "\n=== Comparison Summary ===" << std::endl; + std::cout << "Check timing above to compare performance with/without data cache prefetch." + << std::endl; + } + + // Validation + bool pass = true; + if(arg_parser.get_int("v") == 1) + { + HostTensor c_ref_host( + host_tensor_descriptor(M, N, stride_C, is_row_major(CLayout{}))); + c_ref_host.SetZero(); + + // reference_mx_gemm expects scale_a(M, K/ScaleBlockSize) and scale_b(K/ScaleBlockSize, N) + // Truncate scale_a from padded M to actual M + HostTensor scale_a_ref( + {static_cast(M), static_cast(scale_K_dim)}, + {static_cast(scale_K_dim), std::size_t{1}}); + for(index_t m = 0; m < M; ++m) + for(index_t k = 0; k < scale_K_dim; ++k) + scale_a_ref(m, k) = scale_a(m, k); + + // scale_b is (N, K/ScaleBlockSize) row-major; reference expects (K/ScaleBlockSize, N) + // col-major -> same memory layout, just different descriptor + HostTensor scale_b_ref( + {static_cast(scale_K_dim), static_cast(N)}, + {std::size_t{1}, static_cast(scale_K_dim)}); + std::copy(scale_b.mData.begin(), scale_b.mData.end(), scale_b_ref.mData.begin()); + + reference_mx_gemm(a_host, b_host, c_ref_host, scale_a_ref, scale_b_ref); + + const float rtol = 1e-2; + const float atol = 1e-2; + + pass = check_err(c_rslt_host, c_ref_host, "Error: Incorrect results!", rtol, atol); + + std::cout << "Relative error threshold: " << rtol << " Absolute error threshold: " << atol + << std::endl; + std::cout << "Verification: " << (pass ? "PASSED" : "FAILED") << std::endl; + } + + return pass ? 0 : -1; +} + +int main(int argc, char* argv[]) +{ + auto [result, arg_parser] = create_args(argc, argv); + if(!result) + return EXIT_FAILURE; + + using Row = ck_tile::tensor_layout::gemm::RowMajor; + using Col = ck_tile::tensor_layout::gemm::ColumnMajor; + + std::string prec = arg_parser.get_str("mx_prec"); + + try + { + if(prec == "fp8" || prec == "fp8xfp8") + { + return run_mx_gemm_tdm_v1_prefetch(argc, argv); + } + else if(prec == "fp4" || prec == "fp4xfp4") + { + return run_mx_gemm_tdm_v1_prefetch(argc, argv); + } + else + { + std::cerr << "Unsupported precision: " << prec << ". Supported: fp8, fp4" << std::endl; + return EXIT_FAILURE; + } + } + catch(const std::exception& e) + { + std::cerr << "Error: " << e.what() << std::endl; + return EXIT_FAILURE; + } +} diff --git a/example/ck_tile/20_grouped_convolution/CMakeLists.txt b/example/ck_tile/20_grouped_convolution/CMakeLists.txt index 18e71c255d4..3f199f9cc06 100644 --- a/example/ck_tile/20_grouped_convolution/CMakeLists.txt +++ b/example/ck_tile/20_grouped_convolution/CMakeLists.txt @@ -8,9 +8,6 @@ if(GPU_TARGETS MATCHES "gfx94|gfx95|gfx90a|gfx11|gfx12") add_executable(tile_example_grouped_conv_fwd grouped_convolution_forward.cpp) target_compile_options(tile_example_grouped_conv_fwd PRIVATE ${EXAMPLE_CONV_COMPILE_OPTIONS}) - add_executable(tile_example_grouped_conv_fwd_large_tensor grouped_convolution_forward_large_tensor.cpp) - target_compile_options(tile_example_grouped_conv_fwd_large_tensor PRIVATE ${EXAMPLE_CONV_COMPILE_OPTIONS}) - add_executable(tile_example_grouped_conv_fwd_bias_clamp grouped_convolution_forward_bias_clamp.cpp) target_compile_options(tile_example_grouped_conv_fwd_bias_clamp PRIVATE ${EXAMPLE_GEMM_COMPILE_OPTIONS}) @@ -18,7 +15,7 @@ if(GPU_TARGETS MATCHES "gfx94|gfx95|gfx90a|gfx11|gfx12") target_compile_options(tile_example_grouped_conv_bwd_weight PRIVATE ${EXAMPLE_CONV_COMPILE_OPTIONS}) # StreamK requires cross-CU coherence (StreamKCoherency), CDNA only. - if(GPU_TARGETS MATCHES "gfx90a|gfx942|gfx950") + if(GPU_TARGETS MATCHES "gfx90a|gfx942|gfx950|gfx1250") add_executable(tile_example_grouped_conv_bwd_weight_streamk grouped_convolution_backward_weight_streamk.cpp) target_compile_options(tile_example_grouped_conv_bwd_weight_streamk PRIVATE ${EXAMPLE_CONV_COMPILE_OPTIONS}) endif() diff --git a/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_data_invoker.hpp b/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_data_invoker.hpp index 1679fec7dfc..cdecdac9146 100644 --- a/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_data_invoker.hpp +++ b/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_data_invoker.hpp @@ -45,6 +45,8 @@ struct GroupedConvolutionBackwardDataInvoker GroupedConvTraitsType::FixedGemmParams::TilePartitionerGroupNum, GroupedConvTraitsType::FixedGemmParams::TilePartitionerM01>; + constexpr bool LargeTensors = false; + using GemmUniversalTraits = ck_tile::TileGemmUniversalTraits< GroupedConvTraitsType::FixedGemmParams::kPadM, GroupedConvTraitsType::FixedGemmParams::kPadN, @@ -56,7 +58,13 @@ struct GroupedConvolutionBackwardDataInvoker GroupedConvTraitsType::FixedGemmParams::TransposeC, GroupedConvTraitsType::FixedGemmParams::UseStructuredSparsity, GroupedConvTraitsType::FixedGemmParams::Persistent, - ConvConfig::NumWaveGroups>; + ConvConfig::NumWaveGroups, + GroupedConvTraitsType::FixedGemmParams::Preshuffle, + GroupedConvTraitsType::FixedGemmParams::LDSVectorSize, + ck_tile::DataCachePrefetchKind::None, + ck_tile::DataCachePrefetchKind::None, + false, /*Async*/ + LargeTensors>; constexpr auto scheduler = ConvConfig::Scheduler; using UniversalGemmProblem = ck_tile::UniversalGemmPipelineProblem< diff --git a/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_weight_invoker.hpp b/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_weight_invoker.hpp index 533abdd3391..2b38e68650a 100644 --- a/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_weight_invoker.hpp +++ b/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_weight_invoker.hpp @@ -64,6 +64,8 @@ struct GroupedConvolutionBackwardWeightInvoker using TilePartitioner = typename PartitionerPolicy::template type; + constexpr bool LargeTensors = false; + using GemmUniversalTraits = ck_tile::TileGemmUniversalTraits< GroupedConvTraitsType::FixedGemmParams::kPadM, GroupedConvTraitsType::FixedGemmParams::kPadN, @@ -75,7 +77,13 @@ struct GroupedConvolutionBackwardWeightInvoker GroupedConvTraitsType::FixedGemmParams::TransposeC, GroupedConvTraitsType::FixedGemmParams::UseStructuredSparsity, GroupedConvTraitsType::FixedGemmParams::Persistent, - ConvConfig::NumWaveGroups>; + ConvConfig::NumWaveGroups, + GroupedConvTraitsType::FixedGemmParams::Preshuffle, + GroupedConvTraitsType::FixedGemmParams::LDSVectorSize, + ck_tile::DataCachePrefetchKind::None, + ck_tile::DataCachePrefetchKind::None, + false, /*Async*/ + LargeTensors>; constexpr auto scheduler = ConvConfig::Scheduler; using UniversalGemmProblem = ck_tile::UniversalGemmPipelineProblem< diff --git a/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_weight_two_stage_invoker.hpp b/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_weight_two_stage_invoker.hpp index 68c85e9495f..e277e1fd31a 100644 --- a/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_weight_two_stage_invoker.hpp +++ b/example/ck_tile/20_grouped_convolution/grouped_convolution_backward_weight_two_stage_invoker.hpp @@ -50,6 +50,8 @@ struct GroupedConvolutionBackwardWeightTwoStageInvoker GroupedConvTraitsType::FixedGemmParams::TilePartitionerGroupNum, GroupedConvTraitsType::FixedGemmParams::TilePartitionerM01>; + constexpr bool LargeTensors = false; + using GemmUniversalTraits = ck_tile::TileGemmUniversalTraits< GroupedConvTraitsType::FixedGemmParams::kPadM, GroupedConvTraitsType::FixedGemmParams::kPadN, @@ -61,7 +63,13 @@ struct GroupedConvolutionBackwardWeightTwoStageInvoker GroupedConvTraitsType::FixedGemmParams::TransposeC, GroupedConvTraitsType::FixedGemmParams::UseStructuredSparsity, GroupedConvTraitsType::FixedGemmParams::Persistent, - ConvConfig::NumWaveGroups>; + ConvConfig::NumWaveGroups, + GroupedConvTraitsType::FixedGemmParams::Preshuffle, + GroupedConvTraitsType::FixedGemmParams::LDSVectorSize, + ck_tile::DataCachePrefetchKind::None, + ck_tile::DataCachePrefetchKind::None, + false, /*Async*/ + LargeTensors>; constexpr auto scheduler = ConvConfig::Scheduler; diff --git a/example/ck_tile/20_grouped_convolution/grouped_convolution_forward_invoker.hpp b/example/ck_tile/20_grouped_convolution/grouped_convolution_forward_invoker.hpp index a396dd82cbf..7fb246f5ab6 100644 --- a/example/ck_tile/20_grouped_convolution/grouped_convolution_forward_invoker.hpp +++ b/example/ck_tile/20_grouped_convolution/grouped_convolution_forward_invoker.hpp @@ -1,12 +1,6 @@ // Copyright (c) Advanced Micro Devices, Inc., or its affiliates. // SPDX-License-Identifier: MIT -// Regular grouped convolution invoker (no split-image) -// This invoker demonstrates regular convolution without split-image. -// It always uses Kernel (split-image disabled). -// For large images that require split-image, use -// grouped_convolution_forward_split_image_invoker.hpp - #pragma once #include "grouped_convolution_utils.hpp" @@ -53,6 +47,8 @@ struct GroupedConvolutionForwardInvoker GroupedConvTraitsType::FixedGemmParams::TilePartitionerGroupNum, GroupedConvTraitsType::FixedGemmParams::TilePartitionerM01>; + constexpr bool LargeTensors = false; + using GemmUniversalTraits = ck_tile::TileGemmUniversalTraits< GroupedConvTraitsType::FixedGemmParams::kPadM, GroupedConvTraitsType::FixedGemmParams::kPadN, @@ -64,7 +60,13 @@ struct GroupedConvolutionForwardInvoker GroupedConvTraitsType::FixedGemmParams::TransposeC, GroupedConvTraitsType::FixedGemmParams::UseStructuredSparsity, GroupedConvTraitsType::FixedGemmParams::Persistent, - ConvConfig::NumWaveGroups>; + ConvConfig::NumWaveGroups, + GroupedConvTraitsType::FixedGemmParams::Preshuffle, + GroupedConvTraitsType::FixedGemmParams::LDSVectorSize, + ck_tile::DataCachePrefetchKind::None, + ck_tile::DataCachePrefetchKind::None, + false, /*Async*/ + LargeTensors>; constexpr auto scheduler = ConvConfig::Scheduler; // ===================================================================== diff --git a/example/ck_tile/20_grouped_convolution/grouped_convolution_forward_large_tensor.cpp b/example/ck_tile/20_grouped_convolution/grouped_convolution_forward_large_tensor.cpp deleted file mode 100644 index 9a7eb7082a9..00000000000 --- a/example/ck_tile/20_grouped_convolution/grouped_convolution_forward_large_tensor.cpp +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Advanced Micro Devices, Inc., or its affiliates. -// SPDX-License-Identifier: MIT - -// Large tensor grouped convolution example -// This example demonstrates convolution for large tensors that exceed memory limits. -// It uses automatic tensor splitting when needed to handle large images. -// For regular convolution without tensor splitting, use grouped_convolution_forward.cpp - -#include - -#include -#include -#include -#include -#include - -#include "ck_tile/host.hpp" -#include "grouped_convolution_utils.hpp" -#include "grouped_convolution_forward_large_tensor_invoker.hpp" -#include "run_grouped_convolution_fwd_example.inc" - -template