Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

236 lines
11 KiB
Python

################################################################################
#
# Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
################################################################################
from ..Component import Signature
from ..Common import globalParameters, getCOVFromParam, gfxName
from math import ceil
def getSrcValueType(kernel, isTypeA):
# special cases for F8 datatypes
if kernel["ProblemType"]["DataType"].isFloat8():
srcValueType = "FP8"
elif kernel["ProblemType"]["DataType"].isBFloat8():
srcValueType = "BF8"
elif kernel["ProblemType"]["DataType"].isFloat8BFloat8():
srcValueType = "FP8" if isTypeA else "BF8"
elif kernel["ProblemType"]["DataType"].isBFloat8Float8():
srcValueType = "BF8" if isTypeA else "FP8"
else:
srcValueType = kernel["ProblemType"]["DataType"].toNameAbbrev().upper()
srcValueType = srcValueType.lower()
return srcValueType
def getDstValueType(kernel):
# special cases for F8 datatypes
if kernel["ProblemType"]["DataType"].isFloat8():
dstValueType = "FP8"
elif kernel["ProblemType"]["DataType"].isBFloat8():
dstValueType = "BF8"
else:
dstValueType = kernel["ProblemType"]["DataType"].toNameAbbrev().upper()
dstValueType = dstValueType.lower()
return dstValueType
# Creates kernel header, compatible with code object version 4 and up. V2 and V3 no longer supported.
class SignatureDefault(Signature):
# Formats an argument to add to the header
def addArgument(self, name, size, offset, valueKind, valueType = None, AddrSpaceQual = None):
self.offset += size
if valueType is None:
valueType = f"u{size*8}"
kStr = ""
kStr += " - .name: %s\n" % name
kStr += " .size: %s\n" % size
kStr += " .offset: %s\n" % offset
kStr += " .value_kind: %s\n" % valueKind
kStr += " .value_type: %s\n" % valueType
if AddrSpaceQual != None:
kStr += " .address_space: %s\n" % AddrSpaceQual
return kStr
def __call__(self, writer):
kernel = writer.kernel
kStr = self.commentHeader()
# begin kernel descriptor
kStr += ".amdgcn_target \"amdgcn-amd-amdhsa--%s\"%s" \
% (gfxName(writer.version), writer.endLine)
kStr += ".text%s" % writer.endLine
kStr += ".protected %s%s" % (writer.kernelName, writer.endLine)
kStr += ".globl %s%s" % (writer.kernelName, writer.endLine)
kStr += ".p2align 8%s" % writer.endLine
kStr += ".type %s,@function%s" % (writer.kernelName, writer.endLine)
kStr += ".section .rodata,#alloc%s" % writer.endLine
kStr += ".p2align 6%s" % writer.endLine
tWord = "amdhsa_kernel"
kStr += ".%s %s%s" % (tWord, writer.kernelName, writer.endLine)
tWord = ".amdhsa_user_sgpr_kernarg_segment_ptr"
kStr += " %s 1%s" % (tWord, writer.endLine)
supportsPreload = globalParameters["AsmCaps"][writer.version]["KernargPreloading"]
numPreloaded = 0
numUserSgprs = 2
if kernel["PreloadKernelArguments"] == 1:
numPreloaded = writer.sgprPool.numPreloadSGPRs
numUserSgprs += numPreloaded
if supportsPreload:
kStr += f" .amdhsa_user_sgpr_kernarg_preload_offset 0{writer.endLine}"
kStr += f" .amdhsa_user_sgpr_kernarg_preload_length {numPreloaded}{writer.endLine}"
kStr += f" .amdhsa_user_sgpr_count {numUserSgprs}{writer.endLine}"
# kern arg size
kernArgReg = 0
kernArgReg += 3*writer.rpga
kernArgReg += max(1,int(writer.bpeAB/4)) # alpha
if kernel["ProblemType"]["UseBeta"]:
kernArgReg += max(1,int(writer.bpeCexternal/4)) # beta
kernArgReg += kernel["ProblemType"]["NumIndicesC"] # strides
kernArgReg += kernel["ProblemType"]["NumIndicesC"] # strides
kernArgReg += len(kernel["ProblemType"]["IndexAssignmentsA"]) # strides
kernArgReg += len(kernel["ProblemType"]["IndexAssignmentsB"]) # strides
if not kernel["ProblemType"]["UseInitialStridesAB"]:
kernArgReg -= 2 # strides
if not kernel["ProblemType"]["UseInitialStridesCD"]:
kernArgReg -= 2 # strides
kernArgReg += kernel["ProblemType"]["NumIndicesSummation"]
kernArgReg += kernel["ProblemType"]["NumIndicesC"]
if globalParameters["DebugKernel"]:
kernArgReg += writer.rpga # debug buffer
# kernArgBytes = kernArgReg * 4 # bytes/reg
# register allocation
totalVgprs = writer.vgprPool.size()
totalSgprs = writer.sgprPool.size()
# accumulator offset for Unified Register Files
vgprCount = totalVgprs
if writer.archCaps["ArchAccUnifiedRegs"]:
agprStart = ceil(totalVgprs/8)*8
vgprCount = agprStart + writer.agprPool.size()
tWord = ".amdhsa_accum_offset"
kStr += " %s %u // accvgpr offset%s" % (tWord, agprStart, writer.endLine)
tWord = ".amdhsa_next_free_vgpr"
kStr += " %s %u // vgprs%s" % (tWord, vgprCount, writer.endLine)
tWord = ".amdhsa_next_free_sgpr"
kStr += " %s %u // sgprs%s" % (tWord, totalSgprs, writer.endLine)
tWord = ".amdhsa_group_segment_fixed_size"
if kernel["AggressivePerfMode"]>=2 and kernel["ProblemType"]["DataType"].isDouble() and \
kernel["ThreadTile0"] == 4 and kernel["ThreadTile1"] == 4 and kernel["WorkGroup"] == [16,16,1]:
group_segment_size = 32768 # Pad LDS to ensure we run exactly two waves
else:
group_segment_size = kernel["LdsNumElements"] * writer.bpeAB
kStr += " %s %u // lds bytes%s" % ( tWord, group_segment_size, writer.endLine )
if writer.archCaps["HasWave32"]:
if kernel["WavefrontSize"] == 32:
kStr += " .amdhsa_wavefront_size32 1 // 32-thread wavefronts%s" % writer.endLine
else:
kStr += " .amdhsa_wavefront_size32 0 // 64-thread wavefronts%s" % writer.endLine
# other
kStr += " .amdhsa_private_segment_fixed_size 0%s" % writer.endLine
kStr += " .amdhsa_system_sgpr_workgroup_id_x 1%s" % writer.endLine
kStr += " .amdhsa_system_sgpr_workgroup_id_y 1%s" % writer.endLine
kStr += " .amdhsa_system_sgpr_workgroup_id_z %u%s" % (1 if kernel["ProblemType"]["NumIndicesC"] > 2 else 0, writer.endLine)
kStr += " .amdhsa_system_vgpr_workitem_id 0%s" % writer.endLine
kStr += " .amdhsa_float_denorm_mode_32 3%s" % writer.endLine
kStr += " .amdhsa_float_denorm_mode_16_64 3%s" % writer.endLine
kStr += ".end_amdhsa_kernel%s" % writer.endLine
kStr += ".text%s" % writer.endLine
kStr += writer.comment3("Optimizations and Config:")
kStr += writer.comment1("ThreadTile= %u x %u" % (kernel["ThreadTile0"], kernel["ThreadTile1"]))
kStr += writer.comment1("SubGroup= %u x %u" % (kernel["SubGroup0"], kernel["SubGroup1"]))
if kernel["EnableMatrixInstruction"]:
kStr += writer.comment1("VectorWidthA=%u" % (kernel["VectorWidthA"]))
kStr += writer.comment1("VectorWidthB=%u" % (kernel["VectorWidthB"]))
else:
kStr += writer.comment1("VectorWidth=%u" % (kernel["VectorWidth"]))
glvw = kernel["GlobalLoadVectorWidthA"]
glvwAStr = "GlobalLoadVectorWidthA=%f"%glvw if glvw < 1 else "GlobalLoadVectorWidthA=%u"%glvw
glvw = kernel["GlobalLoadVectorWidthB"]
glvwBStr = "GlobalLoadVectorWidthB=%f"%glvw if glvw < 1 else "GlobalLoadVectorWidthB=%u"%glvw
kStr += writer.comment1("%s, %s" % (glvwAStr, glvwBStr))
kStr += writer.comment1("DirectToLdsA=%s" % kernel["DirectToLdsA"])
kStr += writer.comment1("DirectToLdsB=%s" % kernel["DirectToLdsB"])
kStr += writer.comment1("UseSgprForGRO=%s" % kernel["_UseSgprForGRO"])
kStr += ".amdgpu_metadata\n"
kStr += "---\n"
kStr += "amdhsa.version:\n"
kStr += " - 1\n"
cov = getCOVFromParam(kernel["CodeObjectVersion"])
if cov == 4:
kStr += " - 1\n"
elif cov == 5:
kStr += " - 2\n"
kStr += "amdhsa.target: amdgcn-amd-amdhsa--%s%s" \
% (gfxName(writer.version), writer.endLine)
kStr += "amdhsa.kernels:\n"
kStr += " - .name: %s%s" % (writer.kernelName, writer.endLine)
kStr += " .symbol: '%s.kd'%s" % (writer.kernelName, writer.endLine)
kStr += " .language: %s%s" % ("OpenCL C", writer.endLine)
kStr += " .language_version:%s" % writer.endLine
kStr += " - 2%s" % writer.endLine
kStr += " - 0%s" % writer.endLine
kStr += " .args:%s" % writer.endLine
self.offset = 0
for arg in writer.sgprPool.kernargs:
kStr += self.addArgument(name=arg['name'], size=arg['size']*4, offset=self.offset, valueKind="by_value")
kStr += " .group_segment_fixed_size: %u%s" % ( group_segment_size, writer.endLine ) #XXXXXX
kStr += " .kernarg_segment_align: %u%s" % ( 8, writer.endLine )
kStr += " .kernarg_segment_size: %u%s" % (((self.offset+7)//8)*8, writer.endLine) # round up to .kernarg_segment_align
kStr += " .max_flat_workgroup_size: %u%s" % ( kernel["SubGroup0"] * kernel["SubGroup1"] * kernel["LocalSplitU"], writer.endLine )
kStr += " .private_segment_fixed_size: %u%s" % ( 0, writer.endLine )
kStr += " .sgpr_count: %u%s" % ( totalSgprs, writer.endLine )
kStr += " .sgpr_spill_count: %u%s" % ( 0, writer.endLine )
kStr += " .vgpr_count: %u%s" % ( totalVgprs, writer.endLine )
kStr += " .vgpr_spill_count: %u%s" % ( 0, writer.endLine )
kStr += " .wavefront_size: %u%s" % ( kernel["WavefrontSize"], writer.endLine )
kStr += "...\n"
kStr += ".end_amdgpu_metadata\n"
kStr += "%s:%s" % (writer.kernelName, writer.endLine)
return kStr