| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 | ||
| 3 个月前 |
TileXR UDMA 测试指南
本文档提供 TileXR UDMA 功能的完整测试指南,包括单元测试和集成测试。
📋 目录
测试概述
测试目标
验证 TileXR 的 UDMA 集成功能,包括:
- shmem API (
aclshmemx_get_udma_info) 的正确性 - TileXR 初始化流程中的 UDMA 集成
- 多进程/多卡环境下的 UDMA 功能
- 内存管理和资源清理
测试层次
┌─────────────────────────────────────┐
│ 集成测试 (test_tilexr_udma) │
│ - TileXR 完整初始化流程 │
│ - 多 rank 协调 │
│ - 共享内存缓冲区 │
│ - 压力测试 │
└─────────────────────────────────────┘
↓ 依赖
┌─────────────────────────────────────┐
│ 单元测试 (test_shmem_api) │
│ - API 参数验证 │
│ - 初始化状态检查 │
│ - UDMA 信息获取 │
│ - 多次调用一致性 │
└─────────────────────────────────────┘
↓ 依赖
┌─────────────────────────────────────┐
│ shmem 库 (libshmem.so) │
│ - aclshmemx_get_udma_info() API │
└─────────────────────────────────────┘
测试文件
tests/udma/
├── CMakeLists.txt # 构建配置
├── build.sh # 构建脚本
├── run_tests.sh # 测试运行脚本
├── README.md # 本文档
├── unit/
│ └── test_shmem_api.cpp # shmem API 单元测试
└── integration/
└── test_tilexr_udma.cpp # TileXR 集成测试
环境准备
硬件要求
- 最低配置: 1 张昇腾 NPU (910B/910A5/310P3)
- 推荐配置: 2 张或更多昇腾 NPU(用于多卡测试)
软件要求
- 操作系统: Ubuntu 20.04 LTS
- CANN: 9.1.0 或更高版本
- 驱动: NPU driver ≥ 25.5.0
- 编译器: GCC 13.3.0 或兼容版本
- CMake: 3.16 或更高版本
- MPI: MPICH 或 OpenMPI(可选,用于多进程测试)
检查环境
# 检查 NPU 驱动
npu-smi info
# 检查 NPU 数量
lspci -n -D | grep -o '19e5:d[0-9a-f]\{3\}' | wc -l
# 检查 CANN 版本
cat ${ASCEND_HOME_PATH}/version.info
# 检查 MPI(可选)
which mpirun
mpirun --version
构建依赖
确保以下库已构建:
-
shmem 库 (tilexr-udma-integration 分支)
cd /home/TileXR/3rdparty/shmem git checkout tilexr-udma-integration bash scripts/build.sh -soc_type Ascend950 # 输出: install/shmem/lib/libshmem.so -
TileXR 库 (feature/udma-integration 分支)
cd /home/TileXR git checkout feature/udma-integration source common_env.sh mkdir -p build && cd build cmake -DCMAKE_INSTALL_PREFIX=../install .. make -j$(nproc) && make install # 输出: install/lib/libtile-comm.so
构建测试
快速构建
cd /home/TileXR/tests/udma
bash build.sh
手动构建
cd /home/TileXR/tests/udma
# 加载环境
source ../../common_env.sh
# 创建构建目录
mkdir -p build && cd build
# 配置
cmake -DCMAKE_INSTALL_PREFIX=../install ..
# 构建
make -j$(nproc)
# 安装
make install
验证构建
ls -lh install/bin/
# 应该看到:
# test_shmem_api
# test_tilexr_udma
# 检查依赖
ldd install/bin/test_shmem_api
ldd install/bin/test_tilexr_udma
运行测试
快速运行(推荐)
cd /home/TileXR/tests/udma
bash run_tests.sh
这个脚本会自动运行所有测试并输出结果。
手动运行
1. 设置环境变量
cd /home/TileXR/tests/udma
source ../../common_env.sh
# 添加库路径
export LD_LIBRARY_PATH=/home/TileXR/3rdparty/shmem/install/shmem/lib:${LD_LIBRARY_PATH}
export LD_LIBRARY_PATH=/home/TileXR/install/lib:${LD_LIBRARY_PATH}
2. 运行单元测试
# shmem API 单元测试(单进程)
./install/bin/test_shmem_api
预期输出:
========================================
shmem UDMA API Unit Tests
========================================
=== Test Case: API Parameter Validation ===
[PASS] Should return INVALID_PARAM when udma_info_ptr is NULL
[PASS] Should return INVALID_PARAM when udma_info_size is NULL
[PASS] Should return INVALID_PARAM when both parameters are NULL
=== Test Case: Uninitialized State ===
[PASS] Should return INNER_ERROR when shmem not initialized
=== Test Case: Full Initialization Flow ===
[PASS] aclrtSetDevice should succeed
[PASS] aclshmemx_get_uniqueid should succeed
[PASS] aclshmemx_set_attr_uniqueid_args should succeed
[PASS] aclshmemx_init_attr should succeed
[PASS] aclshmemx_get_udma_info should succeed
[PASS] UDMA info pointer should not be NULL
[PASS] UDMA info size should be greater than 0
UDMA Info Pointer: 0x7f8a40000000
UDMA Info Size: 12345 bytes
[PASS] UDMA info should be in device memory
Memory Type: 1 (0=HOST, 1=DEVICE)
[PASS] aclshmem_finalize should succeed
=== Test Case: Multiple Calls Consistency ===
[PASS] All calls should succeed
[PASS] All calls should return the same pointer
[PASS] All calls should return the same size
Pointer consistency: 0x7f8a40000000 == 0x7f8a40000000 == 0x7f8a40000000
Size consistency: 12345 == 12345 == 12345
========================================
Test Summary
========================================
Total: 16
Passed: 16
Failed: 0
========================================
3. 运行集成测试(单进程)
# TileXR 集成测试(单卡)
export RANK=0
export RANK_SIZE=1
./install/bin/test_tilexr_udma
预期输出:
========================================
TileXR UDMA Integration Tests
========================================
Environment:
RANK: 0
RANK_SIZE: 1
PID: 12345
Using device: 0
=== Test Case: TileXR Basic Initialization ===
Rank: 0/1
[PASS] TileXRInit should succeed
[PASS] TileXRSync should succeed
=== Test Case: UDMA Initialization ===
[PASS] TileXRInit should succeed
[PASS] CommArgs pointer should not be NULL
CommArgs pointer: 0x7f8a50000000
=== Test Case: Multi-Rank Initialization ===
[SKIP] This test requires at least 2 ranks
=== Test Case: Shared Memory Buffers ===
[PASS] TileXRInit should succeed
[PASS] Send buffer should not be NULL
Send buffer: 0x7f8a60000000
[PASS] Recv buffer should not be NULL
Recv buffer: 0x7f8a70000000
[PASS] Send and recv buffers should be different
=== Test Case: Stress Test - Multiple Init/Finalize ===
Iteration 1/5
Iteration 2/5
Iteration 3/5
Iteration 4/5
Iteration 5/5
[PASS] All iterations should succeed (5/5)
========================================
Test Summary (Rank 0)
========================================
Total: 10
Passed: 10
Failed: 0
========================================
4. 运行多进程测试(需要 MPI)
# 2 进程测试
mpirun -n 2 ./install/bin/test_tilexr_udma
# 4 进程测试(如果有 4 张卡)
mpirun -n 4 ./install/bin/test_tilexr_udma
# 8 进程测试(如果有 8 张卡)
mpirun -n 8 ./install/bin/test_tilexr_udma
预期输出 (2 进程):
========================================
TileXR UDMA Integration Tests
========================================
Environment:
RANK: 0
RANK_SIZE: 2
PID: 12345
Using device: 0
[... Rank 0 测试输出 ...]
========================================
TileXR UDMA Integration Tests
========================================
Environment:
RANK: 1
RANK_SIZE: 2
PID: 12346
Using device: 1
[... Rank 1 测试输出 ...]
=== Test Case: Multi-Rank Initialization ===
Rank 0/2 starting...
Rank 1/2 starting...
[PASS] TileXRInit should succeed on rank 0
[PASS] TileXRInit should succeed on rank 1
[PASS] First sync should succeed on rank 0
Rank 0 passed first sync
[PASS] First sync should succeed on rank 1
Rank 1 passed first sync
[PASS] Second sync should succeed on rank 0
Rank 0 passed second sync
[PASS] Second sync should succeed on rank 1
Rank 1 passed second sync
Rank 0 finalized
Rank 1 finalized
测试说明
单元测试 (test_shmem_api)
Test 1: API Parameter Validation
目的: 验证 API 参数检查
测试点:
- NULL 指针参数应返回
ACLSHMEM_INVALID_PARAM - 验证所有参数组合
Test 2: Uninitialized State
目的: 验证未初始化状态处理
测试点:
- 在 shmem 初始化前调用 API 应返回
ACLSHMEM_INNER_ERROR
Test 3: Full Initialization Flow
目的: 验证完整的初始化流程
测试点:
- ACL 设备设置
- shmem unique ID 获取
- shmem 属性配置
- UDMA 引擎启用
- shmem 初始化
- UDMA 信息获取
- 设备内存验证
- 资源清理
Test 4: Multiple Calls Consistency
目的: 验证多次调用的一致性
测试点:
- 多次调用返回相同的指针
- 多次调用返回相同的大小
- 验证幂等性
集成测试 (test_tilexr_udma)
Test 1: TileXR Basic Initialization
目的: 验证 TileXR 基本初始化
测试点:
TileXRInit()成功TileXRSync()成功- 资源正确清理
Test 2: UDMA Initialization
目的: 验证 UDMA 集成
测试点:
- CommArgs 指针有效
- UDMA 信息已设置(需要进一步验证)
Test 3: Multi-Rank Initialization
目的: 验证多进程协调
测试点:
- 所有 rank 成功初始化
- 同步点正常工作
- 进程间协调正确
Test 4: Shared Memory Buffers
目的: 验证共享内存缓冲区
测试点:
- 发送缓冲区有效
- 接收缓冲区有效
- 缓冲区地址不同
Test 5: Stress Test
目的: 压力测试
测试点:
- 多次初始化/清理循环
- 资源泄漏检测
- 稳定性验证
故障排查
常见问题
1. 找不到 libshmem.so
错误:
error while loading shared libraries: libshmem.so: cannot open shared object file
解决方案:
export LD_LIBRARY_PATH=/home/TileXR/3rdparty/shmem/install/shmem/lib:${LD_LIBRARY_PATH}
2. 找不到 libtile-comm.so
错误:
error while loading shared libraries: libtile-comm.so: cannot open shared object file
解决方案:
export LD_LIBRARY_PATH=/home/TileXR/install/lib:${LD_LIBRARY_PATH}
3. aclshmemx_get_udma_info 返回 INNER_ERROR
可能原因:
- shmem 未正确初始化
- UDMA 未启用(需要设置
data_op_engine_type = ACLSHMEM_DATA_OP_UDMA) - 硬件不支持 UDMA(需要 Ascend 950+)
- shmem 构建时未启用 UDMA 支持
调试步骤:
# 1. 检查 shmem 构建配置
cd /home/TileXR/3rdparty/shmem
cat build/CMakeCache.txt | grep UDMA
# 2. 检查 shmem 初始化状态
# 在测试代码中添加:
int status = aclshmemx_init_status();
printf("shmem init status: %d\n", status);
# 3. 检查硬件支持
npu-smi info | grep "Chip Name"
4. 多进程测试失败
可能原因:
- MPI 环境配置问题
- 设备绑定冲突
- 进程间通信失败
调试步骤:
# 1. 测试 MPI 基本功能
mpirun -n 2 hostname
# 2. 检查设备可见性
mpirun -n 2 npu-smi info
# 3. 使用详细日志
export ASCEND_GLOBAL_LOG_LEVEL=0
mpirun -n 2 ./install/bin/test_tilexr_udma
5. 设备内存不足
错误:
aclrtMalloc failed: 500002
解决方案:
# 1. 检查设备内存使用
npu-smi info
# 2. 清理其他进程
pkill -9 test_
# 3. 重置设备
npu-smi -i 0 -r
日志分析
启用详细日志
# 设置日志级别(0=DEBUG, 1=INFO, 2=WARNING, 3=ERROR)
export ASCEND_GLOBAL_LOG_LEVEL=0
# 设置日志路径
export ASCEND_PROCESS_LOG_PATH=/home/TileXR/run/plog/$(date +%y%m%d%H%M)
# 运行测试
./install/bin/test_shmem_api
查看日志
# 查看最新日志
ls -lt /home/TileXR/run/plog/ | head -5
# 搜索错误
grep -r "ERROR" /home/TileXR/run/plog/$(date +%y%m%d%H%M)/
# 搜索 UDMA 相关日志
grep -r "UDMA\|udma" /home/TileXR/run/plog/$(date +%y%m%d%H%M)/
预期结果
成功标准
单元测试
- ✅ 所有测试用例通过 (16/16)
- ✅ UDMA 信息指针非空
- ✅ UDMA 信息大小 > 0
- ✅ 指针指向设备内存
- ✅ 多次调用返回一致结果
集成测试(单进程)
- ✅ 所有测试用例通过 (10/10)
- ✅ TileXR 初始化成功
- ✅ CommArgs 指针有效
- ✅ 共享内存缓冲区有效
- ✅ 压力测试全部通过
集成测试(多进程)
- ✅ 所有 rank 测试通过
- ✅ 进程间同步正常
- ✅ 无死锁或超时
- ✅ 资源正确清理
性能指标
虽然这些测试主要关注功能正确性,但也可以观察以下性能指标:
- 初始化时间: < 1 秒
- 同步延迟: < 100 毫秒
- 内存占用: 每个 rank 约 200 MB
- 多次初始化: 无明显性能下降
下一步
测试通过后,可以进行:
- 性能基准测试: 对比 UDMA vs MTE vs RDMA 的性能
- 通信功能测试: 测试实际的点对点和集合通信
- DeepEP 集成: 基于 TileXR 实现 DeepEP 昇腾版本
- 长时间稳定性测试: 运行数小时验证稳定性
附录
测试环境信息收集
运行测试前,建议收集以下信息:
#!/bin/bash
echo "=== System Information ==="
uname -a
cat /etc/os-release | grep PRETTY_NAME
echo -e "\n=== NPU Information ==="
npu-smi info
echo -e "\n=== CANN Version ==="
cat ${ASCEND_HOME_PATH}/version.info
echo -e "\n=== Driver Version ==="
cat /usr/local/Ascend/driver/version.info
echo -e "\n=== Library Versions ==="
ls -lh /home/TileXR/3rdparty/shmem/install/shmem/lib/libshmem.so
ls -lh /home/TileXR/install/lib/libtile-comm.so
echo -e "\n=== Environment Variables ==="
env | grep -E "ASCEND|TILEXR|LD_LIBRARY_PATH"
保存输出以便问题排查。
文档版本: 1.0
最后更新: 2026-05-25
维护者: TileXR Team