Fix #38: 补全昇腾950系列硬件规格 (新增 Ascend950DT 等 4 个 SKU), 默认加载不变
- 数据源: 昇腾950_NPU架构白皮书 表3-1 (系列 SKU) / 表4-2 (Memory 层次) - 新增 hardware/ascend950dt.py: ASCEND950DT (36AIC/72AIV, HBM 4TB/s 144GB, L2 128MB 主bin) + ASCEND950DT_C32 + ASCEND950DT_C28 - ascend950pr.py: 新增 ASCEND950PR_C28 (28核, 1.4TB/s, L2 112MB) 与 gm_capacity_gb 信息字段; 注明 cube_peak_tflops 口径 (= 白皮书 "Cube+Vector 总算力" 行, 与 Cube 单行 432 的 12.5% 偏差待用户裁决) - __init__.py: SPECS 注册表 + get_spec(name), 默认仍为 ASCEND950PR, 现有 import 与调用点零改动 - 共架构交叉验证: 单核 Cube 13.5T (432/32=486/36), Vector fp32 27T/64核≈30T/72核 -> 128lane@1.65GHz; 表4-2 L1/L0/UB 各档一致 - docs/01_软件架构 + README 硬件层说明更新 - tests: TestIssue38 六例 (默认不变/注册表/DT派生量/AIV白皮书验证/DT路由 冒烟/未知KeyError); 87/87 通过; examples 44例 0 diff; 压力回归 10000 例干净, 分支分布与上轮逐数一致
This commit is contained in:
@@ -1028,5 +1028,79 @@ class TestIssue37(unittest.TestCase):
|
||||
self.assertAlmostEqual(t.t_total, t.t_steady + t.t_drain)
|
||||
|
||||
|
||||
class TestIssue38(unittest.TestCase):
|
||||
"""issue#38: 昇腾950 系列多 SKU 硬件规格 (950PR 32/28核 + 950DT 36/32/28核,
|
||||
白皮书表3-1/表4-2), 默认加载调用不变."""
|
||||
|
||||
def test_default_spec_unchanged(self):
|
||||
# 默认加载调用不受影响: ASCEND950PR 各项与 NpuSpec() 关键字默认构造等价
|
||||
from bmm_theory.hardware import NpuSpec, get_spec
|
||||
s = ASCEND950PR
|
||||
self.assertEqual((s.aic_num, s.aiv_num), (32, 64))
|
||||
self.assertEqual(s.bw_gm, 1.6e12)
|
||||
self.assertEqual(s.l2_bytes, 128 * 1024 * 1024)
|
||||
self.assertAlmostEqual(s.q16, 486e12 / 32)
|
||||
self.assertEqual(s.gm_capacity_gb, 128.0)
|
||||
self.assertIs(get_spec(), ASCEND950PR) # 默认 = 950PR 主bin
|
||||
self.assertIs(get_spec("Ascend950PR"), ASCEND950PR)
|
||||
self.assertEqual(NpuSpec(), ASCEND950PR) # 无参构造 == 主bin
|
||||
|
||||
def test_spec_registry_five_skus(self):
|
||||
from bmm_theory.hardware import SPECS
|
||||
self.assertEqual(sorted(SPECS), [
|
||||
"Ascend950DT", "Ascend950DT_C28", "Ascend950DT_C32",
|
||||
"Ascend950PR", "Ascend950PR_C28"])
|
||||
for s in SPECS.values():
|
||||
# 共架构: 单核 Cube 口径全系列一致 (白皮书总算力行取整, 28核档
|
||||
# 425/28=15.179T 与 15.1875T 差 0.06%, 容差 0.1%); AIV 恒为 AIC 两倍
|
||||
self.assertLess(abs(s.q16 / (486e12 / 32) - 1), 1e-3)
|
||||
self.assertEqual(s.aiv_num, 2 * s.aic_num)
|
||||
self.assertEqual(s.l1_bytes, 512 * 1024) # 表4-2 各档一致
|
||||
self.assertEqual(s.l0c_bytes, 256 * 1024)
|
||||
|
||||
def test_950dt_specs(self):
|
||||
from bmm_theory.hardware import (ASCEND950DT, ASCEND950DT_C28,
|
||||
ASCEND950DT_C32)
|
||||
self.assertEqual((ASCEND950DT.aic_num, ASCEND950DT.aiv_num), (36, 72))
|
||||
self.assertEqual(ASCEND950DT.bw_gm, 4.0e12) # 4TB/s HBM
|
||||
self.assertEqual(ASCEND950DT.l2_bytes, 128 * 1024 * 1024)
|
||||
self.assertEqual(ASCEND950DT.gm_capacity_gb, 144.0)
|
||||
self.assertEqual(ASCEND950DT.cube_peak_tflops, 547.0)
|
||||
self.assertEqual((ASCEND950DT_C32.aic_num,
|
||||
ASCEND950DT_C32.cube_peak_tflops), (32, 486.0))
|
||||
self.assertEqual((ASCEND950DT_C28.aic_num,
|
||||
ASCEND950DT_C28.cube_peak_tflops), (28, 425.0))
|
||||
self.assertEqual(ASCEND950DT_C28.gm_capacity_gb, 96.0)
|
||||
# 派生量: 单核 GM 份额 4TB/36; r16 平衡点随带宽升至 4TB/s 而减半
|
||||
self.assertAlmostEqual(ASCEND950DT.bw_pc, 4.0e12 / 36)
|
||||
self.assertAlmostEqual(ASCEND950DT.r16, 547e12 / (4.0e12 / 2))
|
||||
self.assertAlmostEqual(ASCEND950DT_C32.r16, 486e12 / (4.0e12 / 2))
|
||||
# AIV 白皮书交叉验证: fp32 通量 72 核 x 128 lane x 1.65GHz x 2 ≈ 30T
|
||||
self.assertAlmostEqual(ASCEND950DT.aiv_elem_rate_fp32 * 2 / 1e12,
|
||||
30.0, places=0)
|
||||
|
||||
def test_950pr_c28(self):
|
||||
from bmm_theory.hardware import ASCEND950PR_C28
|
||||
self.assertEqual((ASCEND950PR_C28.aic_num,
|
||||
ASCEND950PR_C28.aiv_num), (28, 56))
|
||||
self.assertEqual(ASCEND950PR_C28.bw_gm, 1.4e12)
|
||||
self.assertEqual(ASCEND950PR_C28.l2_bytes, 112 * 1024 * 1024)
|
||||
self.assertEqual(ASCEND950PR_C28.gm_capacity_gb, 112.0)
|
||||
|
||||
def test_get_spec_unknown_raises(self):
|
||||
from bmm_theory.hardware import get_spec
|
||||
with self.assertRaises(KeyError):
|
||||
get_spec("Ascend910")
|
||||
|
||||
def test_dt_router_smoke(self):
|
||||
# 换芯片只换 spec: DT 路由/时延正常; 同一 case GM 段 4TB/s 快于 1.6TB/s
|
||||
from bmm_theory.hardware import ASCEND950DT
|
||||
case = mkcase(8, 4096, 4096, 1024)
|
||||
r_dt = BranchRouter(ASCEND950DT).route(case)
|
||||
r_pr = BranchRouter().route(case)
|
||||
self.assertGreater(r_dt["timing"].t_total, 0.0)
|
||||
self.assertLess(r_dt["timing"].t_mte2_gm, r_pr["timing"].t_mte2_gm)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user