# source-code-migration **Repository Path**: zcy27/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**: 0 - **Forks**: 139 - **Created**: 2026-05-26 - **Last Updated**: 2026-05-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Source Code Migration 本仓库围绕“有源码算子迁移”场景展开,目标是把已有 CPU/CUDA 风格算子源码拆解、整理并迁移到面向 HIP/DCU 的代码形态。当前主要工作集中在 `SourceCodeMigration` 目录中,包括源码分析、算子提取、接口与 kernel 拆分、依赖裁剪、以及 HIP 代码生成链路整理。 ## 目录概览 ```text sptensor/ ├── SourceCodeMigration/ # 有源码算子迁移工具与实验代码 ├── BinaryOpMigration/ # 无源码二进制算子迁移相关内容 └── DomainLib/ # 领域算法库与部署相关内容 ``` 本项目的重点工作为 `SourceCodeMigration/`。 ## SourceCodeMigration `SourceCodeMigration` 用于处理“可以拿到原始源码”的算子迁移任务。核心思路是先从原始工程中恢复真实编译上下文,再按算子粒度抽取接口函数、kernel 函数和必要依赖,最后形成更适合后续 HIP/DCU 改写、编译和测试的代码包。 ### OpenBLAS 算子提取 相关文件: ```text SourceCodeMigration/ ├── extractor_openblas.py ├── openblas算子提取脚本.md └── @openblas/ops_extracted/ # 脚本运行后的默认产物目录 ``` `extractor_openblas.py` 用于从 OpenBLAS 源码中按算子提取接口代码和 kernel 代码。脚本会根据 OpenBLAS 的真实构建日志 `makelog.txt` 解析编译命令,尽量复用原始 `-I`、`-D`、编译器参数和源码路径,避免手写宏或手工猜测 include 关系。 当前默认关注的算子包括: ```text axpy axpby copy rot ``` 典型输出结构如下: ```text SourceCodeMigration/@openblas/ops_extracted/ ├── makelog.txt ├── saxpy/ │ ├── metadata.json │ ├── interface/ │ │ ├── i.c │ │ ├── i_deps.h │ │ └── interface_spec.json │ └── kernel/ │ ├── k.c │ ├── k_deps.h │ └── helpers/ │ └── k_helpers.c ├── saxpby/ ├── scopy/ └── srot/ ``` 主要产物含义: - `metadata.json`:记录算子名称、源码位置、编译命令、预处理命令、依赖解析结果等元信息。 - `interface/i.c`:提取出的原始接口侧函数主体。 - `interface/i_deps.h`:接口侧需要的类型、声明、宏和系统头文件。 - `kernel/k.c`:提取出的 kernel 侧核心函数。 - `kernel/k_deps.h`:kernel 侧必要依赖声明。 - `kernel/helpers/k_helpers.c`:kernel 闭包中需要补齐的 helper 实现。 运行示例: ```bash python3 SourceCodeMigration/extractor_openblas.py all ``` ### openDNN 迁移实验 相关目录: ```text SourceCodeMigration/for_openDNN/ ├── extract.py ├── extract_from_opendnn_raw_test.sh ├── csparse.sh ├── openDNN/ ├── openDNN-mig/ ├── openDNN_extract_tool_and_benchmark/ └── Ops/ ``` `for_openDNN` 目录用于 openDNN 算子迁移实验,主要处理 CUDA 工程中的接口函数、kernel launch、`__global__` kernel 以及相关 helper 代码。 其中 `extract.py` 的核心流程包括: - 从构建日志中定位真实 `nvcc` 编译命令。 - 解析 include 路径、宏定义和编译参数。 - 使用 libclang 分析源码 AST。 - 按算子抽取接口侧代码。 - 识别 kernel launch 并抽取对应 kernel。 - 生成可单独编译和验证的迁移代码片段。 当前目录中保留了若干迁移产物和测试样例,例如: ```text openDNN/opendnnAddTensor/ openDNN/opendnnConvolutionForward/ openDNN/opendnnInnerProductForward/ openDNN-mig/ Ops/LayerNorm/ ``` 这些内容用于验证从原始算子源码到独立 kernel 文件、接口文件和测试用例的拆分流程。 ### HIP 代码生成链路 相关目录: ```text SourceCodeMigration/c2hip-myself/ ├── c2hip.c ├── c2hip_options.c ├── for_hip/ │ ├── hip.c │ └── hip.h ├── gpu.c ├── gpu_print.c ├── gpu_tree.c ├── schedule.c ├── isl/ └── pet/ ``` `c2hip-myself` 目录用于整理 `c2hip --target=hip` 相关的源到源代码生成路径。当前重点是保留 HIP 后端和通用 GPU 代码生成逻辑,围绕静态控制循环区域、调度、分块、线程映射和 host/kernel 代码打印进行分析和裁剪。 主要模块分工: - `c2hip.c`:命令行入口、参数解析和 HIP 生成入口调度。 - `c2hip_options.c/h`:代码生成选项和默认目标配置。 - `for_hip/hip.c`:HIP host/kernel 文件生成逻辑。 - `gpu.c`、`gpu_print.c`、`gpu_tree.c`:GPU 程序表示、AST 生成和代码打印。 - `schedule.c`、`grouping.c`、`hybrid.c`:调度、语句分组和混合 tiling 相关逻辑。 - `isl/`、`pet/`:多面体分析、源码解析和调度依赖分析所需的基础组件。 该目录的目标是形成一条更聚焦的 HIP 生成链路,用于后续把可分析的 C 源码片段转换成适合 HIP/DCU 编译运行的代码。 ## 推荐工作流 1. 准备原始算子源码工程,并确保能够生成完整构建日志。 2. 使用提取脚本解析真实编译命令和源码路径。 3. 按算子生成接口、kernel、helper 和 metadata。 4. 检查提取结果中的 unresolved 信息。 5. 对 kernel 代码进行 HIP/DCU 适配。 6. 编写或复用测试用例,验证迁移后结果的正确性。 ## 当前关注点 - OpenBLAS BLAS1 算子提取流程稳定化。 - openDNN 算子接口与 kernel 拆分流程整理。 - `c2hip --target=hip` 代码生成路径裁剪。 - 生成产物的 metadata 规范化。 - 后续面向 HIP/DCU 的编译、链接和测试流程补齐。