已合并
北京林业大学高性能计算数据结构 #926
北京林业大学高性能计算数据结构 #926
已合并
zh1125创建于 8月31日
共 15 个文件变更+27465-7
@@ -0,0 +1,528 @@
1+{
2+ "cells": [
3+ {
4+ "cell_type": "markdown",
5+ "metadata": {},
6+ "source": [
7+ "# 基于 CANN 的 Softmax 算子实现实验\n",
8+ "\n",
9+ "Softmax 是深度学习中连接线性层和概率分布的基础算子,也是一个很典型的“按行归约 + 逐元素归一化”问题。它不像 Add 那样只依赖当前位置:一行中的最大值和指数和会影响这一行的每一个输出,因此实现时必须同时考虑数值稳定性、连续访存、片上缓冲和多核任务划分。\n",
10+ "\n",
11+ "本实验在 Ascend C 编程模型下实现二维 `float32` 张量最后一维上的稳定 Softmax,并通过 ACL 直调验证 Kernel。实验特别强调编译边界:`softmax.asc` 只保留设备侧 Kernel 和 ASC 启动包装函数;`host.cpp` 独立承担 Tiling、ACL 资源管理、CPU 参考实现和结果统计。\n",
12+ "\n",
13+ "学习大纲如下:\n",
14+ "\n",
15+ "1. 环境准备:创建工程目录,检查 CANN 环境变量和 NPU 条件;\n",
16+ "2. 问题分析:理解稳定 Softmax 的数学形式、二维张量布局、行级并行策略,以及原单文件工程的编译失败原因;\n",
17+ "3. 数据结构与 Kernel:认识 `GlobalTensor`、`LocalTensor`、`TQue`、`TBuf` 和 `SoftMaxTiling` 在不同存储层次中的职责;\n",
18+ "4. Host 验证:生成可重复输入,计算 CPU golden,完成 Tiling、内存管理、Kernel 发射、计时和误差校验;\n",
19+ "5. 构建与结果分析:使用 ASC/CXX 分离编译,读取三组规模的准确率、时延和吞吐量;\n",
20+ "6. 实验总结与拓展:从访存连续性、归约开销和并行度角度解释现象,并设计后续变量控制实验。\n",
21+ "\n",
22+ "运行最后的编译和运行单元后,程序会执行 `16x1024`、`32x1024` 和 `64x1024` 三组测试,输出正确性指标、平均时延、吞吐量,并将汇总表保存到 `Source/04.00/softmax/softmax_results.txt`。"
23+ ]
24+ },
25+ {
26+ "cell_type": "markdown",
27+ "metadata": {},
28+ "source": [
29+ "## 1. 环境准备\n",
30+ "\n",
31+ "下面创建工程目录并查找、加载 CANN 根目录下的 `set_env.sh`。编译和运行需要 Linux、CANN 8.3.RC1(或兼容版本)以及可用的昇腾 NPU。没有 NPU 时仍可先执行代码生成单元,检查工程文件和注释是否完整。\n",
32+ "\n",
33+ "生成后的目录结构如下:\n",
34+ "\n",
35+ "```text\n",
36+ "Source/04.00/softmax/\n",
37+ "├── softmax_common.h # Host 与 Kernel 共享的轻量配置\n",
38+ "├── softmax.asc # ASC 编译的设备侧 Kernel\n",
39+ "├── host.cpp # CXX 编译的 Host、Tiling 和校验\n",
40+ "├── CMakeLists.txt # ASC/CXX 混合目标和链接配置\n",
41+ "├── build/ # CMake 构建目录\n",
42+ "└── softmax_results.txt # 运行输出和汇总表\n",
43+ "```\n",
44+ "\n",
45+ "环境脚本由本单元先加载到 Notebook 的 Python 进程,再由编译和运行单元传递给 Bash。若脚本不存在,Notebook 会明确提示,而不会把一个缺少 CANN 依赖的半成品误认为编译成功。"
46+ ]
47+ },
48+ {
49+ "cell_type": "code",
50+ "execution_count": null,
51+ "metadata": {},
52+ "outputs": [],
53+ "source": [
54+ "import os\n",
55+ "import shlex\n",
56+ "import subprocess\n",
57+ "from pathlib import Path\n",
58+ "\n",
59+ "project_dir = Path('Source/04.00/softmax')\n",
60+ "project_dir.mkdir(parents=True, exist_ok=True)\n",
61+ "\n",
62+ "# 与同目录 Ascend C 实验保持一致:优先使用已有变量,再扫描常见安装目录。\n",
63+ "candidate_roots = [\n",
64+ " os.environ.get('ASCEND_TOOLKIT_HOME'),\n",
65+ " os.environ.get('ASCEND_INSTALL_PATH'),\n",
66+ " os.environ.get('ASCEND_HOME_PATH'),\n",
67+ " os.environ.get('ASCEND_CANN_PACKAGE_PATH'),\n",
68+ " '/usr/local/Ascend/ascend-toolkit/latest',\n",
69+ " '/usr/local/Ascend/ascend-toolkit',\n",
70+ " '/opt/Ascend/ascend-toolkit/latest',\n",
71+ " '/opt/Ascend/ascend-toolkit',\n",
72+ " '/opt/conda/Ascend/cann-9.0.0/aarch64-linux',\n",
73+ " str(Path.home() / 'Ascend/ascend-toolkit/latest'),\n",
74+ " str(Path.home() / 'Ascend/ascend-toolkit'),\n",
75+ " '/workspace/Ascend/ascend-toolkit/latest',\n",
76+ " '/workspace/Ascend/ascend-toolkit',\n",
77+ "]\n",
78+ "set_env_path = None\n",
79+ "for root in candidate_roots:\n",
80+ " if root:\n",
81+ " candidate = Path(root) / 'set_env.sh'\n",
82+ " if candidate.exists():\n",
83+ " set_env_path = candidate\n",
84+ " break\n",
85+ "\n",
86+ "if set_env_path is None:\n",
87+ " for root in [Path('/usr/local/Ascend'), Path('/opt/Ascend'), Path('/opt/conda/Ascend'), Path.home(), Path('/workspace')]:\n",
88+ " if root.exists():\n",
89+ " matches = list(root.glob('**/ascend-toolkit*/set_env.sh')) + list(root.glob('**/cann-*/**/set_env.sh'))\n",
90+ " if matches:\n",
91+ " set_env_path = matches[0]\n",
92+ " break\n",
93+ "\n",
94+ "if set_env_path is not None:\n",
95+ " env_text = subprocess.check_output(\n",
96+ " ['bash', '-lc', f'source {shlex.quote(str(set_env_path))} && env'],\n",
97+ " text=True,\n",
98+ " )\n",
99+ " for line in env_text.splitlines():\n",
100+ " if '=' in line:\n",
@@ -1,15 +1,24 @@
1-# 面向高性能计算的数据结构1+[![面向高性能计算的数据结构](./images/READMEImage.png)](https://e.huawei.com/cn/talent/learning/#/zone?customizedZoneId=qS4mF6lijbGojmzxSlKlhX4ccow)
2 2 
3-本课程围绕高性能计算场景中的数据组织、内存访问、并行计算和性能优化方法展开。课程通过可运行的 Ascend C 实验,帮助学习者理解数据分块、片上存储和多核并行对计算性能的影响,并掌握面向昇腾 NPU 的基础性能分析与优化方法。3+------
4 4 
5-## 课程适用学习人群5+## 课程简介
6 6 
7-- 具备 C/C++ 基础语法和基本数据结构知识的学习者。7+随着人工智能的普及与发展,高性能计算需求的不断增长,传统CPU串行模式下的数据结构教学已难以适配技术的发展。本课程依托于华为昇腾计算平台与CANN技术体系,构建高性能计算场景下的数据结构模块化实验。实验内容涵盖了并行计算、分布式计算、算子开发等核心内容,每个实验均提供了可运行的Ascend C程序,可结合华为ICT学院与此配套的体系化课程进行深入学习。通过实验课程,指导学习者使用Ascend C编程,面向昇腾NPU完成算子的设计、实现、调试和优化,培养从数据结构、算法设计到性能评价的系统工程能力。
8-- 具备基础 Linux 命令行和 Jupyter Notebook 使用经验,希望学习 Ascend C 与高性能计算优化的学生或开发者。
9 8 
10-## 整体学习目标9+## 适合人群
11 10 
12-- 理解高性能计算中数据结构、数据布局与内存访问模式之间的关系。11+建议学习者具备C/C++基础和数据结构基础,但不要求事先有Ascend C编程经验。
12+ 
13+- 对并行计算、分布式计算或算子开发感兴趣,希望系统学习数据结构与并行算法的学习者;
14+- 具备数据结构基础,希望进一步了解高性能场景下的数据组织、存储与并行算法实现的学习者;
15+- 对华为昇腾计算平台与Ascend C算子开发感兴趣的学习者。
16+ 
17+## 学习目标
18+ 
19+- 理解面向高性能计算的数据结构设计原理
20+- 掌握并行算法设计与实现的基本方法
21+- 具备面向华为昇腾平台的算子开发实践能力
13 22 
14## 课程支持的硬件产品23## 课程支持的硬件产品
15 24 
@@ -31,8 +40,37 @@ CANNLab 环境创建与使用方法请参考 [CANNLab 环境体验指南](https:
31 40 
32## 课程章节目录41## 课程章节目录
33 42 
43+### 第一章:高性能计算基础
44+ 
45+| Notebook | Link | 状态 |
46+| -- | -- | -- |
47+| 01.00 基于不同存储结构的求和算子实现 | - | 🚧 待内测 |
48+| 01.01 基于静态 Tensor 的 ReLU 向量算子 | - | 🚧 待内测 |
49+ 
34### 第二章:并行计算50### 第二章:并行计算
35 51 
36| Notebook | Link | 状态 |52| Notebook | Link | 状态 |
37| -- | -- | -- |53| -- | -- | -- |
54+| 02.00 基于平衡二叉树的并行前缀和实现实验 | - | 🚧 待内测 |
55+| 02.01 基于并行广度优先遍历的网络故障诊断实验 | - | 🚧 待内测 |
38| 02.02 矩阵乘法分块优化实验 | [在线体验](https://ai.gitcode.com/user/username/notebookcann?repoUrl=https://gitcode.com/cann/cann-learning-hub.git&ttl=120&diskSize=40Gi&path=contrib/tutorials/data_structure_for_hpc&scanFilePath=contrib/tutorials/data_structure_for_hpc/02_parallel_computing/02.02_extra_ascendc_static_tensor_matmul.ipynb) | ✅ 已发布 |56| 02.02 矩阵乘法分块优化实验 | [在线体验](https://ai.gitcode.com/user/username/notebookcann?repoUrl=https://gitcode.com/cann/cann-learning-hub.git&ttl=120&diskSize=40Gi&path=contrib/tutorials/data_structure_for_hpc&scanFilePath=contrib/tutorials/data_structure_for_hpc/02_parallel_computing/02.02_extra_ascendc_static_tensor_matmul.ipynb) | ✅ 已发布 |
57+| 02.03 稀疏矩阵存储格式与分块计算优化实验 | - | 🚧 待内测 |
58+ 
59+### 第三章:分布式计算
60+ 
61+| Notebook | Link | 状态 |
62+| -- | -- | -- |
63+| 03.01 基于HCCL的分布式字符串词频统计实验 | - | 🚧 待内测 |
64+| 03.02 基于一致性哈希环的分布式哈希表模拟实验 | - | 🚧 待内测 |
65+| 03.03 分布式B+树结构动态更新与局部数据迁移实验 | - | 🚧 待内测 |
66+| 03.04 基于 HCCL 的 CSR 图分区实验 | - | 🚧 待内测 |
67+ 
68+### 第四章:算子开发
69+ 
70+| Notebook | Link | 状态 |
71+| -- | -- | -- |
72+| 04.00 基于 CANN的Softmax 算子优化 | - | 🚧 待内测 |
73+| 04.01 低精度矩阵乘法优化实验 | - | 🚧 待内测 |
74+| 04.02 卷积分类头前向计算实现与优化 | - | 🚧 待内测 |
75+| 04.03 RMSNorm向量算子实现与流水优化 | - | 🚧 待内测 |
76+