数据库浅谈之向量化

news2024/11/24 16:21:30

数据库浅谈之向量化

HELLO,各位博友好,我是阿呆 🙈🙈🙈

这里是数据库浅谈系列,收录在专栏 DATABASE 中 😜😜😜

本系列阿呆将记录一些数据库领域相关的知识 🏃🏃🏃

OK,兄弟们,废话不多直接开冲 🌞🌞🌞


一 🏠 概述

SIMD 简介

计算机程序需要编译成指令才能让 CPU 识别并执行运算。所以,CPU 指令处理数据的能力是衡量 CPU 性能的重要指标。

为了提高 CPU 指令处理数据的能力,半导体厂商在 CPU 中推出了一些可以同时并行处理多个数据的指令 —— SIMD 指令

SIMD 的全称是 Single Instruction Multiple Data,中文名“单指令多数据”。顾名思义,一条指令处理多个数据。

如下图所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-16Jdqsig-1677135328615)(E:\2022年MD文档\2023 年 MD文档\二月\数据库浅谈\数据库浅谈之向量化.assets\1677120452360.png)]

  • 一个普通加法指令,一次只能对两个数执行一个加法操作
  • 一个 SIMD 加法指令,一次可以对两个数组(向量)执行加法操作

SSE 指令下:矩阵运算主流程是 :加载 -> 运算 -> 存储

  1. 加载:将数据从内存加载到专用寄存器,一次可以加载多个数据
  2. 运算:使用 SSE 乘/加命令将 积 和 累加
  3. 存储:将结果保存到内存中

具体命令可参考 Intel SSE指令网址


SIMD基础知识

SIMD是单指令多数据技术,目前 Intel 处理器支持的 SIMD 技术包括 MMX、SSE 以及 AVX

SIMD的思想在不同平台架构下进行了实现

  • X86:SSE 指令
  • ARM:NEON指令
  • MIPS:MSA

不同平台架构下为实现SIMD思想也添加了不同的硬件支持(专用寄存器):

  • X86:目前支持 128bit 寄存器,256bit,甚至是 512bit
  • ARM:128bit
  • MIPS:128bit

SIMD 优点

在对大量数据执行相同操作时,使用一个指令完成,能取得巨大性能提升


二 🏠 核心

SIMD使用

在 C 程序中使用 SIMD 指令有两种方案,一 是使用内联汇编,二 是使用 Intel 提供的封装函数库

简单的数组相乘:

1. 内联汇编

#include <stdio.h>
#include <stdlib.h>    
int main()
{
    float a[4] = { 1,2,3,4 };
    float b[4] = { 5,6,7,8 };
    float res[4];
    __asm__ __volatile__( 
        "movups %1,%%xmm0\n\t"            // 将a所指内存的128位数据放入xmm0寄存器
        "movups %2,%%xmm1\n\t"            // 将b所指内存的128位数据放入xmm0寄存器
        "mulps  %%xmm1,%%xmm0\n\t"        // 计算 xmm0 * xmm1,结果放入 xmm0
        "movups %%xmm0,%0\n\t"            // 将xmm0的数据放入res所指内存
        :"=m"(res)                        //output
        :"m"(a),"m"(b)                    //input
    );
    for(int i=0;i<4;i++)
      printf("%.2f\n",res[i]);
  return 0;
}

先看 movups 指令,分为四个部分:

  • mov,表示数据移动
  • u,表示 unaligned,内存未对齐。a,表示 aligned,内存已对齐
  • p,表示 packed,打包数据,对128位所有数据执行操作。如果是s,则表示 scalar,标量数据,仅对 128 位内第一个数执行操作
  • s表示 single precision floating point,将数据视为32位单精度浮点数,一组4个。d,表示 double precision floating point,将数据视为64位双精度浮点,一组两个

从内存中向寄存器加载数据时,必须区分数据是否对齐。SSE指令要求数据按16字节对齐,未对齐数据必须使用movups,已对齐数据可以任意使用movups或者movaps


2. 指令向量化

sse : m128 _mm_add_epi32(m128 a , __m128 b )

#include <stdio.h>
#include <stdlib.h>
#include <emmintrin.h>    
int main()
{
    float a[4] = { 1,2,3,4 };
    float b[4] = { 5,6,7,8 };
    float res[4];
    __m128 A = _mm_loadu_ps(a);
    __m128 B = _mm_loadu_ps(b);
    __m128 RES = _mm_mul_ps(A, B);
    _mm_storeu_ps(res, RES);
    for(int i=0;i<4;i++)
      printf("%.2f\n",res[i]);
  return 0;
}
  • _mm,表示这是一个64位/128位的指令,_mm256 和 _mm512 则表示是 256 位或是 512 位的指令
  • _loadu,表示unaligen的load指令,不带u后缀的为 aligen
  • _ps,同上面汇编指令

3. 自动向量化

SSE : 使用 -O3 即可支持 SSE 自动向量化(auto vectorization)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NrlsEatt-1677135328617)(E:\2022年MD文档\2023 年 MD文档\二月\数据库浅谈\数据库浅谈之向量化.assets\1677122633646.png)]


使用 GCC 可以通过 -S 参数,输出中间汇编文件,可检查是否自动将代码进行向量化

  • 以 v 开头的指令,如 vpmulld、vpaddd、vmovdqu 都是向量化指令
  • xmm、ymm、zmm 分别表示 128 位、256 位 和 512 位的向量化使用的寄存器
  • 本例中使用了 -mavx512f 编译选项要求编译器使用 AVX512,所以汇编代码使用的寄存器是 512 位的 zmm 系列
  • 本例中将数组 x 的长度固定为 64 个 int(512 位的倍数),是为了让实例生成的汇编代码更加简洁,不是向量化的强制要求

编译:g++ -o built-vec -mavx512f built-vec.cc

-mavx512f 表示使用 AVX512 指令集。如果 CPU 不支持 AVX512,可以使用其它 SIMD 指令集。相关编译选项有:-mmmx、-msse、-msse2、-msse3、-mssse3、-msse4.1、-msse4.2、-msse4、-mavx、-mavx2、-mavx512f、-mavx512pf、-mavx512er、-mavx512cd、-mavx512vl、-mavx512bw、-mavx512dq、-mavx512ifma、-mavx512vbmi


三 🏠 结语

身处于这个浮躁的社会,却有耐心看到这里,你一定是个很厉害的人吧 👍👍👍

各位博友觉得文章有帮助的话,别忘了点赞 + 关注哦,你们的鼓励就是我最大的动力

博主还会不断更新更优质的内容,加油吧!技术人! 💪💪💪

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zabbix“专家坐诊”第182期问答汇总

问题一&#xff1a; Q&#xff1a;像烽火、浪潮这种没有ilo的设备怎么监控他们的硬件状态呢&#xff1f; A&#xff1a;如果没有ilo&#xff0c;可以使用其他硬件监控软件&#xff0c;例如HP Insight Manager、IBM Director、Dell OpenManage等。这些软件可以帮助您监控硬件状…

[神经网络]基干网络之ResNet、MobileNet

一、ResNet ①特点 ResNet的深度远比之前的算法深&#xff0c;且不会出现网络退化问题。 Ps.网络退化&#xff1a;网络深度增加反而不如原来的网络。(网络退化 ! 过拟合/梯度消失) ②残差块 残差块采用短路连接(Shortcut Connection) / 跳跃连接&#xff0c;拟合的目标由直接最…

2023年2月初某企业网络工程师面试题【建议收藏】

拓扑图如下&#xff0c;主机A与主机B能互相通信&#xff0c;但是A不能ping通RA的F0接口&#xff0c;这是为什么&#xff1f;RA上f0接口上配置了ACL&#xff0c;禁止源ip为主机A&#xff0c;目的ip为RA f0的数据包的发送&#xff1b; 第一个路由器上只有到主机B网段的路由&#…

MFCCA多通道多说话人语音识别模型上线魔搭(ModelScope)

实验室研发的基于多帧跨通道注意力机制&#xff08;MFCCA&#xff09;的多说话人语音识别模型近日上线魔搭&#xff08;ModelScope&#xff09;社区&#xff0c;该模型在AliMeeting会议数据集上获得当前最优性能。欢迎大家下载。开发者可以基于此模型进一步利用ModelScope的微调…

【Python】文本转语音库pyttsx3

一、语音输出 1、安装文本转换语音库pyttsx3 安装指令&#xff1a; pip install pyttsx3 2、导入pyttsx3库后&#xff0c;调用speak函数即可进行语音播放。 import pyttsx3 #语音播放 pyttsx3.speak("How are you?") pyttsx3.speak("I am fine, thank yo…

成都欢蓬电商:抖音直播卖药灰度测试通告

据报道&#xff0c;近日有MCN机构透露&#xff0c;目前抖音直播卖药为“测试项目&#xff0c;谨慎试跑中”; “仍处于灰度测试&#xff0c;至于测试多久&#xff0c;抖音官方确实没有答复&#xff0c;需要看第一阶段数据&#xff0c;然后定夺&#xff0c;预计4月份会纳入更多机…

第八章《嵌入式系统原理与实践》--沈建华 王慈 清华大学出版社 课后部分习题个人答案

第八章 1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;6&#xff0c;7&#xff0c;9&#xff0c;12 1 什么是串行通信、并行通信&#xff1f; 按一次传输数据位个数区分 串行通信并行通信是数据是一位一位地由端口发送或接收数据的各个数据位&#xff08;一般为 8 位…

「TCG 规范解读」初识 TPM 2.0 库续二

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…

手写一个文件上传demo

背景 最近闲来无事&#xff0c;同事闻了一下上传文件的基本操作&#xff0c;如何用文件流来实现一个文件的上传功能 基本概念 流&#xff08;Stream&#xff09;是指在计算机的输入输出操作中各部件之间的数据流动。可以按照数据传输的方向&#xff0c;将流可分为输入流和输出…

Vue3:有关v-model的用法

目录 前言&#xff1a; 回忆基本的原生用法&#xff1a; 原生input的封装&#xff1a; 自定义v-model参数&#xff1a; 对el-input的二次封装&#xff1a; 多个v-model进行绑定: v-model修饰符&#xff1a; v-model自定义参数与自定义修饰符的结合&#xff1a; 前言&am…

Java 网络编程 Ⅰ

目录基础知识IP 和 Portinternet&#xff08;互联网&#xff09;Java UDP 编程UDP&#xff08;User Datagram Protocol&#xff09;&#xff1a;无连接无状态的数据报通讯协议实现Java TCP 编程TCP&#xff08;Transmission Control Protocol&#xff09;&#xff1a;面向连接的…

XSS注入进阶练习篇(三) XSS原型链污染

XSS原型链污染1.原型链的概念1.1 构造函数的缺点1.2 prototype 属性的作用1.3 原型链1.4 constructor属性1.5 prototype和__proto__2. 原型链污染2.1 原型链污染是什么&#xff1f;2.2 原型链污染的条件2.3 原型连污染实例2.3.1 hackit 20182.3.2 challenge-04223.总结1.原型链…

Java跳槽涨薪之路-想学Java的赶紧上车了

前言Java 是近 10 年来计算机软件发展过程中的传奇&#xff0c;在很多开发者心中的地位可谓“爱不释手”&#xff0c;与其他一些计算机语言随着时间的流逝影响也逐渐减弱不同&#xff0c;Java 随着时间的推移反而变得更加强大。按应用范围&#xff0c;Java 可分为 3 个体系&…

【Unity3D】空间和变换

1 空间 1.1 左右手坐标系及其法则 1.1.1 左右手坐标系 左手坐标系与右手坐标系Unity 局部空间、世界空间、裁剪空间、屏幕空间都采用左手坐标系&#xff0c;只有观察空间采用右手坐标系。 左右手坐标系除了坐标系朝向&#xff08;旋向性&#xff09;不同&#xff0c;还存在以…

顶象APP加固的“蜜罐”技术有什么作用

目录 蜜罐有很多应用模式 蜜罐技术让App加固攻守兼备 顶象端加固的三大功能 为了捕获猎物&#xff0c;猎人会在设置鲜活的诱饵。被诱惑的猎物去吃诱饵时&#xff0c;就会坠入猎人布置好的陷阱&#xff0c;然后被猎人擒获&#xff0c;这是狩猎中常用的一种手段。在业务安全防…

自动化测试框架设计

大数据时代&#xff0c;多数的web或app产品都会使用第三方或自己开发相应的数据系统&#xff0c;进行用户行为数据或其它信息数据的收集&#xff0c;在这个过程中&#xff0c;埋点是比较重要的一环。 埋点收集的数据一般有以下作用&#xff1a; 驱动决策&#xff1a;ABtest、漏…

华为OD机试用Python实现 -【微服务的集成测试】(2023-Q1 新题)

华为OD机试300题大纲 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 OD 清单查看地址:blog.csdn.net/hihell/category_12199275.html 华为OD详细说明:https://dream.blog.csdn.net/article/details/128980730 微服务的集成测试…

信号的运算与变换

目录 前言 本章内容介绍 信号的运算与变换 相加 相乘 时移 反折 尺度变换 微分&#xff08;差分&#xff09; 积分&#xff08;累加&#xff09; 信号的奇偶求解 信号的实虚分解 合适的例题 1、时移反折 2、时移尺度 3、时移反折尺度 4、反求x(t) 前言 《信号…

gma 1.1.3 (2023.02.22) 更新日志

&#xff08;实际版本日期&#xff1a;2023.02.14&#xff09; 重要更新&#xff1a; 从本版本开始&#xff0c; gma 开始支持 Python 3.11&#xff01; 新增&#xff1a; 1、map 增加【AddDataSetDiscrete】添加离散型栅格数据集绘制功能。 2、math a、添加 Stretch 数据…

2023年PMP考试应该注意些什么?

首先注意&#xff08;报考条件&#xff09; 2023年PMP考试报名流程&#xff1a; 一、PMP英文报名&#xff1a; 英文报名时间无限制&#xff0c;随时可以报名&#xff0c;但有一年的有效期&#xff0c;所以大家尽量提前报名&#xff0c;在英文报名有效期内进行中文报名。 英…