# source-code-migration **Repository Path**: liu_muzhou/sptensor ## Basic Information - **Project Name**: source-code-migration - **Description**: source-code-migration - **Primary Language**: C++ - **License**: MIT - **Default Branch**: scm-branch - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 198 - **Forks**: 139 - **Created**: 2026-02-04 - **Last Updated**: 2026-06-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 海光 DCU 算法库迁移工具 本软件为国家重点研发计划课题(课题名称:面向异构处理器的高性能算法库,课题编号:2025YFB3003703,课题经费:1000万元)的探索型阶段试验成果之一,研究目标是基于国产海光 DCU 的目标架构,尝试把其它成熟算法库中的 CPU/CUDA/RISC-V 算子逐步迁移到国产 HIP/DCU 生态中。 当前仓库的主线 pipeline 是 `c2hip`:它以 C 源码算子为输入,并进一步完成源码解析、多面体依赖分析、调度生成和 HIP 代码打印,并针对国产海光 DCU 平台进行优化。 `cuda2hip` 与 `riscv2hip` 是另外两条尝试将 CUDA 算子和 RISC-V 算子向国产海光 DCU 进行代码迁移的 pipeline,用于补充 CUDA API 名称重写和 RISC-V 指令到 HIP C++ 片段的预览验证,目前仍处于开发状态。 ## 目录结构 ```text sptensor/ ├── README.md ├── run.sh # 推荐的 c2hip 一键构建入口 ├── c2hip/ # 主线:C SCoP -> HIP ├── c2hip_exe -> c2hip/c2hip ├── cuda2hip/ # 子逻辑:CUDA -> HIP 轻量重写预览 ├── riscv2hip/ # 子逻辑:RISC-V -> HIP C++ 预览转换 └── SourceCodeMigration/ # 算子源码提取与迁移实验 ``` ## 主线:c2hip `c2hip` 适合处理满足静态控制区域约束的 C 代码,会围绕该区域生成 HIP 接口文件、核函数文件、头文件。 一个最小输入形态如下: ```c void saxpy(int n, float a, float *x, float *y) { for (int i = 0; i < n; ++i) y[i] = a * x[i] + y[i]; } ``` ### 构建 在仓库根目录执行: ```bash ./run.sh ``` 脚本会完成: ```text 初始化 c2hip/isl 和 c2hip/pet 递归子模块 执行 c2hip/autogen.sh 执行 autoreconf -i 按 GMP_PREFIX 配置 configure 执行 make 创建根目录快捷入口 c2hip_exe -> c2hip/c2hip ``` 默认配置为: ```text GMP_PREFIX=/public/software/compiler/gcc-11.4.0/gmp JOBS=8 ``` 如果本机 GMP 路径或并行编译数不同,可以覆盖环境变量: ```bash GMP_PREFIX=/path/to/gmp JOBS=16 ./run.sh ``` 构建完成后,常用入口是: ```bash ./c2hip_exe --version ``` 也可以直接使用: ```bash ./c2hip/c2hip --version ``` ### 使用 生成 HIP 代码: ```bash ./c2hip_exe --target=hip path/to/input.c ``` 对于普通输入文件,例如 `input.c`,默认会在输入文件同级目录生成: ```text hip_input_interface.cpp hip_input_kernel.cpp hip_input_kernel.h ``` 生成代码后仍需要放到目标工程中编译,并结合 HIP/DCU 环境做正确性与性能验证。 查看完整选项: ```bash ./c2hip_exe --help ``` ## 子逻辑:cuda2hip `cuda2hip` 是一个轻量级 CUDA 到 HIP 名称重写预览器。它适合快速验证 CUDA Runtime API、类型名、错误码等标识符映射规则,例如 `cudaMalloc -> hipMalloc`、`cudaMemcpy -> hipMemcpy`、`cudaStream_t -> hipStream_t`。 它不是完整 CUDA C++ 迁移器:当前不会做语义级 kernel launch 重写、工程依赖分析或复杂 C++ AST 变换。需要完整源码迁移时,仍应以 `c2hip` 和工程级人工整理为主。 构建: ```bash make -C cuda2hip ``` 自测: ```bash ./cuda2hip/cuda2hip --self-test ``` 预览一段代码: ```bash ./cuda2hip/cuda2hip '__global__ void k(){ cudaDeviceSynchronize(); }' ``` 如果要处理文件内容,可先用 shell 把文件内容传入参数: ```bash ./cuda2hip/cuda2hip "$(cat sample.cu)" > sample.hip.cpp ``` ## 子逻辑:riscv2hip `riscv2hip` 是一个 RISC-V 指令到 HIP C++ 的预览转换器。它会解析简单 RISC-V 汇编/向量风格样例,降低为带注释的 HIP kernel 片段,并输出诊断信息。这个模块更适合规则实验和转换链路验证,不应被理解为完整 RISC-V 二进制或汇编工程迁移器。 构建: ```bash make -C riscv2hip ``` 自测: ```bash ./riscv2hip/riscv2hip --self-test ``` 转换样例文件: ```bash ./riscv2hip/riscv2hip riscv2hip/samples/vector_add_riscv.s > vector_add_riscv.hip.cpp ``` 也可以从标准输入读取: ```bash cat riscv2hip/samples/vector_add_riscv.s | ./riscv2hip/riscv2hip > out.hip.cpp ``` ## SourceCodeMigration `SourceCodeMigration/` 保存工程源码提取和迁移实验材料,主要用于辅助真实算子进入 `c2hip` 主流程。 当前重点包括: - `extractor_openblas.py`:从 OpenBLAS 构建记录中恢复真实编译命令,并按算子粒度提取接口、kernel 和依赖代码。 - `for_openDNN/`:openDNN 算子迁移相关实验,包括接口函数、CUDA kernel launch、`__global__` kernel 和 helper 代码分析。 - `offline_c/`、`offline_cpp/`:离线迁移计划、审计和报告相关的辅助代码。 ## 依赖 构建 `c2hip` 通常需要: ```text autoconf automake libtool pkg-config gcc/g++ GMP LLVM/clang OpenCL headers and library libyaml ``` `cuda2hip` 只需要 C99 编译器;`riscv2hip` 需要 C++17 编译器。