From 96860647bc4a883db81da9194ee9048556fae314 Mon Sep 17 00:00:00 2001 From: DouZhichong Date: Fri, 26 Sep 2025 17:10:05 +0800 Subject: [PATCH] add blis test cases --- .../blis/tc_blis_basic_fun001.yaml | 47 +++++++++++++ .../blis/tc_blis_devel_fun002.yaml | 42 +++++++++++ .../blis/tc_blis_mixed_precision_fun009.yaml | 41 +++++++++++ .../system_base/blis/tc_blis_numa_fun010.yaml | 42 +++++++++++ .../blis/tc_blis_openmp64_fun004.yaml | 38 ++++++++++ .../blis/tc_blis_openmp_fun003.yaml | 40 +++++++++++ .../blis/tc_blis_serial64_fun005.yaml | 40 +++++++++++ .../blis/tc_blis_special_fun008.yaml | 37 ++++++++++ .../blis/tc_blis_threads64_fun007.yaml | 41 +++++++++++ .../blis/tc_blis_threads_fun006.yaml | 40 +++++++++++ .../system_base/blis/tc_blis_basic_fun001.py | 39 +++++++++++ .../system_base/blis/tc_blis_devel_fun002.py | 70 +++++++++++++++++++ .../blis/tc_blis_mixed_precision_fun009.py | 39 +++++++++++ tests/system_base/blis/tc_blis_numa_fun010.py | 40 +++++++++++ .../blis/tc_blis_openmp64_fun004.py | 43 ++++++++++++ .../system_base/blis/tc_blis_openmp_fun003.py | 43 ++++++++++++ .../blis/tc_blis_serial64_fun005.py | 39 +++++++++++ .../blis/tc_blis_special_fun008.py | 36 ++++++++++ .../blis/tc_blis_threads64_fun007.py | 43 ++++++++++++ .../blis/tc_blis_threads_fun006.py | 42 +++++++++++ 20 files changed, 842 insertions(+) create mode 100644 docs/system_base/blis/tc_blis_basic_fun001.yaml create mode 100644 docs/system_base/blis/tc_blis_devel_fun002.yaml create mode 100644 docs/system_base/blis/tc_blis_mixed_precision_fun009.yaml create mode 100644 docs/system_base/blis/tc_blis_numa_fun010.yaml create mode 100644 docs/system_base/blis/tc_blis_openmp64_fun004.yaml create mode 100644 docs/system_base/blis/tc_blis_openmp_fun003.yaml create mode 100644 docs/system_base/blis/tc_blis_serial64_fun005.yaml create mode 100644 docs/system_base/blis/tc_blis_special_fun008.yaml create mode 100644 docs/system_base/blis/tc_blis_threads64_fun007.yaml create mode 100644 docs/system_base/blis/tc_blis_threads_fun006.yaml create mode 100644 tests/system_base/blis/tc_blis_basic_fun001.py create mode 100644 tests/system_base/blis/tc_blis_devel_fun002.py create mode 100644 tests/system_base/blis/tc_blis_mixed_precision_fun009.py create mode 100644 tests/system_base/blis/tc_blis_numa_fun010.py create mode 100644 tests/system_base/blis/tc_blis_openmp64_fun004.py create mode 100644 tests/system_base/blis/tc_blis_openmp_fun003.py create mode 100644 tests/system_base/blis/tc_blis_serial64_fun005.py create mode 100644 tests/system_base/blis/tc_blis_special_fun008.py create mode 100644 tests/system_base/blis/tc_blis_threads64_fun007.py create mode 100644 tests/system_base/blis/tc_blis_threads_fun006.py diff --git a/docs/system_base/blis/tc_blis_basic_fun001.yaml b/docs/system_base/blis/tc_blis_basic_fun001.yaml new file mode 100644 index 00000000..6a641d29 --- /dev/null +++ b/docs/system_base/blis/tc_blis_basic_fun001.yaml @@ -0,0 +1,47 @@ +作者: douzhichong +优先级: P0 +支持架构: noarch +执行方式: 自动 +测试类型: 功能测试 +通用标签: local, blis, basic +用例描述: 验证BLIS基础向量和矩阵运算功能 +修改人: douzhichong + +前置条件: +- 执行命令: rpm -q blis python3-numpy +- 软件要求: + - BLIS基础库 + - NumPy ≥ 1.19 (稳定类型支持) + +测试步骤: +- ## 向量运算测试 + - 数据类型: + - float32: 单精度浮点 + - float64: 双精度浮点 + - complex64: 单精度复数 + - complex128: 双精度复数 + - 操作: + - 向量加法 [1,2,3] + [4,5,6] + - 验证: + - 结果 == [5,7,9] + - 误差容限 < 数据类型epsilon的10倍 + +- ## 矩阵运算测试 + - 数据类型: 同向量测试 + - 输入矩阵: + - A: [[1,2],[3,4]] + - B: [[5,6],[7,8]] + - 操作: 矩阵乘法 (A @ B) + - 验证: + - 结果 == [[19,22],[43,50]] + - 误差容限 < 数据类型epsilon的100倍 + +期望结果: +- 所有数据类型运算结果正确 +- 向量运算误差 < 1e-6 (float32) +- 矩阵运算误差 < 1e-12 (float64) +- 复数运算保持共轭对称性 +- 无类型提升或截断错误 + +环境清理: +- 无持久化资源需要清理 diff --git a/docs/system_base/blis/tc_blis_devel_fun002.yaml b/docs/system_base/blis/tc_blis_devel_fun002.yaml new file mode 100644 index 00000000..b7e97721 --- /dev/null +++ b/docs/system_base/blis/tc_blis_devel_fun002.yaml @@ -0,0 +1,42 @@ +作者: douzhichong +优先级: P1 +支持架构: noarch +执行方式: 自动 +测试类型: 功能测试 +通用标签: local, blis-devel, blas +用例描述: 验证BLIS开发包BLAS Level 3函数功能 +修改人: douzhichong + +前置条件: +- 执行命令: rpm -q blis-devel python3-scipy python3-numpy +- 环境要求: + - BLIS开发头文件存在 + - SciPy ≥ 1.6 (稳定BLAS接口) + - NumPy ≥ 1.20 (稳定F-order支持) + +测试步骤: +- ## DGEMM测试(实数双精度) + - 输入矩阵: + - A: [[1,2],[3,4]] (float64, F-order) + - B: [[5,6],[7,8]] (float64, F-order) + - 运算: dgemm(1.0, A, B) + - 验证: + - 结果值匹配: [[19,22],[43,50]] + - 数值误差 < 1e-8 + +- ## ZGEMM测试(复数双精度) + - 输入矩阵: + - A: [[1+2j,2+3j],[3+4j,4+5j]] (complex128, F-order) + - B: [[5+6j,6+7j],[7+8j,8+9j]] (complex128, F-order) + - 运算: zgemm(1.0, A, B) + - 验证: + - 结果与手动计算值一致 + - 最大元素误差 < 1e-8 + - 复数分量误差独立控制 + +期望结果: +- 所有BLAS函数返回正确结果 +- 实数运算误差 < 1e-8 +- 复数运算误差 < 1e-8 +- 内存布局(F-order)正确处理 +- 无内存泄漏或段错误 diff --git a/docs/system_base/blis/tc_blis_mixed_precision_fun009.yaml b/docs/system_base/blis/tc_blis_mixed_precision_fun009.yaml new file mode 100644 index 00000000..d6a36249 --- /dev/null +++ b/docs/system_base/blis/tc_blis_mixed_precision_fun009.yaml @@ -0,0 +1,41 @@ +作者: douzhichong +优先级: P1 +支持架构: noarch +执行方式: 自动 +测试类型: 功能测试 +通用标签: local, blis-openmp, mixed-precision +用例描述: 测试BLIS混合精度矩阵运算功能 +修改人: douzhichong + +前置条件: +- 执行命令: rpm -q blis-openmp python3-numpy +- 软件要求: + - BLIS ≥ 3.0 (支持自动类型提升) + - NumPy ≥ 1.20 (稳定混合精度支持) + +测试步骤: +- ## 浮点混合精度测试 + - 输入矩阵: + - A: float32 (100×100) + - B: float64 (100×100) + - 运算: 矩阵乘法 (A @ B) + - 验证: + - 结果类型为float64 + - 数值精度误差 < 1e-8 + +- ## 复数-实数混合测试 + - 输入矩阵: + - A: complex64 (10×10) + - B: float32 (10×10) + - 运算: 矩阵乘法 (A @ B) + - 验证: + - 结果类型为complex64 + - 数值精度误差 < 1e-6 + +期望结果: +- 自动完成精度提升: + - float32 ⊗ float64 → float64 + - complex64 ⊗ float32 → complex64 +- 无数值溢出或精度损失 +- 支持OpenMP并行计算 + diff --git a/docs/system_base/blis/tc_blis_numa_fun010.yaml b/docs/system_base/blis/tc_blis_numa_fun010.yaml new file mode 100644 index 00000000..1ac9b81e --- /dev/null +++ b/docs/system_base/blis/tc_blis_numa_fun010.yaml @@ -0,0 +1,42 @@ +# tc_blis_numa_fun010.yaml +作者: douzhichong +优先级: P1 +支持架构: x86_64,aarch64 +执行方式: 自动 +测试类型: 功能测试 +通用标签: local, blis-threads, numa +用例描述: 测试BLIS在NUMA架构下的内存分配策略 +修改人: douzhichong + +前置条件: +- 执行命令: + - rpm -q blis-threads python3-numpy numactl + - numactl --hardware +- 硬件要求: + - NUMA节点数 ≥ 2 + - 每个节点内存 ≥ 4GB + - CPU核心数 ≥ 8 + +测试步骤: +- ## NUMA交错分配测试 + - 设置: BLIS_NUMA="--interleave=all" + - 操作: 2000×2000矩阵乘法 + - 验证: + - 结果矩阵与输入矩阵数值相等(误差<1e-10) + - 内存均匀分布在所有NUMA节点 + +- ## NUMA节点绑定测试 + - 设置: BLIS_NUMA="--cpunodebind=0" + - 操作: 相同矩阵乘法 + - 验证: + - 计算结果正确 + - 内存分配限制在节点0 + +期望结果: +- 两种NUMA策略下计算结果均正确 +- 无内存分配错误 +- 无跨节点访问性能惩罚 + +环境清理: +- 删除临时环境变量BLIS_NUMA +- 释放矩阵内存 diff --git a/docs/system_base/blis/tc_blis_openmp64_fun004.yaml b/docs/system_base/blis/tc_blis_openmp64_fun004.yaml new file mode 100644 index 00000000..7d21769a --- /dev/null +++ b/docs/system_base/blis/tc_blis_openmp64_fun004.yaml @@ -0,0 +1,38 @@ +作者: douzhichong +优先级: P1 +支持架构: x86_64,aarch64 +执行方式: 自动 +测试类型: 性能测试 +通用标签: local, blis-openmp64, large-matrix, parallel +用例描述: 测试64位BLIS OpenMP大矩阵并行计算功能 +修改人: douzhichong + +前置条件: +- 执行命令: rpm -q blis-openmp64 python3-numpy +- 系统要求: + - 内存 ≥ 32GB (5000×5000双精度矩阵约需200MB×3=600MB) + - CPU核心数 ≥ 4 + - 64位操作系统 + - 禁用CPU节能模式 + +测试步骤: +- ## 内存分配验证 + - 操作: 分配5000×5000零矩阵和单位矩阵 + - 验证: 内存分配成功或优雅跳过测试 + +- ## 并行矩阵乘法 + - 设置: OMP_NUM_THREADS=4 + - 操作: 零矩阵与单位矩阵乘法 + - 验证: + - 结果矩阵与输入矩阵二进制相等(np.array_equal) + - 无内存错误或线程竞争 + +- ## 并行性能监控 + - 记录: 计算耗时和内存使用峰值 + - 阈值: 4线程计算时间 < 15秒 (参考值) + +期望结果: +- 成功完成大矩阵并行计算 +- 结果精度完全匹配(二进制相等) +- 线程利用率 ≥ 90% (4线程时) + diff --git a/docs/system_base/blis/tc_blis_openmp_fun003.yaml b/docs/system_base/blis/tc_blis_openmp_fun003.yaml new file mode 100644 index 00000000..0dae97f4 --- /dev/null +++ b/docs/system_base/blis/tc_blis_openmp_fun003.yaml @@ -0,0 +1,40 @@ +作者: douzhichong +优先级: P1 +支持架构: noarch +执行方式: 自动 +测试类型: 功能测试 +通用标签: local, blis-openmp, parallel +用例描述: 测试BLIS OpenMP多线程矩阵乘法功能 +修改人: douzhichong + +前置条件: +- 执行命令: rpm -q blis-openmp python3-numpy +- 环境准备: + - 支持OpenMP 4.0+ + - CPU核心数 ≥ 4 + - 内存 ≥ 4GB + +测试步骤: +- ## 单线程测试 + - 设置: OMP_NUM_THREADS=1 + - 操作: 1000×1000随机矩阵乘法 + - 验证: 结果矩阵维度正确(1000×1000) + +- ## 双线程测试 + - 设置: OMP_NUM_THREADS=2 + - 操作: 相同矩阵乘法 + - 验证: 结果正确且无线程竞争 + +- ## 四线程测试 + - 设置: OMP_NUM_THREADS=4 + - 操作: 相同矩阵乘法 + - 验证: 结果正确且无内存错误 + +期望结果: +- 所有线程配置下计算正确 +- 结果矩阵精度误差 < 1e-12 +- 线程数增加时无资源竞争 + +环境清理: +- 恢复OMP_NUM_THREADS环境变量 +- 释放矩阵内存 diff --git a/docs/system_base/blis/tc_blis_serial64_fun005.yaml b/docs/system_base/blis/tc_blis_serial64_fun005.yaml new file mode 100644 index 00000000..503c4229 --- /dev/null +++ b/docs/system_base/blis/tc_blis_serial64_fun005.yaml @@ -0,0 +1,40 @@ +作者: douzhichong +优先级: P1 +支持架构: x86_64,aarch64 +执行方式: 自动 +测试类型: 功能测试 +通用标签: local, blis-serial64, large-matrix +用例描述: 测试64位BLIS串行大矩阵乘法功能 +修改人: douzhichong + +前置条件: +- 执行命令: rpm -q blis-serial64 python3-numpy +- 系统要求: + - 内存 ≥ 16GB (5000×5000双精度矩阵约需200MB×3=600MB) + - 64位操作系统 + - 禁用CPU节能模式 + +测试步骤: +- ## 内存分配验证 + - 操作: 分配5000×5000零矩阵和单位矩阵 + - 验证: 内存分配成功或优雅跳过测试 + +- ## 大矩阵乘法 + - 操作: 执行零矩阵与单位矩阵乘法 + - 验证: + - 结果矩阵与输入矩阵完全相等(np.array_equal) + - 无内存泄漏或计算错误 + +- ## 串行性能验证(可选) + - 记录: 计算耗时 + - 阈值: 单线程计算时间 < 60秒 (参考值) + +期望结果: +- 成功完成大矩阵乘法运算 +- 结果精度完全匹配(二进制相等) +- 严格单线程执行(无并行加速) + +环境清理: +- 释放大矩阵内存 +- 保持环境变量不变 + diff --git a/docs/system_base/blis/tc_blis_special_fun008.yaml b/docs/system_base/blis/tc_blis_special_fun008.yaml new file mode 100644 index 00000000..85a5a448 --- /dev/null +++ b/docs/system_base/blis/tc_blis_special_fun008.yaml @@ -0,0 +1,37 @@ +作者: douzhichong +优先级: P1 +支持架构: noarch +执行方式: 自动 +测试类型: 功能测试 +通用标签: local, blis, special-matrix +用例描述: 测试BLIS特殊矩阵运算功能 +修改人: douzhichong + +前置条件: +- 执行命令: rpm -q blis python3-numpy +- 软件依赖: + - BLIS基础库 + - NumPy ≥ 1.16 + +测试步骤: +- ## 对称矩阵测试 + - 测试矩阵: [[1, 2], [2, 3]] + - 运算类型: 自乘(S×S) + - 预期结果: [[5, 8], [8, 13]] + - 误差容忍: 1e-10 + +- ## 三角矩阵测试 + - 下三角矩阵: [[1, 0], [2, 3]] + - 上三角矩阵: [[1, 2], [0, 3]] + - 运算类型: 乘法(L×U) + - 预期结果: [[1, 2], [2, 13]] + - 误差容忍: 1e-10 + +期望结果: +- 对称矩阵运算结果精确匹配 +- 三角矩阵乘法结果正确 +- 无数值计算溢出 +- 支持所有浮点精度模式 + +环境清理: +- 无持久化资源需要清理 \ No newline at end of file diff --git a/docs/system_base/blis/tc_blis_threads64_fun007.yaml b/docs/system_base/blis/tc_blis_threads64_fun007.yaml new file mode 100644 index 00000000..57a7337e --- /dev/null +++ b/docs/system_base/blis/tc_blis_threads64_fun007.yaml @@ -0,0 +1,41 @@ +# tc_blis_threads64_fun007.yaml +作者: douzhichong +优先级: P1 +支持架构: x86_64,aarch64 +执行方式: 自动 +测试类型: 性能测试 +通用标签: local, blis-threads64, large-matrix +用例描述: 测试64位BLIS多线程大矩阵乘法功能 +修改人: douzhichong + +前置条件: +- 执行命令: rpm -q blis-threads64 python3-numpy +- 系统要求: + - 内存 ≥ 16GB (5000×5000双精度矩阵约需200MB×3=600MB) + - 64位操作系统 + - CPU支持AVX/NEON指令集 + +测试步骤: +- ## 内存预分配检查 + - 操作: 尝试分配5000×5000零矩阵 + - 验证: 内存分配成功或优雅跳过 + +- ## 多线程矩阵乘法 + - 设置环境变量: BLIS_NUM_THREADS=4 + - 执行操作: 5000×5000单位矩阵乘法 + - 验证: + - 结果矩阵与输入矩阵完全相等 + - 无内存错误或线程崩溃 + +- ## 性能监控(可选) + - 记录: 计算耗时和内存使用峰值 + - 阈值: 计算时间 < 30秒 (参考值) + +期望结果: +- 成功完成大矩阵乘法运算 +- 结果精度完全匹配(误差<1e-12) +- 多线程工作正常无竞争 + +环境清理: +- 释放大矩阵内存 +- 恢复BLIS_NUM_THREADS环境变量 diff --git a/docs/system_base/blis/tc_blis_threads_fun006.yaml b/docs/system_base/blis/tc_blis_threads_fun006.yaml new file mode 100644 index 00000000..1a8c52ea --- /dev/null +++ b/docs/system_base/blis/tc_blis_threads_fun006.yaml @@ -0,0 +1,40 @@ +# tc_blis_threads_fun006.yaml +作者: douzhichong +优先级: P1 +支持架构: noarch +执行方式: 自动 +测试类型: 功能测试 +通用标签: local, blis-threads, parallel +用例描述: 测试BLIS多线程矩阵乘法功能 +修改人: douzhichong + +前置条件: +- 执行命令: rpm -q blis-threads python3-numpy +- 环境准备: + - 确保系统支持多线程 + - 内存可用空间 ≥ 2GB + +测试步骤: +- ## 测试单线程模式 + - 设置环境变量: BLIS_NUM_THREADS=1 + - 执行操作: 1000×1000 矩阵乘法 + - 验证: 结果矩阵形状正确 (1000×1000) + +- ## 测试双线程模式 + - 设置环境变量: BLIS_NUM_THREADS=2 + - 执行操作: 1000×1000 矩阵乘法 + - 验证: 结果矩阵形状正确 (1000×1000) + +- ## 测试四线程模式 + - 设置环境变量: BLIS_NUM_THREADS=4 + - 执行操作: 1000×1000 矩阵乘法 + - 验证: 结果矩阵形状正确 (1000×1000) + +期望结果: +- 所有线程配置下矩阵乘法运算正常完成 +- 结果矩阵维度与输入矩阵匹配 +- 无内存泄漏或线程竞争问题 + +环境清理: +- 恢复原始线程设置: BLIS_NUM_THREADS=原值 +- 释放矩阵内存 diff --git a/tests/system_base/blis/tc_blis_basic_fun001.py b/tests/system_base/blis/tc_blis_basic_fun001.py new file mode 100644 index 00000000..46a3e732 --- /dev/null +++ b/tests/system_base/blis/tc_blis_basic_fun001.py @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- + +""" +@File: tc_blis_basic_fun001.py +@Time: 2025/09/26 17:00:00 +@Author: douzhichong +@Version: 1.0 +@Contact: douzhichong@inspur.com +@License: Mulan PSL v2 +""" + +import numpy as np +from common.basetest import LocalTest + +class Test(LocalTest): + """ + See tc_blis_basic_fun001.yaml for details + + :avocado: tags=P0,noarch,local,blis + """ + PARAM_DIC = {"pkg_name": "blis"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd("rpm -q blis") + + def test(self): + + for dtype in [np.float32, np.float64, np.complex64, np.complex128]: + v1 = np.array([1, 2, 3], dtype=dtype) + v2 = np.array([4, 5, 6], dtype=dtype) + assert np.allclose(v1 + v2, [5, 7, 9]), f"{dtype} vector addition failed" + + m1 = np.array([[1, 2], [3, 4]], dtype=dtype) + m2 = np.array([[5, 6], [7, 8]], dtype=dtype) + assert np.allclose(m1 @ m2, [[19, 22], [43, 50]]), f"{dtype} matrix multiplication failed" + + def tearDown(self): + super().tearDown(self.PARAM_DIC) \ No newline at end of file diff --git a/tests/system_base/blis/tc_blis_devel_fun002.py b/tests/system_base/blis/tc_blis_devel_fun002.py new file mode 100644 index 00000000..dcc9ac49 --- /dev/null +++ b/tests/system_base/blis/tc_blis_devel_fun002.py @@ -0,0 +1,70 @@ +# -*- encoding: utf-8 -*- + +""" +@File: tc_blis_devel_fun002.py +@Time: 2025/09/26 17:00:00 +@Author: douzhichong +@Version: 1.0 +@Contact: douzhichong@inspur.com +@License: Mulan PSL v2 +""" + +import numpy as np +from common.basetest import LocalTest + + +class Test(LocalTest): + """ + See tc_blis_devel_fun002.yaml for details + + :avocado: tags=P1,noarch,local,blis-devel + """ + PARAM_DIC = {"pkg_name": "blis-devel"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + + self.rtol = 1e-8 + self.atol = 1e-8 + + def test(self): + + from scipy.linalg import blas + + A_real = np.array([[1, 2], [3, 4]], dtype=np.float64, order='F') + B_real = np.array([[5, 6], [7, 8]], dtype=np.float64, order='F') + + C_real = blas.dgemm(1.0, A_real, B_real) + expected_real = np.array([[19, 22], [43, 50]]) + assert np.allclose(C_real, expected_real, rtol=self.rtol, atol=self.atol), \ + f"DGEMM failed:\nGot:\n{C_real}\nExpected:\n{expected_real}" + + A_complex = np.array([ + [1 + 2j, 2 + 3j], + [3 + 4j, 4 + 5j] + ], dtype=np.complex128, order='F') + + B_complex = np.array([ + [5 + 6j, 6 + 7j], + [7 + 8j, 8 + 9j] + ], dtype=np.complex128, order='F') + + expected_complex = np.zeros((2, 2), dtype=np.complex128) + for i in range(2): + for j in range(2): + for k in range(2): + expected_complex[i, j] += A_complex[i, k] * B_complex[k, j] + + C_complex = blas.zgemm(1.0, A_complex, B_complex) + + if not np.allclose(C_complex, expected_complex, rtol=self.rtol, atol=self.atol): + diff = np.abs(C_complex - expected_complex) + max_diff = np.max(diff) + self.log.error(f"ZGEMM validation failed. Max difference: {max_diff}") + self.log.debug("Actual result:\n" + str(C_complex)) + self.log.debug("Expected result:\n" + str(expected_complex)) + self.fail(f"ZGEMM failed with max difference {max_diff:.2e} " + f"(tolerance rtol={self.rtol}, atol={self.atol})") + + def tearDown(self): + super().tearDown(self.PARAM_DIC) \ No newline at end of file diff --git a/tests/system_base/blis/tc_blis_mixed_precision_fun009.py b/tests/system_base/blis/tc_blis_mixed_precision_fun009.py new file mode 100644 index 00000000..c64b757f --- /dev/null +++ b/tests/system_base/blis/tc_blis_mixed_precision_fun009.py @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- + +""" +@File: tc_blis_mixed_precision_fun009.py +@Time: 2025/09/26 17:00:00 +@Author: douzhichong +@Version: 1.0 +@Contact: douzhichong@inspur.com +@License: Mulan PSL v2 +""" + +import numpy as np +from common.basetest import LocalTest + +class Test(LocalTest): + """ + See tc_blis_mixed_precision_fun009.yaml for details + + :avocado: tags=P1,noarch,local,blis-openmp + """ + PARAM_DIC = {"pkg_name": "blis-openmp"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + + def test(self): + + A = np.random.rand(100, 100).astype(np.float32) + B = np.random.rand(100, 100).astype(np.float64) + C = A @ B + assert C.dtype == np.float64, "Mixed precision failed" + + A = np.random.rand(10, 10).astype(np.complex64) + B = np.random.rand(10, 10).astype(np.float32) + C = A @ B + assert C.dtype == np.complex64, "Complex-real mixed failed" + + def tearDown(self): + super().tearDown(self.PARAM_DIC) \ No newline at end of file diff --git a/tests/system_base/blis/tc_blis_numa_fun010.py b/tests/system_base/blis/tc_blis_numa_fun010.py new file mode 100644 index 00000000..be97d6ba --- /dev/null +++ b/tests/system_base/blis/tc_blis_numa_fun010.py @@ -0,0 +1,40 @@ +# -*- encoding: utf-8 -*- + +""" +@File: tc_blis_numa_fun010.py +@Time: 2025/09/26 17:00:00 +@Author: douzhichong +@Version: 1.0 +@Contact: douzhichong@inspur.com +@License: Mulan PSL v2 +""" + +import numpy as np +import os +from common.basetest import LocalTest + + +class Test(LocalTest): + """ + See tc_blis_numa_fun010.yaml for details + + :avocado: tags=P1,arch,local,blis-threads + """ + PARAM_DIC = {"pkg_name": "blis-threads"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd("numactl --hardware") + + def test(self): + n = 2000 + A = np.ones((n, n)) + B = np.eye(n) + + for policy in ["--interleave=all", "--cpunodebind=0"]: + os.environ['BLIS_NUMA'] = policy + C = A @ B + assert np.allclose(C, A), f"NUMA policy {policy} failed" + + def tearDown(self): + super().tearDown(self.PARAM_DIC) \ No newline at end of file diff --git a/tests/system_base/blis/tc_blis_openmp64_fun004.py b/tests/system_base/blis/tc_blis_openmp64_fun004.py new file mode 100644 index 00000000..61d26edb --- /dev/null +++ b/tests/system_base/blis/tc_blis_openmp64_fun004.py @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- + +""" +@File: tc_blis_openmp64_fun004.py +@Time: 2025/09/26 17:00:00 +@Author: douzhichong +@Version: 1.0 +@Contact: douzhichong@inspur.com +@License: Mulan PSL v2 +""" + +import numpy as np +import os +from common.basetest import LocalTest + +class Test(LocalTest): + """ + See tc_blis_openmp64_fun004.yaml for details + + :avocado: tags=P1,arch,local,blis-openmp64 + """ + PARAM_DIC = {"pkg_name": "blis-openmp64"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd("rpm -q blis-openmp64") + self.orig_threads = os.environ.get('OMP_NUM_THREADS', '1') + + def test(self): + + n = 5000 + try: + A = np.zeros((n, n)) + I = np.eye(n) + os.environ['OMP_NUM_THREADS'] = '4' + C = A @ I + assert np.array_equal(C, A), "Large OpenMP matrix multiply failed" + except MemoryError: + self.skipTest("Not enough memory for large matrix test") + + def tearDown(self): + os.environ['OMP_NUM_THREADS'] = self.orig_threads + super().tearDown(self.PARAM_DIC) \ No newline at end of file diff --git a/tests/system_base/blis/tc_blis_openmp_fun003.py b/tests/system_base/blis/tc_blis_openmp_fun003.py new file mode 100644 index 00000000..cbcaf249 --- /dev/null +++ b/tests/system_base/blis/tc_blis_openmp_fun003.py @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- + +""" +@File: tc_blis_openmp_fun003.py +@Time: 2025/09/26 10:00:00 +@Author: douzhichong +@Version: 1.0 +@Contact: douzhichong@inspur.com +@License: Mulan PSL v2 +""" + +import numpy as np +import os +from common.basetest import LocalTest + + +class Test(LocalTest): + """ + See tc_blis_openmp_fun003.yaml for details + + :avocado: tags=P1,noarch,local,blis-openmp + """ + PARAM_DIC = {"pkg_name": "blis-openmp"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd("rpm -q blis-openmp") + self.orig_threads = os.environ.get('OMP_NUM_THREADS', '1') + + def test(self): + # Test thread scaling + n = 1000 + A = np.random.rand(n, n) + B = np.random.rand(n, n) + + for threads in [1, 2, 4]: + os.environ['OMP_NUM_THREADS'] = str(threads) + C = A @ B + assert C.shape == (n, n), f"OpenMP with {threads} threads failed" + + def tearDown(self): + os.environ['OMP_NUM_THREADS'] = self.orig_threads + super().tearDown(self.PARAM_DIC) \ No newline at end of file diff --git a/tests/system_base/blis/tc_blis_serial64_fun005.py b/tests/system_base/blis/tc_blis_serial64_fun005.py new file mode 100644 index 00000000..a1713f7d --- /dev/null +++ b/tests/system_base/blis/tc_blis_serial64_fun005.py @@ -0,0 +1,39 @@ +# -*- encoding: utf-8 -*- + +""" +@File: tc_blis_serial64_fun005.py +@Time: 2025/09/26 17:00:00 +@Author: douzhichong +@Version: 1.0 +@Contact: douzhichong@inspur.com +@License: Mulan PSL v2 +""" + +import numpy as np +from common.basetest import LocalTest + +class Test(LocalTest): + """ + See tc_blis_serial64_fun005.yaml for details + + :avocado: tags=P1,arch,local,blis-serial64 + """ + PARAM_DIC = {"pkg_name": "blis-serial64"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd("rpm -q blis-serial64") + + def test(self): + + n = 5000 + try: + A = np.zeros((n, n)) + I = np.eye(n) + C = A @ I + assert np.array_equal(C, A), "Large serial matrix multiply failed" + except MemoryError: + self.skipTest("Not enough memory for large matrix test") + + def tearDown(self): + super().tearDown(self.PARAM_DIC) \ No newline at end of file diff --git a/tests/system_base/blis/tc_blis_special_fun008.py b/tests/system_base/blis/tc_blis_special_fun008.py new file mode 100644 index 00000000..4f3a994d --- /dev/null +++ b/tests/system_base/blis/tc_blis_special_fun008.py @@ -0,0 +1,36 @@ +# -*- encoding: utf-8 -*- + +""" +@File: tc_blis_special_fun008.py +@Time: 2025/09/26 17:00:00 +@Author: douzhichong +@Version: 1.0 +@Contact: douzhichong@inspur.com +@License: Mulan PSL v2 +""" + +import numpy as np +from common.basetest import LocalTest + +class Test(LocalTest): + """ + See tc_blis_special_fun008.yaml for details + + :avocado: tags=P1,noarch,local,blis + """ + PARAM_DIC = {"pkg_name": "blis"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + + def test(self): + + S = np.array([[1, 2], [2, 3]], dtype=np.float64) + assert np.allclose(S @ S, [[5, 8], [8, 13]]), "Symmetric matrix failed" + + L = np.array([[1, 0], [2, 3]], dtype=np.float64) + U = np.array([[1, 2], [0, 3]], dtype=np.float64) + assert np.allclose(L @ U, [[1, 2], [2, 13]]), "Triangular matrix failed" + + def tearDown(self): + super().tearDown(self.PARAM_DIC) \ No newline at end of file diff --git a/tests/system_base/blis/tc_blis_threads64_fun007.py b/tests/system_base/blis/tc_blis_threads64_fun007.py new file mode 100644 index 00000000..b76fced6 --- /dev/null +++ b/tests/system_base/blis/tc_blis_threads64_fun007.py @@ -0,0 +1,43 @@ +# -*- encoding: utf-8 -*- + +""" +@File: tc_blis_threads64_fun007.py +@Time: 2025/09/26 17:00:00 +@Author: douzhichong +@Version: 1.0 +@Contact: douzhichong@inspur.com +@License: Mulan PSL v2 +""" + +import numpy as np +import os +from common.basetest import LocalTest + +class Test(LocalTest): + """ + See tc_blis_threads64_fun007.yaml for details + + :avocado: tags=P1,arch,local,blis-threads64 + """ + PARAM_DIC = {"pkg_name": "blis-threads64"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd("rpm -q blis-threads64") + self.orig_threads = os.environ.get('BLIS_NUM_THREADS', '1') + + def test(self): + + n = 5000 + try: + A = np.zeros((n, n)) + I = np.eye(n) + os.environ['BLIS_NUM_THREADS'] = '4' + C = A @ I + assert np.array_equal(C, A), "Large threaded matrix multiply failed" + except MemoryError: + self.skipTest("Not enough memory for large matrix test") + + def tearDown(self): + os.environ['BLIS_NUM_THREADS'] = self.orig_threads + super().tearDown(self.PARAM_DIC) \ No newline at end of file diff --git a/tests/system_base/blis/tc_blis_threads_fun006.py b/tests/system_base/blis/tc_blis_threads_fun006.py new file mode 100644 index 00000000..1ea0cb8c --- /dev/null +++ b/tests/system_base/blis/tc_blis_threads_fun006.py @@ -0,0 +1,42 @@ +# -*- encoding: utf-8 -*- + +""" +@File: tc_blis_threads_fun006.py +@Time: 2025/09/26 17:00:00 +@Author: douzhichong +@Version: 1.0 +@Contact: douzhichong@inspur.com +@License: Mulan PSL v2 +""" + +import numpy as np +import os +from common.basetest import LocalTest + + +class Test(LocalTest): + """ + See tc_blis_threads_fun006.yaml for details + + :avocado: tags=P1,noarch,local,blis-threads + """ + PARAM_DIC = {"pkg_name": "blis-threads"} + + def setUp(self): + super().setUp(self.PARAM_DIC) + self.cmd("rpm -q blis-threads") + self.orig_threads = os.environ.get('BLIS_NUM_THREADS', '1') + + def test(self): + n = 1000 + A = np.random.rand(n, n) + B = np.random.rand(n, n) + + for threads in [1, 2, 4]: + os.environ['BLIS_NUM_THREADS'] = str(threads) + C = A @ B + assert C.shape == (n, n), f"Threaded matrix multiply with {threads} threads failed" + + def tearDown(self): + os.environ['BLIS_NUM_THREADS'] = self.orig_threads + super().tearDown(self.PARAM_DIC) \ No newline at end of file -- Gitee