Files
TheRock/rocm-libraries/projects/hipblaslt/tensilelite/Tensile/Tests/unit/test_SubtileBasedSchedulerRef.py
T
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

1829 lines
67 KiB
Python

"""Non-regression tests for LogicalScheduler — exact output checks.
These tests capture the expected scheduling output at specific pipeline steps
to detect unintended regressions.
"""
from Tensile.Components.Subtile.Kernel import (
TileInfo, AB_B8, AB_B16, AB_B4, MXSA_B4, MXSB_B4, CD_F32,
)
from Tensile.Components.Subtile.LogicalScheduler import (
GRPlacementStrategy,
LogicalScheduler,
ReadGranularity,
SchedulerConfig,
)
def makeTileInfo(tc, kernel):
"""Compatibility wrapper: select geometry from kernel config and return TileInfo."""
fp4 = kernel["ProblemType"].get("MXBlockA", 0) > 0
_geo = {
'A': AB_B4 if fp4 else AB_B16,
'B': AB_B4 if fp4 else AB_B16,
'MXSA': MXSA_B4,
'MXSB': MXSB_B4,
'D': CD_F32,
}
return TileInfo(_geo[tc], tc, None, kernel)
def create_kernel(MT0=256, MT1=256, fp4=False, depthU=None, waveGroup=(2, 2)):
from unittest.mock import MagicMock
mxblock = 32 if fp4 else 0
bpe = 0.5 if fp4 else 2
matrixInstK = 128 if fp4 else 32
if depthU is None:
depthU = 256 if fp4 else 64
dtype = MagicMock()
dtype.numBytes.return_value = bpe
problemType = {
"DataTypeA": dtype,
"DataTypeB": dtype,
"ComputeDataType": MagicMock(**{"numBytes.return_value": 4}),
}
if fp4:
problemType["MXBlockA"] = mxblock
problemType["MXBlockB"] = mxblock
kernel = {
"DepthU": depthU,
"_DepthUA": depthU,
"_DepthUB": depthU,
"MacroTileA": MT0,
"MacroTileB": MT1,
"MacroTile0": MT0,
"MacroTile1": MT1,
"MatrixInstM": 16,
"MatrixInstN": 16,
"MatrixInstK": matrixInstK,
"MIWaveGroup": list(waveGroup),
"WavefrontSize": 64,
"SourceSwap": False,
"MIArchVgpr": False,
"NonTemporalA": 0,
"NonTemporalB": 0,
"NonTemporalMXSA": 0,
"NonTemporalMXSB": 0,
"ProblemType": problemType,
}
if fp4:
kernel["_DepthUMXSA"] = depthU // mxblock
kernel["_DepthUMXSB"] = depthU // mxblock
return kernel
def make_256x256_bf16():
kernel = create_kernel(256, 256, fp4=False, depthU=64)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
)
EXPECTED_EMIT_DEP_ORDER_256x256_BF16_1x1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-7] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-7]
[ 2] lr LR B (MT n, subIterK [1]) [0-7]
[ 5] wait_lr wait_lr
[ 6] sync sync
[ 7] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+2, subIterK [0,1]) ids [0-7]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-7] , B : [0-7] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 5] wait_gr wait_gr(A=8)
[ 6] sync sync
[ 7] lr_inc lr_inc(A)
[ 8] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-7]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-7]
path 1:
[ 9] gr_inc gr_inc(B)
[ 3] gr GR B (MT n+2, subIterK [0,1]) ids [0-7]
"""
def make_384x256_bf16():
kernel = create_kernel(384, 256, fp4=False, depthU=64)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
partitionSizeM=6,
)
EXPECTED_EMIT_DEP_ORDER_384x256_BF16_2x1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-5] , B : [0-7] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-5]
[ 2] lr LR B (MT n, subIterK [1]) [0-7]
path 1:
[ 3] gr GR A (MT n+1, subIterK [0,1]) ids [6-10]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-5] , B : [0-7] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 5] wait_gr wait_gr(A=11,B=8)
[ 6] sync sync
[ 1] lr LR A (MT n, subIterK [0]) [6-11]
path 1:
[ 2] gr GR A (MT n+1, subIterK [0,1]) ids [11-11]
[ 7] sync sync
[ 8] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+2, subIterK [0,1]) ids [0-3]
Partition 1:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [6-11] , B : [0-7] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [6-11]
path 1:
[ 2] gr GR A (MT n+2, subIterK [0,1]) ids [4-5]
[ 5] gr_inc gr_inc(B)
[ 3] gr GR B (MT n+2, subIterK [0,1]) ids [0-2]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [6-11] , B : [0-7] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 5] wait_gr wait_gr(A=12,B=3)
[ 6] sync sync
[ 7] lr_inc lr_inc(A)
[ 8] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-5]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-7]
path 1:
[ 3] gr GR B (MT n+2, subIterK [0,1]) ids [3-7]
"""
def test_384x256_bf16_partition_2x1():
"""Exact check of emit dependency order for 384x256 BF16, 2x1 partition."""
cfg = make_384x256_bf16()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_384x256_BF16_2x1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_384x256_BF16_2x1}\n"
f"--- Actual ---\n{actual}"
)
def test_256x256_bf16_partition_1x1():
"""Exact check of emit dependency order for 256x256 BF16, 1x1 partition."""
cfg = make_256x256_bf16()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_BF16_1x1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_BF16_1x1}\n"
f"--- Actual ---\n{actual}"
)
EXPECTED_EMIT_DEP_ORDER_256x256_BF16_GFX1250_TDM = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-7] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-7]
[ 2] lr LR B (MT n, subIterK [1]) [0-7]
[ 6] wait_lr wait_lr
[ 7] sync sync
[ 8] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+2, subIterK [0,1]) ids [0-7]
[ 9] gr_inc gr_inc(B)
[ 4] gr GR B (MT n+2, subIterK [0,1]) ids [0-7]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-7] , B : [0-7] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 4] wait_gr wait_gr(A=8,B=8)
[ 5] sync sync
[ 6] lr_inc lr_inc(A)
[ 7] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-7]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-7]
"""
def make_256x256_bf16_gfx1250_tdm():
"""gfx1250 TDM variant of make_256x256_bf16.
Equivalent CLI: --arch gfx1250 --mt0 256 --mt1 256 --du 64 --dtype bf16
--pgr 2 --wg 2x2 --partition-size 0x0
TDM enabled on both A and B (gfx1250). With TDM on, GR uses
tensor_load_to_lds and does not need to be spread across subIterKs —
GRPlacementStrategy.BUNCHED pins all GR atoms to partition 0 / subIterK 0.
"""
kernel = create_kernel(256, 256, fp4=False, depthU=64)
kernel["enableTDMA"] = True
kernel["enableTDMB"] = True
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
grPlacement=GRPlacementStrategy.BUNCHED,
)
def test_256x256_bf16_gfx1250_tdm_partition_1x1():
"""Exact check of emit dep order for 256x256 BF16 gfx1250+TDM, 1x1 partition.
With TDM, every GR atom is pinned to subIterK=0 (grAllInFirstSlot=True).
The expected output below differs from the non-TDM case in that the GR B
placement moves from subIterK=1 to subIterK=0.
"""
cfg = make_256x256_bf16_gfx1250_tdm()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_BF16_GFX1250_TDM, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_BF16_GFX1250_TDM}\n"
f"--- Actual ---\n{actual}"
)
def make_320x320_bf16():
kernel = create_kernel(320, 320, fp4=False, depthU=64)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
partitionSizeN=2,
)
EXPECTED_EMIT_DEP_ORDER_320x320_BF16_1x5 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-9] , B : [0-1] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-9]
[ 2] lr LR B (MT n, subIterK [1]) [0-1]
path 1:
[ 3] gr GR B (MT n+1, subIterK [0,1]) ids [2-3]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-9] , B : [0-1] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 4] wait_gr wait_gr(A=10,B=10)
[ 5] sync sync
[ 1] lr LR B (MT n, subIterK [0]) [2-3]
path 1:
[ 2] gr GR B (MT n+1, subIterK [0,1]) ids [4-5]
Partition 1:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-9] , B : [2-3] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [1]) [2-3]
path 1:
[ 2] gr GR B (MT n+1, subIterK [0,1]) ids [6-7]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-9] , B : [2-3] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 4] wait_gr wait_gr(A=10,B=12)
[ 5] sync sync
[ 1] lr LR B (MT n, subIterK [0]) [4-5]
path 1:
[ 2] gr GR B (MT n+1, subIterK [0,1]) ids [8-9]
Partition 2:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-9] , B : [4-5] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [1]) [4-5]
path 1:
[ 4] gr_inc gr_inc(A)
[ 2] gr GR A (MT n+2, subIterK [0,1]) ids [0-1]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-9] , B : [4-5] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 4] wait_gr wait_gr(A=12,B=12)
[ 5] sync sync
[ 1] lr LR B (MT n, subIterK [0]) [6-7]
path 1:
[ 2] gr GR A (MT n+2, subIterK [0,1]) ids [2-3]
Partition 3:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-9] , B : [6-7] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [1]) [6-7]
path 1:
[ 2] gr GR A (MT n+2, subIterK [0,1]) ids [4-5]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-9] , B : [6-7] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 4] wait_gr wait_gr(A=16,B=10)
[ 5] sync sync
[ 1] lr LR B (MT n, subIterK [0]) [8-9]
path 1:
[ 2] gr GR A (MT n+2, subIterK [0,1]) ids [6-7]
Partition 4:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-9] , B : [8-9] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [1]) [8-9]
path 1:
[ 2] gr GR A (MT n+2, subIterK [0,1]) ids [8-9]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-9] , B : [8-9] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 5] wait_gr wait_gr(A=10,B=8)
[ 6] sync sync
[ 7] lr_inc lr_inc(A)
[ 8] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-9]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-1]
path 1:
[ 9] gr_inc gr_inc(B)
[ 3] gr GR B (MT n+2, subIterK [0,1]) ids [0-1]
"""
def test_320x320_bf16_partition_1x5():
"""Exact check of emit dependency order for 320x320 BF16, 1x5 partition."""
cfg = make_320x320_bf16()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_320x320_BF16_1x5, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_320x320_BF16_1x5}\n"
f"--- Actual ---\n{actual}"
)
def make_320x320_bf16_gfx1250_tdm():
"""gfx1250 TDM variant of make_320x320_bf16 (1x5 partition).
Equivalent CLI: --arch gfx1250 --mt0 320 --mt1 320 --du 64 --dtype bf16
--pgr 2 --wg 2x2 --partition-size 0x2
TDM enabled on both A and B (gfx1250). With TDM on, GR uses
tensor_load_to_lds and GRPlacementStrategy.BUNCHED bunches the GR atoms
rather than spreading them across subIterKs.
"""
kernel = create_kernel(320, 320, fp4=False, depthU=64)
kernel["enableTDMA"] = True
kernel["enableTDMB"] = True
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=tiA.localMMATileGrid[0], k=2),
grB=ReadGranularity(mn=tiB.localMMATileGrid[0], k=2),
partitionSizeN=2,
grPlacement=GRPlacementStrategy.BUNCHED,
)
EXPECTED_EMIT_DEP_ORDER_320x320_BF16_GFX1250_TDM_1x5 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-9] , B : [0-1] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-9]
[ 2] lr LR B (MT n, subIterK [1]) [0-1]
[ 5] wait_lr wait_lr
[ 6] sync sync
[ 7] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+2, subIterK [0,1]) ids [0-9]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-9] , B : [0-1] <- [2]
preMFMA path 0:
[ 2] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [0]) [2-3]
Partition 1:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-9] , B : [2-3] <- [2]
preMFMA path 0:
[ 2] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [1]) [2-3]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-9] , B : [2-3] <- [2]
preMFMA path 0:
[ 2] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [0]) [4-5]
Partition 2:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-9] , B : [4-5] <- [2]
preMFMA path 0:
[ 2] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [1]) [4-5]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-9] , B : [4-5] <- [2]
preMFMA path 0:
[ 2] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [0]) [6-7]
Partition 3:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-9] , B : [6-7] <- [2]
preMFMA path 0:
[ 2] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [1]) [6-7]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-9] , B : [6-7] <- [2]
preMFMA path 0:
[ 2] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [0]) [8-9]
Partition 4:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-9] , B : [8-9] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 1] lr LR B (MT n, subIterK [1]) [8-9]
[ 4] wait_lr wait_lr
[ 5] sync sync
[ 6] gr_inc gr_inc(B)
[ 2] gr GR B (MT n+2, subIterK [0,1]) ids [0-9]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-9] , B : [8-9] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 4] wait_gr wait_gr(A=1,B=1)
[ 5] sync sync
[ 6] lr_inc lr_inc(A)
[ 7] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-9]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-1]
"""
def test_320x320_bf16_gfx1250_tdm_partition_1x5():
"""Exact check of emit dep order for 320x320 BF16 gfx1250+TDM, 1x5 partition."""
cfg = make_320x320_bf16_gfx1250_tdm()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_320x320_BF16_GFX1250_TDM_1x5, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_320x320_BF16_GFX1250_TDM_1x5}\n"
f"--- Actual ---\n{actual}"
)
def make_256x256_bf16_pgr0():
kernel = create_kernel(256, 256, fp4=False, depthU=64)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
pgr=0,
)
EXPECTED_EMIT_DEP_ORDER_256x256_BF16_PGR0 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-7] <- [7]
preMFMA path 0:
[ 3] gr GR A (MT n, subIterK [0,1]) ids [0-7]
[ 5] gr_inc gr_inc(A)
[ 4] gr GR B (MT n, subIterK [0,1]) ids [0-7]
[ 6] gr_inc gr_inc(B)
[ 8] wait_gr wait_gr(0)
[ 9] sync sync
[ 1] lr LR A (MT n, subIterK [0]) [0-7]
[ 2] lr LR B (MT n, subIterK [0]) [0-7]
[ 7] wait_lr wait_lr
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-7] , B : [0-7] <- [5]
preMFMA path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-7]
[ 3] lr_inc lr_inc(A)
[ 2] lr LR B (MT n, subIterK [1]) [0-7]
[ 4] lr_inc lr_inc(B)
[ 5] wait_lr wait_lr
"""
def test_256x256_bf16_pgr0():
"""Exact check of emit dependency order for 256x256 BF16, PGR0."""
cfg = make_256x256_bf16_pgr0()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_BF16_PGR0, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_BF16_PGR0}\n"
f"--- Actual ---\n{actual}"
)
def make_256x256_bf16_pgr1():
kernel = create_kernel(256, 256, fp4=False, depthU=64)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
pgr=1,
)
EXPECTED_EMIT_DEP_ORDER_256x256_BF16_PGR1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-7] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-7]
[ 2] lr LR B (MT n, subIterK [1]) [0-7]
path 1:
[ 6] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+1, subIterK [0,1]) ids [0-7]
[ 7] gr_inc gr_inc(B)
[ 4] gr GR B (MT n+1, subIterK [0,1]) ids [0-7]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-7] , B : [0-7] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 4] wait_gr wait_gr(0)
[ 5] sync sync
[ 6] lr_inc lr_inc(A)
[ 7] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-7]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-7]
"""
def test_256x256_bf16_pgr1():
"""Exact check of emit dependency order for 256x256 BF16, PGR1."""
cfg = make_256x256_bf16_pgr1()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_BF16_PGR1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_BF16_PGR1}\n"
f"--- Actual ---\n{actual}"
)
def make_256x256_fp4():
kernel = create_kernel(256, 256, fp4=True, depthU=256)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
scaleTiA = makeTileInfo('MXSA', kernel)
scaleTiB = makeTileInfo('MXSB', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
lrSA=ReadGranularity(mn=2, k=2),
lrSB=ReadGranularity(mn=2, k=2),
grSA=ReadGranularity(mn=scaleTiA.localMMATileGrid[0], k=scaleTiA.localMMATileGrid[1]),
grSB=ReadGranularity(mn=scaleTiB.localMMATileGrid[0], k=scaleTiB.localMMATileGrid[1]),
)
EXPECTED_EMIT_DEP_ORDER_256x256_FP4_1x1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-7] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-7]
[ 2] lr LR B (MT n, subIterK [1]) [0-7]
[ 6] wait_lr wait_lr
[ 7] sync sync
[ 8] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+2, subIterK [0,1]) ids [0-7]
[ 9] gr_inc gr_inc(B)
[ 4] gr GR B (MT n+2, subIterK [0,1]) ids [0-0]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-7] , B : [0-7] <- [8]
preMFMA path 0:
[ 8] wait_lr wait_lr
path 0:
[ 9] wait_gr wait_gr(A=8,B=1)
[10] sync sync
[11] lr_inc lr_inc(A)
[12] lr_inc lr_inc(B)
[13] lr_inc lr_inc(SA)
[14] lr_inc lr_inc(SB)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-7]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-7]
[ 3] lr LR SA (MT n+1, subIterK [0,1]) [0-7]
[ 4] lr LR SB (MT n+1, subIterK [0,1]) [0-7]
path 1:
[ 5] gr GR B (MT n+2, subIterK [0,1]) ids [1-7]
[15] gr_inc gr_inc(SA)
[ 6] gr GR SA (MT n+2, subIterK [0,1]) ids [0-7]
[16] gr_inc gr_inc(SB)
[ 7] gr GR SB (MT n+2, subIterK [0,1]) ids [0-7]
"""
def test_256x256_fp4_partition_1x1():
"""Exact check of emit dependency order for 256x256 FP4, 1x1 partition."""
cfg = make_256x256_fp4()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_FP4_1x1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_FP4_1x1}\n"
f"--- Actual ---\n{actual}"
)
def make_256x256_fp8(pgr=2):
from unittest.mock import MagicMock
dtype = MagicMock()
dtype.numBytes.return_value = 1
kernel = {
"DepthU": 128, "_DepthUA": 128, "_DepthUB": 128,
"MacroTileA": 256, "MacroTileB": 256,
"MacroTile0": 256, "MacroTile1": 256,
"MatrixInstM": 16, "MatrixInstN": 16, "MatrixInstK": 128,
"MIWaveGroup": [2, 2], "WavefrontSize": 64,
"SourceSwap": False, "MIArchVgpr": False,
"NonTemporalA": 0, "NonTemporalB": 0,
"NonTemporalMXSA": 0, "NonTemporalMXSB": 0,
"ProblemType": {"DataTypeA": dtype, "DataTypeB": dtype,
"ComputeDataType": MagicMock(**{"numBytes.return_value": 4})},
}
tiA = TileInfo(AB_B8, 'A', None, kernel)
tiB = TileInfo(AB_B8, 'B', None, kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=tiA.subtileShape[0], k=tiA.subtileShape[1]),
grB=ReadGranularity(mn=tiB.subtileShape[0], k=tiB.subtileShape[1]),
pgr=pgr,
)
EXPECTED_EMIT_DEP_ORDER_256x256_FP8_PGR1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-7] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[10] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+1, subIterK [0]) ids [0-7]
[11] gr_inc gr_inc(B)
[ 4] gr GR B (MT n+1, subIterK [0]) ids [0-7]
[ 6] wait_gr wait_gr(0)
[ 7] sync sync
[ 8] lr_inc lr_inc(A)
[ 9] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-7]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-7]
"""
EXPECTED_EMIT_DEP_ORDER_256x256_FP8_PGR2 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-7] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 6] wait_gr wait_gr(0)
[ 7] sync sync
[ 8] lr_inc lr_inc(A)
[ 9] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-7]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-7]
path 1:
[10] sync sync
[11] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+2, subIterK [0]) ids [0-7]
[12] gr_inc gr_inc(B)
[ 4] gr GR B (MT n+2, subIterK [0]) ids [0-7]
"""
def test_256x256_fp8_partition_1x1_pgr1():
"""Exact check of emit dependency order for 256x256 FP8, 1x1 partition, PGR=1.
PGR=1: GR and LR are in the same path — GR issues for MT n+1 then
wait_gr(0) then LR, all in one sequential chain.
"""
cfg = make_256x256_fp8(pgr=1)
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_FP8_PGR1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_FP8_PGR1}\n"
f"--- Actual ---\n{actual}"
)
def test_256x256_fp8_partition_1x1_pgr2():
"""Exact check of emit dependency order for 256x256 FP8, 1x1 partition, PGR=2.
PGR=2: GR and LR split into two independent paths — LR in path 0
(wait_gr(0) then LR for MT n+1), GR in path 1 (GR for MT n+2).
wait_gr(0) confirms _compute_inflight_loads yields vmcnt=0 for the
symmetric case after the inflight-loads bug fix.
"""
cfg = make_256x256_fp8(pgr=2)
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_FP8_PGR2, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_FP8_PGR2}\n"
f"--- Actual ---\n{actual}"
)
def make_128x128_bf16():
kernel = create_kernel(128, 128, fp4=False, depthU=128)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
)
EXPECTED_EMIT_DEP_ORDER_128x128_BF16_1x1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-3] , B : [0-3] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-3]
[ 2] lr LR B (MT n, subIterK [1]) [0-3]
[ 5] wait_lr wait_lr
[ 6] sync sync
[ 7] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+2, subIterK [0,1]) ids [0-3]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-3] , B : [0-3] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 5] wait_gr wait_gr(A=12,B=8)
[ 6] sync sync
[ 1] lr LR A (MT n, subIterK [2]) [0-3]
[ 2] lr LR B (MT n, subIterK [2]) [0-3]
path 1:
[ 7] gr_inc gr_inc(B)
[ 3] gr GR B (MT n+2, subIterK [0,1]) ids [0-3]
subIterK=2:
MFMA: [ 0] MFMAs (MT n, subIterK 2 ) A : [0-3] , B : [0-3] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [3]) [0-3]
[ 2] lr LR B (MT n, subIterK [3]) [0-3]
[ 5] wait_lr wait_lr
[ 6] sync sync
[ 3] gr GR A (MT n+2, subIterK [2,3]) ids [0-3]
subIterK=3:
MFMA: [ 0] MFMAs (MT n, subIterK 3 ) A : [0-3] , B : [0-3] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 5] wait_gr wait_gr(A=12,B=8)
[ 6] sync sync
[ 7] lr_inc lr_inc(A)
[ 8] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-3]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-3]
path 1:
[ 3] gr GR B (MT n+2, subIterK [2,3]) ids [0-3]
"""
def test_128x128_bf16_partition_1x1():
"""Exact check of emit dependency order for 128x128 BF16, 1x1 partition."""
cfg = make_128x128_bf16()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_128x128_BF16_1x1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_128x128_BF16_1x1}\n"
f"--- Actual ---\n{actual}"
)
def make_128x128_fp4():
kernel = create_kernel(128, 128, fp4=True, depthU=512)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
scaleTiA = makeTileInfo('MXSA', kernel)
scaleTiB = makeTileInfo('MXSB', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
lrSA=ReadGranularity(mn=2, k=2),
lrSB=ReadGranularity(mn=2, k=2),
grSA=ReadGranularity(mn=scaleTiA.localMMATileGrid[0], k=scaleTiA.localMMATileGrid[1]),
grSB=ReadGranularity(mn=scaleTiB.localMMATileGrid[0], k=scaleTiB.localMMATileGrid[1]),
)
EXPECTED_EMIT_DEP_ORDER_128x128_FP4_1x1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-3] , B : [0-3] <- [6]
preMFMA path 0:
[ 6] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-3]
[ 2] lr LR B (MT n, subIterK [1]) [0-3]
[ 3] lr LR SA (MT n, subIterK [2,3]) [0-3]
[ 7] wait_lr wait_lr
[ 8] sync sync
[ 9] gr_inc gr_inc(A)
[ 4] gr GR A (MT n+2, subIterK [0,1]) ids [0-3]
[10] gr_inc gr_inc(B)
[ 5] gr GR B (MT n+2, subIterK [0,1]) ids [0-0]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-3] , B : [0-3] <- [6]
preMFMA path 0:
[ 6] wait_lr wait_lr
path 0:
[ 7] wait_gr wait_gr(A=12,B=9,SA=1,SB=1)
[ 8] sync sync
[ 1] lr LR A (MT n, subIterK [2]) [0-3]
[ 2] lr LR B (MT n, subIterK [2]) [0-3]
[ 3] lr LR SB (MT n, subIterK [2,3]) [0-3]
path 1:
[ 4] gr GR B (MT n+2, subIterK [0,1]) ids [1-3]
[ 9] sync sync
[10] gr_inc gr_inc(SA)
[ 5] gr GR SA (MT n+2, subIterK [0,3]) ids [0-3]
subIterK=2:
MFMA: [ 0] MFMAs (MT n, subIterK 2 ) A : [0-3] , B : [0-3] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [3]) [0-3]
[ 2] lr LR B (MT n, subIterK [3]) [0-3]
[ 6] wait_lr wait_lr
[ 7] sync sync
[ 8] gr_inc gr_inc(SB)
[ 3] gr GR SB (MT n+2, subIterK [0,3]) ids [0-3]
[ 4] gr GR A (MT n+2, subIterK [2,3]) ids [0-3]
subIterK=3:
MFMA: [ 0] MFMAs (MT n, subIterK 3 ) A : [0-3] , B : [0-3] <- [6]
preMFMA path 0:
[ 6] wait_lr wait_lr
path 0:
[ 7] wait_gr wait_gr(A=12,B=8,SA=1,SB=1)
[ 8] sync sync
[ 9] lr_inc lr_inc(A)
[10] lr_inc lr_inc(B)
[11] lr_inc lr_inc(SA)
[12] lr_inc lr_inc(SB)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-3]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-3]
[ 3] lr LR SA (MT n+1, subIterK [0,1]) [0-3]
[ 4] lr LR SB (MT n+1, subIterK [0,1]) [0-3]
path 1:
[ 5] gr GR B (MT n+2, subIterK [2,3]) ids [0-3]
"""
def test_128x128_fp4_partition_1x1():
"""Exact check of emit dependency order for 128x128 FP4, 1x1 partition."""
cfg = make_128x128_fp4()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_128x128_FP4_1x1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_128x128_FP4_1x1}\n"
f"--- Actual ---\n{actual}"
)
def make_256x256_fp4_pgr0():
kernel = create_kernel(256, 256, fp4=True, depthU=256)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
scaleTiA = makeTileInfo('MXSA', kernel)
scaleTiB = makeTileInfo('MXSB', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
lrSA=ReadGranularity(mn=2, k=2),
lrSB=ReadGranularity(mn=2, k=2),
grSA=ReadGranularity(mn=scaleTiA.localMMATileGrid[0], k=scaleTiA.localMMATileGrid[1]),
grSB=ReadGranularity(mn=scaleTiB.localMMATileGrid[0], k=scaleTiB.localMMATileGrid[1]),
pgr=0,
)
EXPECTED_EMIT_DEP_ORDER_256x256_FP4_PGR0 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-7] <- [15]
preMFMA path 0:
[ 5] gr GR A (MT n, subIterK [0,1]) ids [0-7]
[11] gr_inc gr_inc(A)
[ 6] gr GR B (MT n, subIterK [0,1]) ids [0-7]
[12] gr_inc gr_inc(B)
[ 7] gr GR SA (MT n, subIterK [0,1]) ids [0-7]
[13] gr_inc gr_inc(SA)
[ 8] gr GR SB (MT n, subIterK [0,1]) ids [0-7]
[14] gr_inc gr_inc(SB)
[16] wait_gr wait_gr(0)
[17] sync sync
[ 1] lr LR A (MT n, subIterK [0]) [0-7]
[ 2] lr LR B (MT n, subIterK [0]) [0-7]
[ 3] lr LR SA (MT n, subIterK [0,1]) [0-7]
[ 9] lr_inc lr_inc(SA)
[ 4] lr LR SB (MT n, subIterK [0,1]) [0-7]
[10] lr_inc lr_inc(SB)
[15] wait_lr wait_lr
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-7] , B : [0-7] <- [5]
preMFMA path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-7]
[ 3] lr_inc lr_inc(A)
[ 2] lr LR B (MT n, subIterK [1]) [0-7]
[ 4] lr_inc lr_inc(B)
[ 5] wait_lr wait_lr
"""
def test_256x256_fp4_pgr0():
"""Exact check of emit dependency order for 256x256 FP4, PGR0."""
cfg = make_256x256_fp4_pgr0()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_FP4_PGR0, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_FP4_PGR0}\n"
f"--- Actual ---\n{actual}"
)
def make_256x256_fp4_pgr1():
kernel = create_kernel(256, 256, fp4=True, depthU=256)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
scaleTiA = makeTileInfo('MXSA', kernel)
scaleTiB = makeTileInfo('MXSB', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
lrSA=ReadGranularity(mn=2, k=2),
lrSB=ReadGranularity(mn=2, k=2),
grSA=ReadGranularity(mn=scaleTiA.localMMATileGrid[0], k=scaleTiA.localMMATileGrid[1]),
grSB=ReadGranularity(mn=scaleTiB.localMMATileGrid[0], k=scaleTiB.localMMATileGrid[1]),
pgr=1,
)
EXPECTED_EMIT_DEP_ORDER_256x256_FP4_PGR1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-7] <- [7]
preMFMA path 0:
[ 7] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-7]
[ 2] lr LR B (MT n, subIterK [1]) [0-7]
path 1:
[ 8] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+1, subIterK [0,1]) ids [0-7]
[ 9] gr_inc gr_inc(B)
[ 4] gr GR B (MT n+1, subIterK [0,1]) ids [0-7]
[10] gr_inc gr_inc(SA)
[ 5] gr GR SA (MT n+1, subIterK [0,1]) ids [0-7]
[11] gr_inc gr_inc(SB)
[ 6] gr GR SB (MT n+1, subIterK [0,1]) ids [0-7]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-7] , B : [0-7] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 6] wait_gr wait_gr(0)
[ 7] sync sync
[ 8] lr_inc lr_inc(A)
[ 9] lr_inc lr_inc(B)
[10] lr_inc lr_inc(SA)
[11] lr_inc lr_inc(SB)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-7]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-7]
[ 3] lr LR SA (MT n+1, subIterK [0,1]) [0-7]
[ 4] lr LR SB (MT n+1, subIterK [0,1]) [0-7]
"""
def test_256x256_fp4_pgr1():
"""Exact check of emit dependency order for 256x256 FP4, PGR1."""
cfg = make_256x256_fp4_pgr1()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_FP4_PGR1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_FP4_PGR1}\n"
f"--- Actual ---\n{actual}"
)
def make_128x128_bf16_pgr1():
kernel = create_kernel(128, 128, fp4=False, depthU=128)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
pgr=1,
)
EXPECTED_EMIT_DEP_ORDER_128x128_BF16_PGR1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-3] , B : [0-3] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-3]
[ 2] lr LR B (MT n, subIterK [1]) [0-3]
path 1:
[ 5] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+1, subIterK [0,1]) ids [0-3]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-3] , B : [0-3] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 5] wait_gr wait_gr(A=4)
[ 6] sync sync
[ 1] lr LR A (MT n, subIterK [2]) [0-3]
[ 2] lr LR B (MT n, subIterK [2]) [0-3]
path 1:
[ 7] gr_inc gr_inc(B)
[ 3] gr GR B (MT n+1, subIterK [0,1]) ids [0-3]
subIterK=2:
MFMA: [ 0] MFMAs (MT n, subIterK 2 ) A : [0-3] , B : [0-3] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [3]) [0-3]
[ 2] lr LR B (MT n, subIterK [3]) [0-3]
path 1:
[ 3] gr GR A (MT n+1, subIterK [2,3]) ids [0-3]
[ 4] gr GR B (MT n+1, subIterK [2,3]) ids [0-3]
subIterK=3:
MFMA: [ 0] MFMAs (MT n, subIterK 3 ) A : [0-3] , B : [0-3] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 4] wait_gr wait_gr(A=4,B=4)
[ 5] sync sync
[ 6] lr_inc lr_inc(A)
[ 7] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-3]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-3]
"""
# FIXME : this schedule has issues for now. bad SA/SB counts + bad ordering of AB/SASB for performance
def test_128x128_bf16_pgr1():
"""Exact check of emit dependency order for 128x128 BF16, DU=128, PGR1."""
cfg = make_128x128_bf16_pgr1()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_128x128_BF16_PGR1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_128x128_BF16_PGR1}\n"
f"--- Actual ---\n{actual}"
)
def make_128x96_bf16_pgr1_wg4x1():
"""MT128x96, MIWT 2x6, WG 4x1, DU=128, PGR1.
Mirrors subtile_bf16_failing.yaml. With this geometry, multiple GR_B
placements end up in the same subIterK slot (slot 2: ids [4-5] and
[0-5]). loadRatioGR_B > 1.0 so grB.mn = 2 (mirrors Kernel.py:1139-1140).
"""
kernel = create_kernel(128, 96, fp4=False, depthU=128, waveGroup=(4, 1))
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
grA = ReadGranularity(mn=1, k=2) if tiA.loadRatioGR <= 1.0 else ReadGranularity(mn=2, k=2)
grB = ReadGranularity(mn=1, k=2) if tiB.loadRatioGR <= 1.0 else ReadGranularity(mn=2, k=2)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=grA,
grB=grB,
pgr=1,
)
# Regression: pins the post-fix behavior of remove_unnecessary_gr_deps when
# multiple GRs of the same tensor share a (mt_offset, partition, slot).
# The pass used to collapse those into one key and drop deps on later-rank
# GRs, leaving the surviving wait anchored on an earlier-rank GR — under-
# counting in-flight loads and causing stale-LDS reads on the next iter.
# Diff vs the buggy version: subIterK=1 wait_gr changes from
# "wait_gr(A=2,B=3)" to "wait_gr(A=2)" (B-wait pushed to wrap-around).
EXPECTED_EMIT_DEP_ORDER_128x96_BF16_PGR1_WG4x1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-1] , B : [0-5] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-1]
[ 2] lr LR B (MT n, subIterK [1]) [0-5]
path 1:
[ 6] gr_inc gr_inc(A)
[ 3] gr GR A (MT n+1, subIterK [0,1]) ids [0-1]
[ 7] gr_inc gr_inc(B)
[ 4] gr GR B (MT n+1, subIterK [0,1]) ids [0-1]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-1] , B : [0-5] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 5] wait_gr wait_gr(A=2,B=1)
[ 6] sync sync
[ 1] lr LR A (MT n, subIterK [2]) [0-1]
[ 2] lr LR B (MT n, subIterK [2]) [0-5]
path 1:
[ 3] gr GR B (MT n+1, subIterK [0,1]) ids [2-5]
subIterK=2:
MFMA: [ 0] MFMAs (MT n, subIterK 2 ) A : [0-1] , B : [0-5] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [3]) [0-1]
[ 2] lr LR B (MT n, subIterK [3]) [0-5]
path 1:
[ 3] gr GR A (MT n+1, subIterK [2,3]) ids [0-1]
[ 4] gr GR B (MT n+1, subIterK [2,3]) ids [0-5]
subIterK=3:
MFMA: [ 0] MFMAs (MT n, subIterK 3 ) A : [0-1] , B : [0-5] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 4] wait_gr wait_gr(A=2,B=3)
[ 5] sync sync
[ 6] lr_inc lr_inc(A)
[ 7] lr_inc lr_inc(B)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-1]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-5]
"""
def test_128x96_bf16_pgr1_wg4x1():
"""Regression: multi-GR-per-slot anchoring in remove_unnecessary_gr_deps.
Mirrors subtile_bf16_failing.yaml. Pins the post-fix behavior so a future
change that re-collapses GRs sharing (mt_offset, partition, slot)
will diff against this expected output.
"""
cfg = make_128x96_bf16_pgr1_wg4x1()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_128x96_BF16_PGR1_WG4x1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_128x96_BF16_PGR1_WG4x1}\n"
f"--- Actual ---\n{actual}"
)
def make_128x128_fp4_pgr1():
kernel = create_kernel(128, 128, fp4=True, depthU=512)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
scaleTiA = makeTileInfo('MXSA', kernel)
scaleTiB = makeTileInfo('MXSB', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
lrSA=ReadGranularity(mn=2, k=2),
lrSB=ReadGranularity(mn=2, k=2),
grSA=ReadGranularity(mn=scaleTiA.localMMATileGrid[0], k=scaleTiA.localMMATileGrid[1]),
grSB=ReadGranularity(mn=scaleTiB.localMMATileGrid[0], k=scaleTiB.localMMATileGrid[1]),
pgr=1,
)
EXPECTED_EMIT_DEP_ORDER_128x128_FP4_PGR1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-3] , B : [0-3] <- [6]
preMFMA path 0:
[ 6] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-3]
[ 2] lr LR B (MT n, subIterK [1]) [0-3]
[ 3] lr LR SA (MT n, subIterK [2,3]) [0-3]
path 1:
[ 7] gr_inc gr_inc(A)
[ 4] gr GR A (MT n+1, subIterK [0,1]) ids [0-3]
[ 8] gr_inc gr_inc(B)
[ 5] gr GR B (MT n+1, subIterK [0,1]) ids [0-0]
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-3] , B : [0-3] <- [6]
preMFMA path 0:
[ 6] wait_lr wait_lr
path 0:
[ 7] wait_gr wait_gr(A=4,B=1)
[ 8] sync sync
[ 1] lr LR A (MT n, subIterK [2]) [0-3]
[ 2] lr LR B (MT n, subIterK [2]) [0-3]
[ 3] lr LR SB (MT n, subIterK [2,3]) [0-3]
path 1:
[ 4] gr GR B (MT n+1, subIterK [0,1]) ids [1-3]
[ 9] gr_inc gr_inc(SA)
[ 5] gr GR SA (MT n+1, subIterK [0,3]) ids [0-3]
subIterK=2:
MFMA: [ 0] MFMAs (MT n, subIterK 2 ) A : [0-3] , B : [0-3] <- [6]
preMFMA path 0:
[ 6] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [3]) [0-3]
[ 2] lr LR B (MT n, subIterK [3]) [0-3]
path 1:
[ 7] gr_inc gr_inc(SB)
[ 3] gr GR SB (MT n+1, subIterK [0,3]) ids [0-3]
[ 4] gr GR A (MT n+1, subIterK [2,3]) ids [0-3]
[ 5] gr GR B (MT n+1, subIterK [2,3]) ids [0-3]
subIterK=3:
MFMA: [ 0] MFMAs (MT n, subIterK 3 ) A : [0-3] , B : [0-3] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 6] wait_gr wait_gr(A=4,B=4)
[ 7] sync sync
[ 8] lr_inc lr_inc(A)
[ 9] lr_inc lr_inc(B)
[10] lr_inc lr_inc(SA)
[11] lr_inc lr_inc(SB)
[ 1] lr LR A (MT n+1, subIterK [0]) [0-3]
[ 2] lr LR B (MT n+1, subIterK [0]) [0-3]
[ 3] lr LR SA (MT n+1, subIterK [0,1]) [0-3]
[ 4] lr LR SB (MT n+1, subIterK [0,1]) [0-3]
"""
def test_128x128_fp4_pgr1():
"""Exact check of emit dependency order for 128x128 FP4, DU=512, PGR1."""
cfg = make_128x128_fp4_pgr1()
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_128x128_FP4_PGR1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_128x128_FP4_PGR1}\n"
f"--- Actual ---\n{actual}"
)
EXPECTED_PRELOOP_256x256_FP4_1x1 = """\
MAINLOOP:
Partition 0:
subIterK=0:
[ 0] gr GR A (MT n, subIterK [0,1]) ids [0-7]
[ 1] gr GR B (MT n, subIterK [0,1]) ids [0-7]
[ 2] gr GR SA (MT n, subIterK [0,1]) ids [0-7]
[ 3] gr GR SB (MT n, subIterK [0,1]) ids [0-7]
[ 4] gr_inc gr_inc(A)
[ 5] gr_inc gr_inc(B)
[ 6] gr_inc gr_inc(SA)
[ 7] gr_inc gr_inc(SB)
[ 8] inline inline(initC_overlap)
[ 9] wait_gr wait_gr(0)
[10] sync sync
[11] lr LR A (MT n, subIterK [0]) [0-7]
[12] lr LR B (MT n, subIterK [0]) [0-7]
[13] lr LR SA (MT n, subIterK [0,1]) [0-7]
[14] lr LR SB (MT n, subIterK [0,1]) [0-7]
[15] skip skip(LE:1:NLL)
[16] gr GR A (MT n+1, subIterK [0,1]) ids [0-7]
[17] gr GR B (MT n+1, subIterK [0,1]) ids [0-7]
[18] gr GR SA (MT n+1, subIterK [0,1]) ids [0-7]
[19] gr GR SB (MT n+1, subIterK [0,1]) ids [0-7]
[20] skip skip(LE:2:NGLL)
"""
def test_256x256_fp4_preloop_1x1():
"""Exact check of preloop for 256x256 FP4, 1x1 partition."""
cfg = make_256x256_fp4()
sched = LogicalScheduler(cfg)
sched.build()
preloop = sched.build_preloop()
actual = sched.print_emit(preloop)
assert actual == EXPECTED_PRELOOP_256x256_FP4_1x1, (
f"Preloop mismatch.\n"
f"--- Expected ---\n{EXPECTED_PRELOOP_256x256_FP4_1x1}\n"
f"--- Actual ---\n{actual}"
)
EXPECTED_PRELOOP_256x256_FP4_PGR1_1x1 = """\
MAINLOOP:
Partition 0:
subIterK=0:
[ 0] gr GR A (MT n, subIterK [0,1]) ids [0-7]
[ 1] gr GR B (MT n, subIterK [0,1]) ids [0-7]
[ 2] gr GR SA (MT n, subIterK [0,1]) ids [0-7]
[ 3] gr GR SB (MT n, subIterK [0,1]) ids [0-7]
[ 4] inline inline(initC_overlap)
[ 5] wait_gr wait_gr(0)
[ 6] sync sync
[ 7] lr LR A (MT n, subIterK [0]) [0-7]
[ 8] lr LR B (MT n, subIterK [0]) [0-7]
[ 9] lr LR SA (MT n, subIterK [0,1]) [0-7]
[10] lr LR SB (MT n, subIterK [0,1]) [0-7]
[11] skip skip(LE:1:NLL)
"""
def test_256x256_fp4_preloop_pgr1_1x1():
"""Exact check of preloop for 256x256 FP4, PGR1, 1x1 partition.
PGR1 preloop: GR(MT0) + wait + sync + LR + skip(NLL). No MT1 GRs."""
cfg = make_256x256_fp4_pgr1()
sched = LogicalScheduler(cfg)
sched.build()
preloop = sched.build_preloop()
actual = sched.print_emit(preloop)
assert actual == EXPECTED_PRELOOP_256x256_FP4_PGR1_1x1, (
f"Preloop mismatch.\n"
f"--- Expected ---\n{EXPECTED_PRELOOP_256x256_FP4_PGR1_1x1}\n"
f"--- Actual ---\n{actual}"
)
EXPECTED_PRELOOP_320x320_BF16_1x5_OFFSET1 = """\
MAINLOOP:
Partition 0:
subIterK=0:
[ 0] gr GR A (MT n, subIterK [0,1]) ids [0-9]
[ 1] gr GR B (MT n, subIterK [0,1]) ids [0-9]
[ 2] gr_inc gr_inc(A)
[ 3] gr_inc gr_inc(B)
[ 4] inline inline(initC_overlap)
[ 5] wait_gr wait_gr(0)
[ 6] sync sync
[ 7] lr LR A (MT n, subIterK [0]) [0-9]
[ 8] lr LR B (MT n, subIterK [0]) [0-1]
[ 9] skip skip(LE:1:NLL)
[10] gr GR A (MT n+1, subIterK [0,1]) ids [0-9]
[11] gr GR B (MT n+1, subIterK [0,1]) ids [0-1]
[12] skip skip(LE:2:NGLL)
"""
EXPECTED_PRELOOP_320x320_BF16_1x5_OFFSET_ALL = """\
MAINLOOP:
Partition 0:
subIterK=0:
[ 0] gr GR A (MT n, subIterK [0,1]) ids [0-9]
[ 1] gr GR B (MT n, subIterK [0,1]) ids [0-9]
[ 2] gr_inc gr_inc(A)
[ 3] gr_inc gr_inc(B)
[ 4] inline inline(initC_overlap)
[ 5] wait_gr wait_gr(0)
[ 6] sync sync
[ 7] lr LR A (MT n, subIterK [0]) [0-9]
[ 8] lr LR B (MT n, subIterK [0]) [0-1]
[ 9] skip skip(LE:1:NLL)
[10] gr GR A (MT n+1, subIterK [0,1]) ids [0-9]
[11] gr GR B (MT n+1, subIterK [0,1]) ids [0-1]
[12] gr GR B (MT n+1, subIterK [0,1]) ids [2-3]
[13] gr GR B (MT n+1, subIterK [0,1]) ids [4-5]
[14] gr GR B (MT n+1, subIterK [0,1]) ids [6-7]
[15] gr GR B (MT n+1, subIterK [0,1]) ids [8-9]
[16] skip skip(LE:2:NGLL)
"""
def test_320x320_bf16_preloop_1x5_offset1():
"""Preloop with offsetPartition=1: MT1 GRs cover only partition 0."""
cfg = make_320x320_bf16()
cfg.offsetPartition = 1
sched = LogicalScheduler(cfg)
sched.build()
preloop = sched.build_preloop()
actual = sched.print_emit(preloop)
assert actual == EXPECTED_PRELOOP_320x320_BF16_1x5_OFFSET1, (
f"Preloop mismatch.\n"
f"--- Expected ---\n{EXPECTED_PRELOOP_320x320_BF16_1x5_OFFSET1}\n"
f"--- Actual ---\n{actual}"
)
def test_320x320_bf16_preloop_1x5_offset_all():
"""Preloop with offsetPartition=numPartitions: MT1 GRs cover all partitions."""
cfg = make_320x320_bf16()
# Forcing offsetPartition for testing. Not exposed yet.
cfg.offsetPartition = cfg.numPartitions
sched = LogicalScheduler(cfg)
sched.build()
preloop = sched.build_preloop()
actual = sched.print_emit(preloop)
assert actual == EXPECTED_PRELOOP_320x320_BF16_1x5_OFFSET_ALL, (
f"Preloop mismatch.\n"
f"--- Expected ---\n{EXPECTED_PRELOOP_320x320_BF16_1x5_OFFSET_ALL}\n"
f"--- Actual ---\n{actual}"
)
# ── F8/MXFP8 multi-DU schedule golden tests ───────────────────
# Multi-DU MX (numUnroll>1 for the A/B data tensors) is produced by giving the
# scale tensors a GR k-granularity larger than their per-uid k-window, so
# SchedulerConfig.__post_init__ expands numSubIterK and sets numUnroll>1. These
# golden dep-path dumps lock the current multi-DU schedule (including the
# force_drain "wait_gr(0)" and the uid-tagged wrap-around GRs) before any
# future scheduler refactor.
def make_256x256_mxfp8_multi_du(partitionSizeN=0):
kernel = create_kernel(256, 256, fp4=True, depthU=256)
tiA = makeTileInfo('A', kernel)
tiB = makeTileInfo('B', kernel)
scaleTiA = makeTileInfo('MXSA', kernel)
scaleTiB = makeTileInfo('MXSB', kernel)
return SchedulerConfig(
numMFMATilesM=tiA.localMMATileGrid[0],
numMFMATilesN=tiB.localMMATileGrid[0],
numSubIterK=tiA.localMMATileGrid[1],
lrA=ReadGranularity(mn=1, k=1),
lrB=ReadGranularity(mn=1, k=1),
grA=ReadGranularity(mn=1, k=2),
grB=ReadGranularity(mn=1, k=2),
lrSA=ReadGranularity(mn=2, k=2),
lrSB=ReadGranularity(mn=2, k=2),
grSA=ReadGranularity(mn=scaleTiA.localMMATileGrid[0],
k=scaleTiA.localMMATileGrid[1] * 2),
grSB=ReadGranularity(mn=scaleTiB.localMMATileGrid[0],
k=scaleTiB.localMMATileGrid[1] * 2),
partitionSizeN=partitionSizeN,
pgr=1,
)
EXPECTED_EMIT_DEP_ORDER_256x256_MXFP8_MULTI_DU_1x1 = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-7] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-7] uid=0
[ 2] lr LR B (MT n, subIterK [1]) [0-7] uid=0
[ 3] lr LR SA (MT n, subIterK [2,3]) [0-7] uid=0
path 1:
[ 4] gr GR A (MT n+1, subIterK [0,1]) ids [0-4] uid=0
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-7] , B : [0-7] <- [7]
preMFMA path 0:
[ 7] wait_lr wait_lr
path 0:
[ 8] wait_gr wait_gr(A=5,B=8)
[ 9] sync sync
[10] lr_inc lr_inc(A) uid=1
[11] lr_inc lr_inc(B) uid=1
[ 1] lr LR A (MT n, subIterK [2]) [0-7] uid=1
[ 2] lr LR B (MT n, subIterK [2]) [0-7] uid=1
[ 3] lr LR SB (MT n, subIterK [2,3]) [0-7] uid=0
path 1:
[ 4] gr GR A (MT n+1, subIterK [0,1]) ids [5-7] uid=0
[ 6] gr_inc gr_inc(A) uid=0
[ 5] gr GR B (MT n+1, subIterK [0,1]) ids [0-0] uid=0
subIterK=2:
MFMA: [ 0] MFMAs (MT n, subIterK 2 ) A : [0-7] , B : [0-7] <- [9]
preMFMA path 0:
[ 9] wait_lr wait_lr
path 0:
[10] wait_gr wait_gr(A=8,B=1)
[11] sync sync
[ 1] lr LR A (MT n, subIterK [3]) [0-7] uid=1
[ 2] lr LR B (MT n, subIterK [3]) [0-7] uid=1
path 1:
[ 3] gr GR B (MT n+1, subIterK [0,1]) ids [1-7] uid=0
[ 6] gr_inc gr_inc(B) uid=0
[ 4] gr GR SA (MT n+1, subIterK [0,3]) ids [0-7] uid=0
[ 7] gr_inc gr_inc(SA) uid=0
[ 5] gr GR SB (MT n+1, subIterK [0,3]) ids [0-7] uid=0
[ 8] gr_inc gr_inc(SB) uid=0
subIterK=3:
MFMA: [ 0] MFMAs (MT n, subIterK 3 ) A : [0-7] , B : [0-7] <- [10]
preMFMA path 0:
[10] wait_lr wait_lr
path 0:
[11] wait_gr wait_gr(B=8,SA=1,SB=1)
[12] sync sync
[13] lr_inc lr_inc(A) uid=0
[14] lr_inc lr_inc(B) uid=0
[15] lr_inc lr_inc(SA) uid=0
[16] lr_inc lr_inc(SB) uid=0
[ 1] lr LR A (MT n+1, subIterK [0]) [0-7] uid=0
[ 2] lr LR B (MT n+1, subIterK [0]) [0-7] uid=0
[ 3] lr LR SA (MT n+1, subIterK [0,1]) [0-7] uid=0
[ 4] lr LR SB (MT n+1, subIterK [0,1]) [0-7] uid=0
path 1:
[ 5] gr GR A (MT n+1, subIterK [2,3]) ids [0-3] uid=1
[ 6] gr GR A (MT n+1, subIterK [2,3]) ids [4-7] uid=1
[ 8] gr_inc gr_inc(A) uid=1
[ 7] gr GR B (MT n+1, subIterK [2,3]) ids [0-7] uid=1
[ 9] gr_inc gr_inc(B) uid=1
"""
def test_256x256_mxfp8_multi_du_1x1():
"""Golden dep-path for the 256x256 MXFP8 multi-DU (numUnroll=2) schedule,
1x1 partition. Locks the wrap-around uid-tagged GRs and the wait_gr
inflight counts of the current multi-DU codepath."""
cfg = make_256x256_mxfp8_multi_du()
assert cfg.numSubIterK == 4
assert cfg.numUnroll['A'] == 2 and cfg.numUnroll['B'] == 2
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_MXFP8_MULTI_DU_1x1, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_MXFP8_MULTI_DU_1x1}\n"
f"--- Actual ---\n{actual}"
)
EXPECTED_EMIT_DEP_ORDER_256x256_MXFP8_MULTI_DU_PARTN = """\
MAINLOOP (dependency paths):
Partition 0:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [0-5] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [1]) [0-7] uid=0
[ 2] lr LR B (MT n, subIterK [1]) [0-5] uid=0
[ 3] lr LR SA (MT n, subIterK [2,3]) [0-7] uid=0
path 1:
[ 4] gr GR A (MT n+1, subIterK [0,1]) ids [0-3] uid=0
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-7] , B : [0-5] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 6] lr_inc lr_inc(A) uid=1
[ 7] lr_inc lr_inc(B) uid=1
[ 1] lr LR A (MT n, subIterK [2]) [0-7] uid=1
[ 2] lr LR B (MT n, subIterK [2]) [0-5] uid=1
[ 3] lr LR SB (MT n, subIterK [2,3]) [0-5] uid=0
path 1:
[ 4] gr GR A (MT n+1, subIterK [0,1]) ids [4-6] uid=0
subIterK=2:
MFMA: [ 0] MFMAs (MT n, subIterK 2 ) A : [0-7] , B : [0-5] <- [7]
preMFMA path 0:
[ 7] wait_lr wait_lr
path 0:
[ 1] lr LR A (MT n, subIterK [3]) [0-7] uid=1
[ 2] lr LR B (MT n, subIterK [3]) [0-5] uid=1
[ 3] lr LR SB (MT n, subIterK [0,1]) [6-7] uid=0
path 1:
[ 4] gr GR A (MT n+1, subIterK [0,1]) ids [7-7] uid=0
[ 6] gr_inc gr_inc(A) uid=0
[ 5] gr GR B (MT n+1, subIterK [0,1]) ids [0-2] uid=0
subIterK=3:
MFMA: [ 0] MFMAs (MT n, subIterK 3 ) A : [0-7] , B : [0-5] <- [3]
preMFMA path 0:
[ 3] wait_lr wait_lr
path 0:
[ 4] lr_inc lr_inc(B) uid=0
[ 1] lr LR B (MT n, subIterK [0]) [6-7] uid=0
path 1:
[ 2] gr GR B (MT n+1, subIterK [0,1]) ids [3-5] uid=0
Partition 1:
subIterK=0:
MFMA: [ 0] MFMAs (MT n, subIterK 0 ) A : [0-7] , B : [6-7] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 5] wait_gr wait_gr(B=3)
[ 6] sync sync
[ 1] lr LR B (MT n, subIterK [1]) [6-7] uid=0
path 1:
[ 2] gr GR SA (MT n+1, subIterK [0,3]) ids [0-7] uid=0
[ 3] gr_inc gr_inc(SA) uid=0
subIterK=1:
MFMA: [ 0] MFMAs (MT n, subIterK 1 ) A : [0-7] , B : [6-7] <- [5]
preMFMA path 0:
[ 5] wait_lr wait_lr
path 0:
[ 6] wait_gr wait_gr(0)
[ 7] sync sync
[ 8] lr_inc lr_inc(B) uid=1
[ 1] lr LR B (MT n, subIterK [2]) [6-7] uid=1
[ 2] lr LR SB (MT n, subIterK [2,3]) [6-7] uid=0
path 1:
[ 3] gr GR SB (MT n+1, subIterK [0,3]) ids [0-7] uid=0
[ 4] gr_inc gr_inc(SB) uid=0
subIterK=2:
MFMA: [ 0] MFMAs (MT n, subIterK 2 ) A : [0-7] , B : [6-7] <- [4]
preMFMA path 0:
[ 4] wait_lr wait_lr
path 0:
[ 5] wait_gr wait_gr(SB=1)
[ 6] sync sync
[ 1] lr LR B (MT n, subIterK [3]) [6-7] uid=1
path 1:
[ 2] gr GR B (MT n+1, subIterK [0,1]) ids [6-7] uid=0
[ 3] gr_inc gr_inc(B) uid=0
subIterK=3:
MFMA: [ 0] MFMAs (MT n, subIterK 3 ) A : [0-7] , B : [6-7] <- [15]
preMFMA path 0:
[15] wait_lr wait_lr
path 0:
[16] wait_gr wait_gr(A=1,B=2,SA=1,SB=1)
[17] sync sync
[18] lr_inc lr_inc(A) uid=0
[19] lr_inc lr_inc(B) uid=0
[20] lr_inc lr_inc(SA) uid=0
[21] lr_inc lr_inc(SB) uid=0
[ 1] lr LR A (MT n+1, subIterK [0]) [0-7] uid=0
[ 2] lr LR B (MT n+1, subIterK [0]) [0-5] uid=0
[ 3] lr LR SA (MT n+1, subIterK [0,1]) [0-7] uid=0
[ 4] lr LR SB (MT n+1, subIterK [0,1]) [0-5] uid=0
path 1:
[ 5] gr GR A (MT n+1, subIterK [2,3]) ids [0-2] uid=1
[ 6] gr GR A (MT n+1, subIterK [2,3]) ids [3-5] uid=1
[ 7] gr GR A (MT n+1, subIterK [2,3]) ids [6-7] uid=1
[13] gr_inc gr_inc(A) uid=1
[ 8] gr GR B (MT n+1, subIterK [2,3]) ids [0-0] uid=1
[ 9] gr GR B (MT n+1, subIterK [2,3]) ids [1-3] uid=1
[10] gr GR B (MT n+1, subIterK [2,3]) ids [4-4] uid=1
[11] gr GR B (MT n+1, subIterK [2,3]) ids [5-5] uid=1
[12] gr GR B (MT n+1, subIterK [2,3]) ids [6-7] uid=1
[14] gr_inc gr_inc(B) uid=1
"""
def test_256x256_mxfp8_multi_du_partition_remainder():
"""Golden dep-path for the 256x256 MXFP8 multi-DU schedule with an uneven
N partition (remainder_last -> [6, 2]). Exercises the multi-DU
remainder-last partition split and the force_drain wait_gr(0)."""
cfg = make_256x256_mxfp8_multi_du(partitionSizeN=6)
assert cfg.partitionSizesN == [6, 2]
assert cfg.numUnroll['A'] == 2 and cfg.numUnroll['B'] == 2
sched = LogicalScheduler(cfg)
sched.build()
actual = sched.print_emit_dep_order()
assert actual == EXPECTED_EMIT_DEP_ORDER_256x256_MXFP8_MULTI_DU_PARTN, (
f"Emit dependency order mismatch.\n"
f"--- Expected ---\n{EXPECTED_EMIT_DEP_ORDER_256x256_MXFP8_MULTI_DU_PARTN}\n"
f"--- Actual ---\n{actual}"
)