Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions python/rocm-bootstrap/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ Detected 2 AMD GPU(s):
family: gfx12 (RDNA4)

Node 2: gfx1100 major=11 minor=0 stepping=0 PCI=0x7448
sub-family: gfx110x (RDNA3)
family: gfx11 (RDNA3) generic: gfx11-generic
sub-family: gfx110x (RDNA3) generic: gfx11-generic
family: gfx11 (RDNA3)
```

### Environment variables
Expand Down Expand Up @@ -101,7 +101,7 @@ t = lookup_target("gfx942")
b = lookup_bundle("gfx115x")
# TargetBundle(key='gfx115x', level=SUB_FAMILY, ...)
# b.members -> (gfx1150, gfx1151, gfx1152, gfx1153)
# b.llvm_generic -> None (gfx11-generic is at family level)
# b.llvm_generic -> "gfx11-generic"
```

Enumerate all bundles:
Expand Down
53 changes: 47 additions & 6 deletions python/rocm-bootstrap/python/rocm_bootstrap/targets.py
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,10 @@ class TargetBundle:
GFX1152 = GfxTarget(name="gfx1152", major=11, minor=5, stepping=2, xnack=_U)
GFX1153 = GfxTarget(name="gfx1153", major=11, minor=5, stepping=3, xnack=_U)

# -- GFX11.7 (iGPU) --
GFX1170 = GfxTarget(name="gfx1170", major=11, minor=7, stepping=0, xnack=_U)
GFX1171 = GfxTarget(name="gfx1171", major=11, minor=7, stepping=1, xnack=_U)

# -- GFX12.0 (RDNA 4) --
GFX1200 = GfxTarget(name="gfx1200", major=12, minor=0, stepping=0, xnack=_U)
GFX1201 = GfxTarget(name="gfx1201", major=12, minor=0, stepping=1, xnack=_U)
Expand Down Expand Up @@ -387,6 +391,20 @@ class TargetBundle:
llvm_generic=None,
members=(GFX1153,),
)
BUNDLE_GFX1170 = TargetBundle(
key="gfx1170",
level=_TARGET,
display_name="gfx1170",
llvm_generic=None,
members=(GFX1170,),
)
BUNDLE_GFX1171 = TargetBundle(
key="gfx1171",
level=_TARGET,
display_name="gfx1171",
llvm_generic=None,
members=(GFX1171,),
)
BUNDLE_GFX1200 = TargetBundle(
key="gfx1200",
level=_TARGET,
Expand Down Expand Up @@ -469,18 +487,26 @@ class TargetBundle:
key="gfx110x",
level=_SF,
display_name="RDNA3",
llvm_generic=None,
llvm_generic="gfx11-generic",
members=(GFX1100, GFX1101, GFX1102, GFX1103),
)

BUNDLE_GFX115X = TargetBundle(
key="gfx115x",
level=_SF,
display_name="RDNA3.5",
llvm_generic=None,
llvm_generic="gfx11-generic",
members=(GFX1150, GFX1151, GFX1152, GFX1153),
)

BUNDLE_GFX117X = TargetBundle(
key="gfx117x",
level=_SF,
display_name="GFX11.7",
llvm_generic="gfx11-7-generic",
members=(GFX1170, GFX1171),
)

# gfx12-generic covers gfx1200, gfx1201 only (not gfx1250+).
BUNDLE_GFX12_0 = TargetBundle(
key="gfx12_0",
Expand Down Expand Up @@ -544,13 +570,24 @@ class TargetBundle:
),
)

# gfx11-generic covers all of GFX11 (both 11.0 and 11.5).
# GFX11 sub-families have different LLVM generics, so no family generic is safe.
BUNDLE_GFX11 = TargetBundle(
key="gfx11",
level=_F,
display_name="RDNA3",
llvm_generic="gfx11-generic",
members=(GFX1100, GFX1101, GFX1102, GFX1103, GFX1150, GFX1151, GFX1152, GFX1153),
llvm_generic=None,
members=(
GFX1100,
GFX1101,
GFX1102,
GFX1103,
GFX1150,
GFX1151,
GFX1152,
GFX1153,
GFX1170,
GFX1171,
),
)

BUNDLE_GFX12 = TargetBundle(
Expand Down Expand Up @@ -596,6 +633,8 @@ class TargetBundle:
GFX1151,
GFX1152,
GFX1153,
GFX1170,
GFX1171,
GFX1200,
GFX1201,
GFX1250,
Expand All @@ -618,6 +657,7 @@ class TargetBundle:
BUNDLE_GFX10_3,
BUNDLE_GFX110X,
BUNDLE_GFX115X,
BUNDLE_GFX117X,
BUNDLE_GFX12_0,
BUNDLE_GFX12_5,
)
Expand All @@ -626,7 +666,7 @@ class TargetBundle:
_FAMILY_TO_SUB_FAMILIES: dict[str, tuple[TargetBundle, ...]] = {
"gfx9": (BUNDLE_GFX9_0, BUNDLE_GFX9_4, BUNDLE_GFX9_5),
"gfx10": (BUNDLE_GFX10_1, BUNDLE_GFX10_3),
"gfx11": (BUNDLE_GFX110X, BUNDLE_GFX115X),
"gfx11": (BUNDLE_GFX110X, BUNDLE_GFX115X, BUNDLE_GFX117X),
"gfx12": (BUNDLE_GFX12_0, BUNDLE_GFX12_5),
}

Expand All @@ -635,6 +675,7 @@ class TargetBundle:
_BUNDLE_KEY_ALIASES: dict[str, str] = {
"gfx11_0": "gfx110x",
"gfx11_5": "gfx115x",
"gfx11_7": "gfx117x",
}


Expand Down
39 changes: 27 additions & 12 deletions python/rocm-bootstrap/python/rocm_bootstrap/tests/test_targets.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,10 +86,10 @@ def test_all_targets_count(self):
"""Sanity check: we have a reasonable number of targets."""
# 8 (gfx9.0) + 1 (gfx9.4) + 1 (gfx9.5)
# + 4 (gfx10.1) + 7 (gfx10.3)
# + 4 (gfx11.0) + 4 (gfx11.5)
# + 4 (gfx11.0) + 4 (gfx11.5) + 2 (gfx11.7)
# + 2 (gfx12.0) + 3 (gfx12.5)
# = 34
assert len(ALL_TARGETS) == 34
# = 36
assert len(ALL_TARGETS) == 36


# ---------------------------------------------------------------------------
Expand All @@ -114,6 +114,8 @@ def test_frozen(self):
("gfx1010", 10, 1, 0),
("gfx1100", 11, 0, 0),
("gfx1151", 11, 5, 1),
("gfx1170", 11, 7, 0),
("gfx1171", 11, 7, 1),
("gfx1201", 12, 0, 1),
("gfx1250", 12, 5, 0),
],
Expand Down Expand Up @@ -222,6 +224,8 @@ def test_gfx10_3_targets_no_xnack(self, name):
"gfx1151",
"gfx1152",
"gfx1153",
"gfx1170",
"gfx1171",
],
)
def test_gfx11_targets_no_xnack(self, name):
Expand Down Expand Up @@ -271,7 +275,7 @@ def test_target(self):

@pytest.mark.parametrize(
"alias,canonical_key",
[("gfx11_0", "gfx110x"), ("gfx11_5", "gfx115x")],
[("gfx11_0", "gfx110x"), ("gfx11_5", "gfx115x"), ("gfx11_7", "gfx117x")],
)
def test_legacy_sub_family_aliases(self, alias, canonical_key):
assert lookup_bundle(alias) is lookup_bundle(canonical_key)
Expand All @@ -292,6 +296,7 @@ class TestPackagingChain:
[
("gfx1151", "gfx115x", "gfx11"),
("gfx1100", "gfx110x", "gfx11"),
("gfx1170", "gfx117x", "gfx11"),
("gfx942", "gfx9_4", "gfx9"),
("gfx950", "gfx9_5", "gfx9"),
("gfx90a", "gfx9_0", "gfx9"),
Expand Down Expand Up @@ -362,7 +367,7 @@ def test_filter_family(self):
def test_filter_sub_family(self):
bundles = all_bundles(PackagingLevel.SUB_FAMILY)
assert all(b.level == PackagingLevel.SUB_FAMILY for b in bundles)
assert len(bundles) == 9
assert len(bundles) == 10

def test_filter_target(self):
bundles = all_bundles(PackagingLevel.TARGET)
Expand Down Expand Up @@ -393,15 +398,18 @@ def test_gfx10_1_has_gfx10_1_generic(self):
def test_gfx10_3_has_gfx10_3_generic(self):
assert lookup_bundle("gfx10_3").llvm_generic == "gfx10-3-generic"

def test_gfx11_family_has_gfx11_generic(self):
assert lookup_bundle("gfx11").llvm_generic == "gfx11-generic"
def test_gfx11_family_no_generic(self):
assert lookup_bundle("gfx11").llvm_generic is None

def test_gfx110x_no_generic(self):
"""gfx11-generic is at family level, not sub-family."""
assert lookup_bundle("gfx110x").llvm_generic is None
def test_gfx110x_has_gfx11_generic(self):
assert lookup_bundle("gfx110x").llvm_generic == "gfx11-generic"

def test_gfx115x_no_generic(self):
assert lookup_bundle("gfx115x").llvm_generic is None
def test_gfx115x_has_gfx11_generic(self):
assert lookup_bundle("gfx115x").llvm_generic == "gfx11-generic"

def test_gfx117x_has_gfx11_7_generic(self):
"""GFX11.7 is not covered by gfx11-generic; it has its own."""
assert lookup_bundle("gfx117x").llvm_generic == "gfx11-7-generic"

def test_gfx12_0_has_gfx12_generic(self):
assert lookup_bundle("gfx12_0").llvm_generic == "gfx12-generic"
Expand All @@ -416,3 +424,10 @@ def test_gfx9_family_no_generic(self):
def test_gfx12_family_no_generic(self):
"""No gfx12-generic at family (it's at sub-family gfx12_0)."""
assert lookup_bundle("gfx12").llvm_generic is None

def test_family_generic_covers_every_sub_family(self):
for family_key, sub_families in _FAMILY_TO_SUB_FAMILIES.items():
family = lookup_bundle(family_key)
sub_family_generics = {sf.llvm_generic for sf in sub_families}
if family.llvm_generic is not None:
assert sub_family_generics == {family.llvm_generic}
Loading