ScatterAdd算子实现简介

news/2024/10/4 9:23:28/

在这里插入图片描述
在这里插入图片描述

Ascend C 算子实现简介:ScatterAdd 算子

本文主要对 ScatterAdd 算子进行简要介绍。

ScatterAdd 用于在给定的索引位置上增加一个指定的值。它的用法类似于 ScatterUpdate 操作,但不同的是,ScatterUpdate 是在指定索引位置上直接覆盖原来的值,而 ScatterAdd 则是在原来的值上执行加法操作。
在这里插入图片描述

参考 TensorFlow 的用法:

tf.raw_ops.ScatterAdd(ref, indices, updates, use_locking=False, name=None
)

其中,ref 是要进行更新操作的张量,indices 是要更新的位置的索引,updates 是要加上的值。use_locking 参数表示在更新时是否使用锁来确保同一时间只有一个操作在更新变量的值。name 参数为操作的名称。

实现思路:
在 Ascend C 上实现 ScatterAdd 算子的过程中,有几个核心问题需要解决:

  1. 如何优化最大 Tiling?
    对于大规模数据的处理,需确保尽可能高效地利用硬件资源。

  2. 数据类型的处理
    特别是对于 Half 类型的处理,如何保证精度与性能的平衡。

关键代码实现:

  1. 最大 Tiling 计算
uint32_t firstTiling = lastDim;if (lastDim * sizeOfDataType % BLOCK_SIZE == 0) {uint32_t bufferSize = 6;if (tilingKey == 4) {bufferSize = 10;}if (ub_size > bufferSize * lastDim * sizeOfDataType) {firstTiling = lastDim;} else {while (ub_size < bufferSize * firstTiling * sizeOfDataType) {firstTiling -= 32 / sizeOfDataType;}}tilingKey += 10;
}

通过这种方式,我们确保了在硬件上能够高效处理大规模数据,减少不必要的计算浪费。

  1. Half 类型的标量加法
// half转float
int16_t varInt16 = *(int16_t*)&var;
int32_t fltInt32 = ((varInt16 & 0x8000) << 16);
fltInt32 |= ((varInt16 & 0x7fff) << 13) + 0x38000000;
float varFp32 = *(float*)&fltInt32;int16_t updateInt16 = *(int16_t*)&update;
fltInt32 = ((updateInt16 & 0x8000) << 16);
fltInt32 |= ((updateInt16 & 0x7fff) << 13) + 0x38000000;
float updateFp32 = *(float*)&fltInt32;float res = varFp32 + updateFp32;// float 转 half
int16_t fltInt16;
fltInt32 = *(int32_t*)&res;
fltInt16 = ((fltInt32 & 0x7fffffff) >> 13) - (0x38000000 >> 13);
fltInt16 |= ((fltInt32 & 0x80000000) >> 16);half resHalf = *(half*)&fltInt16;

通过上述代码,我们确保了对于 Half 类型的加法操作能够准确高效地完成,保证了在硬件加速场景下的性能表现。

以上就是 ScatterAdd 算子的简单实现介绍,核心在于对齐操作、最大 Tiling 的优化以及特殊数据类型(如 Half)的处理。这些技术点在 Ascend C 硬件架构上被充分利用,实现了高效的算子执行。
在这里插入图片描述


http://www.ppmy.cn/news/1533804.html

相关文章

滚雪球学MySQL[7.2讲]:MySQL安全策略详解:数据加密与SQL注入防护

全文目录&#xff1a; 前言7.2 数据加密与SQL注入防护1. 数据加密1.1 传输层加密&#xff08;SSL/TLS&#xff09;1.1.1 SSL/TLS的配置 1.2 存储加密&#xff08;TDE&#xff09;1.2.1 TDE的配置 1.3 数据加密的注意事项 2. SQL注入防护2.1 SQL注入的工作原理2.2 防护SQL注入的…

源2.0-M32大模型适配AutoGPTQ工具及量化推理教程

AutoGTPQ简介 AutoGPTQ‌是一个开源工具包&#xff0c;专注于简化大规模语言模型(LLMs)的量化过程。它基于高效的GPTQ算法开发&#xff0c;主要使用Python编程语言&#xff0c;并依托PyTorch框架来实现量化功能。AutoGPTQ的设计目标是为开发者和研究人员提供一个易于使用的API接…

Spring之生成Bean

Bean的生命周期&#xff1a;实例化->属性填充->初始化->销毁 核心入口方法&#xff1a;finishBeanFactoryInitialization-->preInstantiateSingletons DefaultListableBeanFactory#preInstantiateSingletons用于实例化非懒加载的bean。 1.preInstantiateSinglet…

Apache POI 2024/10/2

导入Apache POI的maven坐标 通过POI向Excel文件写入文件内容 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File; import java.…

Vue和axios零基础学习

Vue的配置与项目创建 在这之前要先安装nodejs 安装脚手架 官网 Home | Vue CLI (vuejs.org) 先运行&#xff0c;切换成淘宝镜像源&#xff0c;安装速度更快 npm config set registry http://registry.npm.taobao.org 创建项目 用编译器打开一个空文件&#xff0c;在终端输入…

深度学习:cGAN和pix2pix图像转换

cGAN和pix2pix的基础概念 cGAN cGAN是条件生成对抗网络&#xff08;Conditional Generative Adversarial Networks&#xff09;的简称。 它是一种基于基础GAN&#xff08;Generative Adversarial Networks&#xff09;架构的变体&#xff0c;通过给GAN模型引入额外的信息或条…

mp4(H.265编码)转为本地RTSP流

目标&#xff1a;获得H265码流&#xff0c;要么通过在线网址&#xff0c;要么获得H265文件自己产生码流 在以下任意网址中下载得到H265编码的MP4文件 http://www.elecard.com/en/download/videos.html http://ultravideo.cs.tut.fi/#testsequences http://4k.cablelabs.com/](…

【零基础保姆级教程】MMDetection3训练输出Precision/Recall/F1-Score指标

最近为了跑对比试验&#xff0c;MMDetection这一框架整合的算法较多&#xff0c;故博主训练它并留下记录&#xff0c;若有疑问等欢迎评论、指正。 基本信息&#xff1a;博主在完成训练流程后&#xff0c;保留了整个过程的权重文件在worke_dirs/路径下&#xff0c;名称epoch_1.…