[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-79243":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":15,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":16,"rankGlobal":8,"rankLanguage":8,"license":17,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":20,"hasPages":18,"topics":21,"createdAt":8,"pushedAt":8,"updatedAt":22,"readmeContent":23,"aiSummary":24,"trendingCount":14,"starSnapshotCount":14,"syncStatus":25,"lastSyncTime":26,"discoverSource":27},79243,"AscendFHE","BJTUpupil\u002FAscendFHE","BJTUpupil",null,"C++",231,10,5,6,0,94,3.12,"GNU General Public License v2.0",false,"main",true,[],"2026-06-12 02:03:50","# AscendFHE：面向 Atlas A2 \u002F Ascend 910B 的 FHE 底层算子库与硬件加速方案\n\nAscendFHE 是面向同态加密计算的 Ascend NPU 硬件加速底层算子库，当前公开支持\nAtlas A2 \u002F Ascend 910B，SOC 配置为 `ascend910b`。仓库提供 FHE 常用模运算、RNS\n基转换、内积累加、自同构重排和 NTT 等算子的 Ascend C kernel、host tiling 逻辑、\n算子构建片段和 `torch_npu` 调用说明。\n\n安装并注册 AscendFHE 算子包后，这些算子通过 `torch.ops.ascend_npu_fhe.*` 暴露给\nPyTorch \u002F `torch_npu`；未安装或未注册算子包的环境只能进行源码审查、环境检查和 Notebook\n入口验证。\n\n## 当前可用状态\n\n| 能力 | 状态 | 说明 |\n| --- | --- | --- |\n| Ascend C kernel | 已提供 | 位于各 `kernels\u002F\u003Coperator>\u002Fop_kernel\u002F`。 |\n| host shape\u002Ftiling | 已提供 | 位于各 `kernels\u002F\u003Coperator>\u002Fop_host\u002F`。 |\n| 算子级 README | 已提供 | 每个算子目录都有独立接口、入口和验证说明。 |\n| Notebook 入口 | 已提供 | `notebooks\u002Fascend_npu_fhe_quickstart.ipynb` 用于目标 NPU 环境中的交互检查。 |\n| 支持设备 | 已标定 | Atlas A2 \u002F Ascend 910B，SOC 为 `ascend910b`。 |\n| `torch.ops.ascend_npu_fhe.*` API | 安装注册后支持 | 安装并注册 AscendFHE 算子包后可通过 `torch_npu` 调用。 |\n| 顶层 `CMakeLists.txt` | 未提供 | 当前不能从仓库根目录直接构建完整扩展。 |\n\n现在可以审查源码、准备 CANN 环境、使用 Notebook 做环境或注册检查；不能直接从根目录构建完整\n扩展，也不能在未安装注册 AscendFHE 算子包的环境中直接调用 `torch.ops.ascend_npu_fhe.*`。\n\n## Quick Start\n\n这条任务流用于最快完成“拿到源码 -> 确认内容 -> 准备环境 -> 打开交互入口”。真实算子执行\n依赖目标 NPU 环境中已经安装并注册 AscendFHE 算子包。\n\n1. 获取源码并查看算子：\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002FBJTUpupil\u002FAscendFHE.git\ncd AscendFHE\n```\n\n2. 确认当前仓库内容：\n\n```bash\nls\nrg --files kernels\nrg --files doc notebooks\n```\n\n应能看到 `kernels\u002F`、`doc\u002F` 和 `notebooks\u002F`。其中 `kernels\u002F` 存放算子源码，`doc\u002F` 存放公开文档，\n`notebooks\u002F` 存放交互检查入口。\n\n3. 准备 CANN 8.5.0 \u002F Atlas A2 \u002F Ascend 910B 环境：\n\n```bash\nconda create -n ascend-fhe python=3.10 -y\nconda activate ascend-fhe\nconda install ascend::cann-toolkit==8.5.0 -y\nconda install ascend::cann-910b-ops==8.5.0 -y\nsource \"${CONDA_PREFIX}\u002FAscend\u002Fascend-toolkit\u002Fset_env.sh\"\nexport ASCEND_HOME_PATH=\"${CONDA_PREFIX}\u002FAscend\u002Fascend-toolkit\"\n```\n\n驱动、固件、PyTorch 和 `torch_npu` 需要按目标 Atlas A2 \u002F Ascend 910B 机器的实际版本安装。\n完整安装路径见 [CANN 8.5.0 环境安装方法](doc\u002Fenvironment_install.md)。\n\n4. 验证 NPU 运行环境：\n\n```bash\necho \"${ASCEND_HOME_PATH}\"\nnpu-smi info\npython -c \"import torch, torch_npu; print(torch.npu.is_available())\"\n```\n\n期望结果是 `ASCEND_HOME_PATH` 指向实际 CANN Toolkit 目录，`npu-smi info` 能识别设备，\nPython 命令输出 `True`。\n\n5. 打开交互 Notebook：\n\n```bash\njupyter notebook notebooks\u002Fascend_npu_fhe_quickstart.ipynb\n```\n\nNotebook 提交版本默认不执行安装、环境检查或算子调用。进入目标 NPU 环境后，可先启用环境检查：\n\n```python\nRUN_INSTALL = False\nRUN_ENV_CHECK = True\nRUN_OP_TESTS = False\n```\n\n6. 仅在完成算子包安装和注册后启用算子测试：\n\n```python\nRUN_OP_TESTS = True\n```\n\n`RUN_OP_TESTS=True` 只适用于已经完成 AscendFHE 算子包安装和 `torch.ops.ascend_npu_fhe.*`\n注册的环境。当前仓库最快可完成的是环境检查和接口入口验证；真正的 NPU 算子执行依赖目标环境中的\n算子包安装与注册。\n\n## 文档入口\n\n公开文档位于 `doc\u002F`：\n\n- [文档组织方式](doc\u002FREADME.md)\n- [CANN 8.5.0 环境安装方法](doc\u002Fenvironment_install.md)\n- [第三方引用与可执行交互说明](doc\u002Fthird_party_or_interactive.md)\n- [Notebook 一键安装、执行与测试脚本](notebooks\u002Fascend_npu_fhe_quickstart.ipynb)\n\n`docs\u002F` 是本地忽略目录，不作为公开文档入口。\n\n## 独立功能卡片\n\n每个算子当前提供 Ascend C kernel、host tiling 逻辑和算子级 README。安装并注册 AscendFHE\n算子包后，表中的调用形式即为公开 `torch_npu` API。\n\n| 独立功能 | 目录 | 功能定位 | torch_npu 调用形式 | 输入输出 | 独立性证明 | 详情文档 |\n| --- | --- | --- | --- | --- | --- | --- |\n| `AddMod` | `kernels\u002Fadd_mod` | 逐元素模加 | `torch.ops.ascend_npu_fhe.add_mod(a, b, q)` | 输入 `a,b,q:int32`；输出 `y:int32` | 执行 `(a + b) mod q`，与减法、乘法和变换类算子分离 | [add_mod](kernels\u002Fadd_mod\u002FREADME.md) |\n| `SubMod` | `kernels\u002Fsub_mod` | 逐元素模减 | `torch.ops.ascend_npu_fhe.sub_mod(a, b, q)` | 输入 `a,b,q:int32`；输出 `y:int32` | 执行 `(a - b) mod q`，与模加和模乘路径分离 | [sub_mod](kernels\u002Fsub_mod\u002FREADME.md) |\n| `MulModShoup` | `kernels\u002Fmul_mod_shoup` | Shoup 预计算模乘 | `torch.ops.ascend_npu_fhe.mul_mod_shoup(a, W, Wprime, q)` | 输入 `a:int32` 和 3 个整数属性；输出 `y:int32` | 使用 Shoup 常量完成单输入逐元素乘法，与双输入 Montgomery 乘法分离 | [mul_mod_shoup](kernels\u002Fmul_mod_shoup\u002FREADME.md) |\n| `MontgomeryMul` | `kernels\u002Fmontgomery_mul` | Montgomery 约减模乘 | `torch.ops.ascend_npu_fhe.montgomery_mul(x, y, q_mu, q)` | 输入 `x,y,q_mu,q:int32`；输出 `z:int32` | 基于 `q_mu` 完成双输入 Montgomery 乘法，与 Shoup 常量乘法分离 | [montgomery_mul](kernels\u002Fmontgomery_mul\u002FREADME.md) |\n| `BConv` | `kernels\u002Fbconv` | RNS 基转换 | `torch.ops.ascend_npu_fhe.bconv(x, lhs_dense, attrs...)` | 输入 `x:int32,lhs_dense:int8`；输出 `y:int32` | 处理 RNS 源基到目标基转换，包含矩阵阶段和误差补偿 | [bconv](kernels\u002Fbconv\u002FREADME.md) |\n| `IP` | `kernels\u002Fip` | RNS 内积累加 | `torch.ops.ascend_npu_fhe.ip(x, key, key_shoup, num_rns, d, poly_degree, q_array)` | 输入 `x,key,key_shoup:int32`；输出 `y:int32` | 在 RNS 和分解维度上累加，与逐元素算子和基转换算子分离 | [ip](kernels\u002Fip\u002FREADME.md) |\n| `AutoOp` | `kernels\u002Fauto_op` | 自同构重排与符号归一化 | `torch.ops.ascend_npu_fhe.auto_op(x, byte_offsets_32, sign_mask, num_rns, poly_degree, k, q_array)` | 输入 `x,byte_offsets_32:int32,sign_mask:int8`；输出 `dst:int32` | 负责系数重排和模意义取反，与算术和 NTT 路径分离 | [auto_op](kernels\u002Fauto_op\u002FREADME.md) |\n| `NTT` | `kernels\u002Fntt` | 五阶段数论变换 | `torch.ops.ascend_npu_fhe.ntt(a_grid, w1_soa, w2_all, qs_tensor, q_mu_tensor, w3_mm2_mat_soa)` | 混合 `int32\u002Fint8` 输入；输出 `stage5_out:int32` | 融合 NTT 五阶段计算，与基础模运算和 RNS 辅助算子分离 | [ntt](kernels\u002Fntt\u002FREADME.md) |\n\n## 仓库结构\n\n```text\nAscendFHE\u002F\n|-- README.md\n|-- LICENSE\n|-- doc\u002F\n|-- notebooks\u002F\n`-- kernels\u002F\n    |-- add_mod\u002F\n    |-- sub_mod\u002F\n    |-- mul_mod_shoup\u002F\n    |-- montgomery_mul\u002F\n    |-- bconv\u002F\n    |-- ip\u002F\n    |-- auto_op\u002F\n    `-- ntt\u002F\n```\n\n每个算子目录采用固定结构：\n\n```text\nkernels\u002F\u003Coperator>\u002F\n|-- README.md\n|-- operator.cmake\n|-- op_host\u002F\n`-- op_kernel\u002F\n```\n\n目录含义：\n\n| 路径 | 内容 |\n| --- | --- |\n| `README.md` | 独立功能说明和 torch_npu 接入说明。 |\n| `operator.cmake` | 声明主机侧源码、设备侧源码和头文件目录。 |\n| `op_host\u002F` | shape 推导、数据类型推导和 tiling 参数生成。 |\n| `op_kernel\u002F` | Ascend C 设备侧 kernel 源码。 |\n\n## torch_npu API\n\n安装并注册 AscendFHE 算子包后，公开 API 如下：\n\n```python\ntorch.ops.ascend_npu_fhe.add_mod(a, b, q) -> y\ntorch.ops.ascend_npu_fhe.sub_mod(a, b, q) -> y\ntorch.ops.ascend_npu_fhe.mul_mod_shoup(a, W, Wprime, q) -> y\ntorch.ops.ascend_npu_fhe.montgomery_mul(x, y, q_mu, q) -> z\ntorch.ops.ascend_npu_fhe.bconv(\n    x, lhs_dense, num_src_bases, num_dst_bases, poly_degree, fixed_shift,\n    src_bases, dst_bases, q_hat_inv_mod_q, q_hat_inv_mod_q_shoup,\n    src_bases_inv_fixed, error_comp_coefs, error_comp_coefs_shoup,\n    merge_base_shoup\n) -> y\ntorch.ops.ascend_npu_fhe.ip(x, key, key_shoup, num_rns, d, poly_degree, q_array) -> y\ntorch.ops.ascend_npu_fhe.auto_op(x, byte_offsets_32, sign_mask, num_rns, poly_degree, k, q_array) -> dst\ntorch.ops.ascend_npu_fhe.ntt(a_grid, w1_soa, w2_all, qs_tensor, q_mu_tensor, w3_mm2_mat_soa) -> stage5_out\n```\n\n## 在 torch_npu 中接入\n\n统一接入链路如下：\n\n```text\nPython API\n  -> torch.ops.ascend_npu_fhe.\u003Cop_name>\n  -> C++ extension wrapper\n  -> 输入 dtype\u002Fshape\u002Fdevice 校验\n  -> 输出 Tensor 创建\n  -> host tiling 或等价 tiling 生成\n  -> ACL \u002F torch_npu 自定义算子 launch\n  -> Ascend C kernel\n  -> NPU 输出 Tensor\n```\n\nC++ wrapper 的统一职责：\n\n1. 校验输入 Tensor 位于 NPU，且 dtype、shape 和属性满足算子要求。\n2. 按算子 shape 推导规则创建输出 Tensor。\n3. 调用现有 `op_host\u002F` 中的 tiling 逻辑，或实现等价 tiling 生成函数。\n4. 调用对应 Ascend C kernel 入口。\n5. 返回输出 Tensor 给 PyTorch。\n\n建议新增的 `torch_npu` 适配层目录：\n\n```text\ntorch_npu_ext\u002F\n|-- CMakeLists.txt\n|-- register_ops.cpp\n|-- ops\u002F\n|   |-- add_mod.cpp\n|   |-- sub_mod.cpp\n|   |-- mul_mod_shoup.cpp\n|   |-- montgomery_mul.cpp\n|   |-- bconv.cpp\n|   |-- ip.cpp\n|   |-- auto_op.cpp\n|   `-- ntt.cpp\n`-- python\u002F\n    `-- ascend_npu_fhe\u002F\n        |-- __init__.py\n        `-- ops.py\n```\n\n当前仓库不包含上述适配层源码；本 README 和各算子 README 描述的是接入实现时必须\n遵守的接口和数据流。\n\n## 环境要求\n\n本仓库公开支持的 CANN 版本固定为 `CANN Community Edition 8.5.0`。源码中的\n`AICore().AddConfig(\"ascend910b\")` 声明了硬件目标，公开支持路径固定为 Atlas A2 \u002F\nAscend 910B，并使用 `910b ops` 算子包。\n\n| 项目 | 固定版本或目标 |\n| --- | --- |\n| CANN | CANN Community Edition 8.5.0 |\n| Toolkit | ascend::cann-toolkit 8.5.0 |\n| ops | ascend::cann-910b-ops 8.5.0 |\n| 硬件 | Atlas A2 \u002F Ascend 910B |\n| SOC | ascend910b |\n| 主机编译器 | CANN 8.5.0 支持的 C++17 编译器 |\n| 构建工具 | CMake 与 Ninja 或 Make |\n| Python 调用侧 | PyTorch + `torch_npu` |\n\n本仓库不声明兼容 CANN Community Edition 8.5.0 以外的版本。安装方法见\n[CANN 8.5.0 环境安装方法](doc\u002Fenvironment_install.md)。\n\n## 正确性验证\n\n实现 torch_npu 适配层后，每个算子按以下方式验证：\n\n- `AddMod`：校验 `y = (a + b) mod q`。\n- `SubMod`：校验 `y = (a - b) mod q`。\n- `MulModShoup`：使用 `W`、`Wprime`、`q` 校验 Shoup 模乘结果。\n- `MontgomeryMul`：使用 `q_mu`、`q` 校验 Montgomery 模乘结果。\n- `BConv`：使用小规模源基和目标基校验基转换结果。\n- `IP`：使用小规模 `num_rns`、`d`、`poly_degree` 校验内积累加结果。\n- `AutoOp`：校验重排、符号处理和模归一化结果。\n- `NTT`：使用固定旋转因子表和模数校验五阶段 NTT 输出。\n\n验证记录必须包含：\n\n```text\n算子名称\ntorch_npu API\n输入形状\n输入数据类型\n属性值\n参考实现输出\nNPU 输出\n校验和\n运行命令\n运行日志\n```\n\n## 添加新算子\n\n添加新算子时按以下步骤修改仓库：\n\n1. 新建 `kernels\u002F\u003Cname>\u002Fop_host\u002F`，添加 shape 推导、数据类型推导和 tiling 参数生成。\n2. 新建 `kernels\u002F\u003Cname>\u002Fop_kernel\u002F`，添加 Ascend C 设备侧 kernel。\n3. 新建 `kernels\u002F\u003Cname>\u002Foperator.cmake`，声明构建所需源码和头文件。\n4. 新建 `kernels\u002F\u003Cname>\u002FREADME.md`，说明独立功能和 torch_npu 接入方式。\n5. 在后续 torch_npu 适配层中新增 `torch_npu_ext\u002Fops\u002F\u003Cname>.cpp`。\n6. 更新根 README 的独立功能卡片和 `torch_npu` API。\n\n本地检查命令：\n\n```bash\nrg -n \"torch_npu|torch.ops.ascend_npu_fhe\" README.md kernels\u002F*\u002FREADME.md\nrg -n \"__global__ __aicore__ void\" kernels\nrg --files kernels\n```\n\n## 许可证\n\n仓库根目录的 `LICENSE` 为 GPL-2.0。修改和分发源码时必须保留源文件中的许可证声明。\n\n## 引用信息\n\n公开发布前，在此处补充论文标题、作者、会议或期刊名称、年份和 BibTeX 条目。\n实验记录中必须包含仓库提交哈希。\n","AscendFHE 是一个面向同态加密计算的 Ascend NPU 硬件加速底层算子库，支持 Atlas A2 和 Ascend 910B 设备。该项目提供了 FHE 常用的模运算、RNS 基转换、内积累加、自同构重排和 NTT 等算子的 Ascend C kernel、host tiling 逻辑以及算子构建片段。安装并注册 AscendFHE 算子包后，这些算子可以通过 `torch_npu` 暴露给 PyTorch 使用。该项目适合需要在 Ascend NPU 上进行高效同态加密计算的研究人员和开发者使用。当前版本已提供必要的算子实现及验证文档，但完整的扩展构建尚需进一步配置。",2,"2026-06-11 03:57:37","CREATED_QUERY"]