relaxed_madd 这条指令到底做了什么


核心:relaxed_madd 是一个分量级别 (Component-wise) 的操作

首先,最重要的一点是:v128.relaxed_madd<f32>(a, b, c) 不是矩阵乘法。它是一个在三个向量 a, b, c 之间进行的、逐个分量的、并行的融合乘加操作。

这三个向量 a, b, c 都是 v128 类型,我们可以把它们看作包含四个 32位浮点数 (f32) 的数组。

1. 定义我们的输入向量

让我们用数学形式来表示这三个输入向量 a, b, c

  • 向量 a⃗=(a0a1a2a3)\vec{a} = \begin{pmatrix} a_0 \\ a_1 \\ a_2 \\ a_3 \end{pmatrix}a=a0a1a2a3
  • 向量 b⃗=(b0b1b2b3)\vec{b} = \begin{pmatrix} b_0 \\ b_1 \\ b_2 \\ b_3 \end{pmatrix}b=b0b1b2b3
  • 向量 c⃗=(c0c1c2c3)\vec{c} = \begin{pmatrix} c_0 \\ c_1 \\ c_2 \\ c_3 \end{pmatrix}c=c0c1c2c3

这里的 a0,a1,…,c3a_0, a_1, \dots, c_3a0,a1,,c3 都是普通的 32 位浮点数。

2. relaxed_madd 的数学公式

v128.relaxed_madd<f32>(a, b, c) 这条指令执行的计算,其结果是一个新的向量,我们称之为 $ \vec{r} $ (result)。这个计算的数学公式是:

r⃗=(a⃗⊙b⃗)+c⃗\vec{r} = (\vec{a} \odot \vec{b}) + \vec{c}r=(ab)+c

这里的 ⊙\odot 符号代表 哈达玛积 (Hadamard Product),也就是分量相乘 (component-wise multiplication)

3. 展开公式,看清细节

把上面的公式展开到每一个分量上,就能看清它到底发生了什么。结果向量 r⃗\vec{r}r 的四个分量 r0,r1,r2,r3r_0, r_1, r_2, r_3r0,r1,r2,r3 是这样并行计算出来的:

r⃗=(r0r1r2r3)=(a0⋅b0+c0a1⋅b1+c1a2⋅b2+c2a3⋅b3+c3)\vec{r} = \begin{pmatrix} r_0 \\ r_1 \\ r_2 \\ r_3 \end{pmatrix} = \begin{pmatrix} a_0 \cdot b_0 + c_0 \\ a_1 \cdot b_1 + c_1 \\ a_2 \cdot b_2 + c_2 \\ a_3 \cdot b_3 + c_3 \end{pmatrix}r=r0r1r2r3=a0b0+c0a1b1+c1a2b2+c2a3b3+c3

这就是 relaxed_madd 的全部真相:它在一条指令里,同时并行地完成了这四个独立的融合乘加运算


它在你的矩阵乘法代码中是如何被应用的?

现在我们把你代码中的一行拿出来,用这个公式来解释:

// 代码行
res0 = v128.relaxed_madd<f32>(sA0, rB0, res0_prev); 
// (我把之前的 res0 重命名为 res0_prev 以便区分)

这里的输入是什么?

  • sA0: 这是一个由矩阵 A 的元素 A[0][0] 广播 (splat) 而来的向量。
    sA0⃗=(A[0][0]A[0][0]A[0][0]A[0][0])\vec{sA0} = \begin{pmatrix} A[0][0] \\ A[0][0] \\ A[0][0] \\ A[0][0] \end{pmatrix}sA0=A[0][0]A[0][0]A[0][0]A[0][0]

  • rB0: 这是矩阵 B 的第一行向量。
    rB0⃗=(B[0][0]B[0][1]B[0][2]B[0][3])\vec{rB0} = \begin{pmatrix} B[0][0] \\ B[0][1] \\ B[0][2] \\ B[0][3] \end{pmatrix}rB0=B[0][0]B[0][1]B[0][2]B[0][3]

  • res0_prev: 这是上一步计算的结果(累加值)。

那么,v128.relaxed_madd<f32>(sA0, rB0, res0_prev) 这一步到底计算了什么?我们套用上面的公式:

res0⃗=(sA0⃗⊙rB0⃗)+res0prev⃗\vec{res0} = (\vec{sA0} \odot \vec{rB0}) + \vec{res0_{prev}}res0=(sA0rB0)+res0prev

展开来看就是:

res0⃗=(A[0][0]⋅B[0][0]+res0prev,0A[0][0]⋅B[0][1]+res0prev,1A[0][0]⋅B[0][2]+res0prev,2A[0][0]⋅B[0][3]+res0prev,3)\vec{res0} = \begin{pmatrix} A[0][0] \cdot B[0][0] + res0_{prev,0} \\ A[0][0] \cdot B[0][1] + res0_{prev,1} \\ A[0][0] \cdot B[0][2] + res0_{prev,2} \\ A[0][0] \cdot B[0][3] + res0_{prev,3} \end{pmatrix}res0=A[0][0]B[0][0]+res0prev,0A[0][0]B[0][1]+res0prev,1A[0][0]B[0][2]+res0prev,2A[0][0]B[0][3]+res0prev,3

这完美地对应了我们矩阵乘法思想:用 A 的一个标量元素,去数乘 B 的一整个行向量,然后加到累加器上。

当你把四次 relaxed_madd 调用链接起来后,最终的结果 res0 的第一个分量就是:
r0=(A[0][0]⋅B[0][0])+(A[0][1]⋅B[1][0])+(A[0][2]⋅B[2][0])+(A[0][3]⋅B[3][0])r_0 = (A[0][0] \cdot B[0][0]) + (A[0][1] \cdot B[1][0]) + (A[0][2] \cdot B[2][0]) + (A[0][3] \cdot B[3][0])r0=(A[0][0]B[0][0])+(A[0][1]B[1][0])+(A[0][2]B[2][0])+(A[0][3]B[3][0])
这正好是结果矩阵 C 的 C[0][0] 元素!其他分量同理。

FMA 的“融合”体现在哪里?

“融合” (Fused) 的意思是,在计算 ai⋅bi+cia_i \cdot b_i + c_iaibi+ci 时:

  1. 计算 ai⋅bia_i \cdot b_iaibi 的乘积,得到一个内部的、高精度的中间结果(比如 80 位浮点数)。
  2. 不进行舍入,直接用这个高精度结果与 cic_ici 相加。
  3. 对最终的和只进行一次舍入,得到 32 位的浮点数结果。

相比之下,非融合的 mul + add 会进行两次舍入,可能会损失精度。更重要的是,FMA 是一条硬件指令,吞吐量更高。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90809.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90809.shtml
英文地址,请注明出处:http://en.pswp.cn/web/90809.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【全新上线】境内 Docker 镜像状态监控

境内 Docker 镜像状态监控&#xff1a;您的 Docker 加速伴侣 在当今云计算和容器化技术飞速发展的时代&#xff0c;Docker 已成为开发者不可或缺的工具。然而&#xff0c;对于身处国内的用户而言&#xff0c;访问境外 Docker Hub 等镜像仓库时常会遭遇网络延迟和连接不稳定的困…

Visual Studio中部署PaddleOCRv5 (借助ncnn框架)

PaddleOCRv5_ncnn PaddleOCRv5 在Visual Studio中进行图片OCR检测&#xff08;ncnn框架open-mobile实现)&#xff0c;尝试对nihui的ncnn-android-ppocrv5检测算法的剥离与移植。 本项目Github链接如下&#xff1a;PaddleOCRv5_ncnn 写在前面 本仓库代码是基于nihui的ncnn-a…

中级全栈工程师笔试题

解释ACID特性&#xff0c;如何在node.js中实现事务操作针对React单页应用&#xff0c;请提供至少5种性能优化方案&#xff0c;并解释其原理&#xff1a; 减少首屏加载时间优化渲染性能资源加载策略状态管理优化代码分割方案 如何防止以下攻击&#xff1a; JWT令牌挟持Graph QL查…

Windows---动态链接库Dynamic Link Library(.dll)

DLL的“幕后英雄”角色 在Windows操作系统的生态中&#xff0c;有一类文件始终扮演着“幕后英雄”的角色——它们不像.exe文件那样直接呈现为用户可见的程序窗口&#xff0c;却支撑着几乎所有应用程序的运行&#xff1b;它们不单独执行&#xff0c;却承载着系统与软件的核心功…

深入分析计算机网络传输层和应用层面试题

三、传输层面试题&#xff08;Transmission Layer&#xff09;传输层位于 OSI 七层模型的第四层&#xff0c;它的核心任务是为两个主机之间的应用层提供可靠的数据传输服务。它不仅承担了数据的端到端传输&#xff0c;而且还实现了诸如差错检测、数据流控制、拥塞控制等机制&am…

【RH134 问答题】第 2 章 调度未来任务

目录crontab 文件中的用户作业时间格式怎么解释&#xff1f;如果需要以当前用户身份计划周期性作业&#xff0c;在上午 8 点到晚上 9 点之间每两分钟一次输出当前日期和时间&#xff0c;该作业只能在周一到周五运行&#xff0c;周六或周日不能运行。要怎么做&#xff1f;要计划…

【ee类保研面试】通信类---信息论

25保研er&#xff0c;希望将自己的面试复习分享出来&#xff0c;供大家参考 part0—英语类 part1—通信类 part2—信号类 part3—高数类 part100—self项目准备 文章目录**面试复习总纲****Chap2: 熵、相对熵和互信息 (Entropy, Relative Entropy, and Mutual Information)****…

vue2+node+express+MongoDB项目安装启动启动

文章目录 准备环境 安装MongoDB 安装 MongoDB Compass(图形化数据库管理工具) 安装 Postman(接口测试工具) 项目结构 配置项目代理 项目启动 提交项目 生成Access Token 准备环境 默认含有node.js、npm 安装MongoDB 下载地址:https://www.mongodb.com/try/download/com…

JavaEE初阶第十二期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十)

专栏&#xff1a;JavaEE初阶起飞计划 个人主页&#xff1a;手握风云 目录 一、多线程案例 1.1. 定时器 一、多线程案例 1.1. 定时器 定时器是软件开发的一个重要组件&#xff0c;是一种能够按照预设的时间间隔或在特定时间点执行某个任务或代码片段的机制。你可以把它想象成…

EDoF-ToF: extended depth of field time-of-flight imaging解读, OE 2021

1. 核心问题&#xff1a;iToF相机的“景深”死穴我们之前已经详细讨论过&#xff0c;iToF相机的“景深”&#xff08;有效测量范围&#xff09;受到光学散焦的严重制约。问题根源&#xff1a; 当iToF相机的镜头散焦时&#xff0c;来自场景不同深度的光信号会在传感器像素上发生…

符号引用与直接引用:概念对比与实例解析

符号引用与直接引用&#xff1a;概念对比与实例解析 符号引用和直接引用是Java虚拟机(JVM)中类加载与执行机制的核心概念&#xff0c;理解它们的区别与联系对于深入掌握Java运行原理至关重要。下面我将从定义、特性、转换过程到实际应用&#xff0c;通过具体示例全面比较这两类…

每日一讲——Podman

一、概念1、定义与定位Podman&#xff08;Pod Manager&#xff09;是符合OCI标准的容器引擎&#xff0c;用于管理容器、镜像及Pod&#xff08;多容器组&#xff09;。它无需守护进程&#xff08;Daemonless&#xff09;&#xff0c;直接通过Linux内核功能&#xff08;如命名空间…

Spring Boot DFS、HDFS、AI、PyOD、ECOD、Junit、嵌入式实战指南

Spring Boot分布式文件系统 以下是一些关于Spring Boot分布式文件系统(DFS)的实现示例和关键方法,涵盖了不同场景和技术的应用。这些示例可以帮助理解如何在Spring Boot中集成DFS(如HDFS、MinIO、FastDFS等)或模拟分布式存储。 使用Spring Boot集成HDFS 基础配置 // 配…

解决GoLand运行go程序报错:Error: Cannot find package xxx 问题

问题描述 一个简单的go程序&#xff0c;代码如下 package mainimport "fmt" func main() {// 占位符&#xff0c;和java的String.format用法一样fmt.Printf("我%d岁&#xff0c;我叫%s", 18, "yexindong") }结构如下当我想要运行时却报错 Error:…

Spring MVC设计精粹:源码级架构解析与实践指南

文章目录一、设计哲学&#xff1a;分层与解耦1. 前端控制器模式2. 分层架构设计二、核心组件源码解析1. DispatcherServlet - 九大组件初始化2. DispatcherServlet - 前端控制器&#xff08;请求处理中枢&#xff09;请求源码入口&#xff1a;FrameworkServlet#doGet()请求委托…

k8s之控制器详解

1.deployment&#xff1a;适用于无状态服务1.功能(1)创建高可用pod&#xff08;2&#xff09;滚动升级/回滚&#xff08;3&#xff09;平滑扩容和缩容2.操作命令&#xff08;1&#xff09;回滚# 回滚到上一个版本 kubectl rollout undo deployment/my-app# 回滚到特定版本&…

.NET Core中的配置系统

传统配置方式文件Web.config 进行配置。ConfigurationManager类配置。.NET配置系统中支持配置方式文件配置&#xff08;json、xml、ini等&#xff09;注册表环境变量命令行自定义配置源Json文件配置方式实现步骤&#xff1a;创建一个json文件&#xff0c;把文件设置 为“如果较…

kafka的消费者负载均衡机制

Kafka 的消费者负载均衡机制是保证消息高效消费的核心设计&#xff0c;通过将分区合理分配给消费者组内的消费者&#xff0c;实现并行处理和负载均衡。以下从核心概念、分配策略、重平衡机制等方面详细讲解。一、核心概念理解消费者负载均衡前&#xff0c;需明确三个关键概念&a…

腾讯云edges on部署pages

腾讯云edges on部署pages适用场景部署方式官方文档 适用场景 Next.js Hexo 以及用React Vue等现代前端框架构建的单页应用全栈项目开发 通过Pages Function KV等能力 实现轻量化的动态服务快速部署与迭代 通过Github等代码管理平台集成 每次代码提交时自动构建和部署网站 注…

SpringAI入门及浅实践,实战 Spring‎ AI 调用大模型、提示词工程、对话记忆、Adv‎isor 的使用

上一次写AI学习笔记已经好久之前了&#xff0c;温习温习&#xff0c;这一章讲讲关于Spring‎ AI 调用大模型、对话记忆、Adv‎isor、结构化输出、自定义对话记忆‍、Prompt 模板的相关知识点。 快速跳转到你感兴趣的地方一、提示词工程&#xff08;Prompt&#xff09;1. 基本概…