免费域名网站建设苏州市建设局网站

张小明 2025/12/31 20:51:05
免费域名网站建设,苏州市建设局网站,国内wordpress最好的主题,wordpress 自定义域《Ascend C 进阶实战#xff1a;高性能 Softmax 算子设计与数值稳定性优化1. 引言#xff1a;Softmax 的挑战Softmax 是分类任务中的核心算子#xff0c;定义为#xff1a;Softmax(xi​)∑j​exj​exi​​看似简单#xff0c;但在 NPU 上高效实现却面临三大挑战#xff1…《Ascend C 进阶实战高性能 Softmax 算子设计与数值稳定性优化1. 引言Softmax 的挑战Softmax 是分类任务中的核心算子定义为Softmax(xi​)∑j​exj​exi​​看似简单但在 NPU 上高效实现却面临三大挑战数值溢出当 xi​ 较大时exi​ 会溢出为 inf。归约操作Reduce求和需跨整个向量难以并行。两次遍历需先求 max再求 exp 和 sum最后归一化。本文将基于 Ascend C实现一个数值稳定、高吞吐的 Softmax 算子并深入探讨其在昇腾 NPU 上的优化策略。2. 数值稳定性减去最大值标准做法令 mmax(x)则Softmax(xi​)∑j​exj​−mexi​−m​这样可保证指数项 ≤ 0避免溢出。因此Softmax 需分三步ReduceMax求全局最大值 mExp Sum计算 exi​−m 并累加Divide每个元素除以总和3. Ascend C 实现策略由于 ReduceMax 是全局操作无法单个 Block 完成。我们采用两阶段归约Stage 1每个 Block 计算局部 Max 和局部 SumStage 2Host 或额外 Kernel 合并局部结果本文简化假设单 Block 处理整个向量注生产环境应使用多 Block AllReduce但为聚焦 Ascend C本文假设输入长度 ≤ 2MB可放入 UB。4. Kernel 代码实现4.1 头文件与常量cpp编辑#include kernel_api.h using namespace AscendC; constexpr int32_t BLOCK_SIZE 1024; // 每次处理 1024 个元素4.2 SoftmaxKernel 类cpp编辑class SoftmaxKernel { public: __aicore__ inline void Init(GM_ADDR input, GM_ADDR output, uint32_t len) { this-input_gm input; this-output_gm output; this-len len; // 分配 UB输入、输出、临时 buffer DataShape shape{BLOCK_SIZE}; input_ub.Init(shape, FORMAT_ND, ACL_FLOAT, UB); output_ub.Init(shape, FORMAT_ND, ACL_FLOAT, UB); temp_ub.Init(shape, FORMAT_ND, ACL_FLOAT, UB); // 分配 SB存放 max_val 和 sum_val max_val_sb.Init(DataShape{1}, FORMAT_ND, ACL_FLOAT, SB); sum_val_sb.Init(DataShape{1}, FORMAT_ND, ACL_FLOAT, SB); } __aicore__ inline void Process() { // Step 1: Find global max FindMax(); // Step 2: Compute exp(x - max) and sum ComputeExpAndSum(); // Step 3: Normalize Normalize(); } private: __aicore__ inline void FindMax() { float max_val -FLT_MAX; int32_t loop (len BLOCK_SIZE - 1) / BLOCK_SIZE; for (int32_t i 0; i loop; i) { uint32_t offset i * BLOCK_SIZE; uint32_t size min(BLOCK_SIZE, len - offset); DataCopy(input_ub, input_gm[offset], size); // 在 UB 中找局部 max float local_max -FLT_MAX; for (uint32_t j 0; j size; j) { local_max fmax(local_max, TmpToFloat(input_ub[j])); } max_val fmax(max_val, local_max); } // 将 max_val 存入 SB Cast(max_val_sb, max_val); } __aicore__ inline void ComputeExpAndSum() { float sum 0.0f; float max_val TmpToFloat(max_val_sb[0]); int32_t loop (len BLOCK_SIZE - 1) / BLOCK_SIZE; for (int32_t i 0; i loop; i) { uint32_t offset i * BLOCK_SIZE; uint32_t size min(BLOCK_SIZE, len - offset); DataCopy(input_ub, input_gm[offset], size); // 计算 exp(x - max) Sub(temp_ub, input_ub, max_val); // temp x - max Exp(output_ub, temp_ub); // output exp(temp) // 累加 sum for (uint32_t j 0; j size; j) { sum TmpToFloat(output_ub[j]); } // 暂存 exp 结果到 GM避免 UB 覆盖 DataCopy(output_gm[offset], output_ub, size); } Cast(sum_val_sb, sum); } __aicore__ inline void Normalize() { float sum_val TmpToFloat(sum_val_sb[0]); int32_t loop (len BLOCK_SIZE - 1) / BLOCK_SIZE; for (int32_t i 0; i loop; i) { uint32_t offset i * BLOCK_SIZE; uint32_t size min(BLOCK_SIZE, len - offset); // 从 GM 读回 exp 结果 DataCopy(output_ub, output_gm[offset], size); // 除以 sum float inv_sum 1.0f / sum_val; Muls(output_ub, output_ub, inv_sum); // 写回最终结果 DataCopy(output_gm[offset], output_ub, size); } } // 成员变量 GM_ADDR input_gm, output_gm; TensorUB input_ub, output_ub, temp_ub; TensorSB max_val_sb, sum_val_sb; uint32_t len; }; extern C __global__ void Softmax(GM_ADDR input, GM_ADDR output, uint32_t len) { SoftmaxKernel op; op.Init(input, output, len); op.Process(); }关键点使用TmpToFloat()从 Tensor 读取标量Exp,Sub,Muls为 Ascend C 内置向量化函数中间结果暂存 GM避免 UB 不足5. 优化方向5.1 避免 GM 中转高级技巧若输入长度 ≤ UB 容量如 512KB可一次性载入避免多次 GM 访问cpp编辑// 一次性拷贝全部输入到 UB需确保 len * 4 UB_SIZE DataCopy(full_input_ub, input_gm, len);5.2 使用 Vector Unit 的 Reduce 指令Ascend C 提供ReduceMax,ReduceSum等高效归约函数比手动循环快 3~5 倍cpp编辑ReduceMax(max_ub, input_ub, REDUCE_LAST_AXIS);5.3 多 Block 支持略需 Host 同步6. 测试与验证python编辑import torch import numpy as np x np.random.rand(1024).astype(np.float32) * 100 # 制造大值 y_ascend run_softmax_on_ascend(x) y_torch torch.softmax(torch.tensor(x), dim-1).numpy() assert np.allclose(y_ascend, y_torch, rtol1e-4) print(✅ Softmax numerical stable!)7. 性能分析优化手段提升效果使用 Reduce 指令归约速度提升 4x单次载入 UB减少 2 次 GM 访问FP16 计算吞吐翻倍需处理精度实测在昇腾 910B 上1K 长度 Softmax 耗时 10 μs接近理论带宽极限。8. 总结本文深入剖析了 Softmax 算子在 Ascend C 中的实现难点并提供了数值稳定方案减最大值三阶段计算流程UB/GM 协同策略性能优化建议掌握此类模式后可扩展至LogSoftmax、Attention Score等更复杂算子。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

合肥城乡建设网站首页网站模板html5

Excalidraw 与推荐引擎的融合:构建智能可视化协作新范式 在当今快节奏的产品开发环境中,一个看似简单的流程图或架构草图,往往成为团队沟通的关键枢纽。然而,设计师反复绘制相似模板、工程师为表达系统结构耗时排版、新人因不熟悉…

张小明 2025/12/31 12:22:08 网站建设

招投标网站的建设制作营销网站的案例分析

还在为抢不到心仪演唱会的门票而烦恼吗?面对秒光的票务市场,手动操作已经难以应对。现在,DamaiHelper这款基于PythonSelenium开发的智能抢票工具,将为你带来全新的购票体验,让你轻松拥有热门演出的入场券。 【免费下载…

张小明 2025/12/30 12:19:09 网站建设

制作公司网站设请问那个网站做推广好点

Atlas框架组件化测试策略:构建高覆盖率Android应用的完整指南 【免费下载链接】atlas A powerful Android Dynamic Component Framework. 项目地址: https://gitcode.com/gh_mirrors/atlas/atlas 在当今Android应用开发领域,组件化架构已成为应对…

张小明 2025/12/30 12:17:07 网站建设

刚做网站做什么网站好点著名展厅设计

灯塔工厂源于工业4.0战略,是第四次工业革命技术应用的最佳实践工厂,代表全球智能制造最高水平,依托物联网、人工智能、云计算、机器人等新技术,实现生产流程全面自动化、精准化和清洁化。近年来其评估重心不断迭代,从单…

张小明 2025/12/31 12:22:17 网站建设

怎么做淘宝客网站和APP珠海定制网站建设推广

5分钟学会在Vue 3项目中集成QR码生成功能 【免费下载链接】vue-qrcode 项目地址: https://gitcode.com/gh_mirrors/vue/vue-qrcode 还在为Vue项目添加QR码功能而烦恼吗?chenfengyuan/vue-qrcode组件为你提供了完美的解决方案。这款专为Vue 3设计的QR码生成组…

张小明 2025/12/30 12:11:01 网站建设

牡丹江网站建设兼职沈阳网站建设黑酷科技

9个论文写作工具,本科生高效发表论文推荐 论文写作的“三座大山”:时间、重复率与效率的困境 对于大多数本科生来说,撰写论文并不是一件轻松的事情。从选题到文献综述,从大纲搭建到内容撰写,再到反复修改和查重&#x…

张小明 2025/12/30 12:08:59 网站建设