测试环境与运行

CPU 仿真测试

适用范围

CPU 仿真支持以下同步通信指令的功能验证: - TPUT、TGET(P2P 传输) - TNOTIFY、TWAIT、TTEST(信号同步) - TGATHER、TSCATTER、TBROADCAST、TREDUCE(集合通信)

不支持:异步指令(TPUT_ASYNC/TGET_ASYNC)在 CPU 仿真下直接返回空 event。

运行方式

python3 tests/run_cpu.py --testcase <testcase_name> --gtest_filter '<filter>'

# 示例
python3 tests/run_cpu.py --testcase tgather --gtest_filter 'TGatherTest.*'

CPU 仿真局限性

特性 CPU 仿真 NPU 硬件
功能正确性 验证数据计算逻辑 验证完整执行
远端地址 模拟为本地指针 真实硬件远端 DMA
信号同步 模拟 AtomicAdd/Set 硬件原子操作
pipe_barrier 忽略 真实流水线同步
多 rank 单进程模拟 MPI + 多 NPU
异步 DMA 返回无效 event SDMA/URMA 引擎

建议:CPU 仿真验证数据流和逻辑正确性,但最终必须在 NPU 硬件上验证同步和性能。


NPU 硬件测试

单指令 ST 测试

python3 tests/script/run_st.py -r npu -v a3 -t tput -g TPutTest.*

# 运行所有通信 ST
python3 tests/script/run_st.py -r npu -v a3 --comm

算子级测试

cd kernels/manual/a2a3/my_operator
mkdir -p build && cd build
cmake .. -DSOC_VERSION=Ascend910C -DRUN_MODE=npu
make -j

# 运行(8 rank)
mpirun -np 8 ./my_operator

测试 Kernel 结构

template <typename T, int Rows, int Cols>
__global__ AICORE void TPutTestKernel(__gm__ T *local_data, __gm__ T *remote_addr)
{
    using ShapeDyn = Shape<DYNAMIC, DYNAMIC, DYNAMIC, DYNAMIC, DYNAMIC>;
    using StrideDyn = Stride<DYNAMIC, DYNAMIC, DYNAMIC, DYNAMIC, DYNAMIC>;
    using Global = GlobalTensor<T, ShapeDyn, StrideDyn, Layout::ND>;
    using TileT = Tile<TileType::Vec, T, Rows, Cols, BLayout::RowMajor, -1, -1>;

    ShapeDyn shape(1, 1, 1, Rows, Cols);
    StrideDyn stride(Rows * Cols, Rows * Cols, Rows * Cols, Cols, 1);

    Global srcG(local_data, shape, stride);
    Global dstG(remote_addr, shape, stride);

    TileT stagingTile(Rows, Cols);
    TASSIGN(stagingTile, 0x0);

    comm::TPUT(dstG, srcG, stagingTile);
}

多 Rank 测试框架

MPI Wrapper

使用动态加载避免硬依赖:

class MpiWrapper {
    void *handle_;
    int (*MPI_Init_)(int*, char***);
    int (*MPI_Comm_rank_)(MPI_Comm, int*);
public:
    MpiWrapper() {
        handle_ = dlopen("libmpi.so", RTLD_LAZY);
        MPI_Init_ = (decltype(MPI_Init_))dlsym(handle_, "MPI_Init");
    }
};

测试运行脚本模板

#!/bin/bash
set -e

source /usr/local/Ascend/ascend-toolkit/latest/set_env.sh

mkdir -p build && cd build
cmake .. -DSOC_VERSION=${SOC_VERSION:-Ascend910C} -DRUN_MODE=npu
make -j$(nproc)
cd ..

NRANKS=${NRANKS:-8}
export HCCL_BUFFSIZE=1024

mpirun -np $NRANKS \
    --allow-run-as-root \
    -x LD_LIBRARY_PATH \
    -x ASCEND_HOME_PATH \
    ./build/my_operator "$@"

Rank 0 收集结果

if (rank == 0) {
    bool pass = VerifyResult(actual, golden, count);
    int result = pass ? 0 : 1;
    MPI_Bcast(&result, 1, MPI_INT, 0, MPI_COMM_WORLD);
    printf("Overall: %s\n", pass ? "PASS" : "FAIL");
} else {
    int result;
    MPI_Bcast(&result, 1, MPI_INT, 0, MPI_COMM_WORLD);
}