关于SIMD

embedded/2024/10/22 9:52:41/

遇到太多次了,感觉还是有必要记一下

文章目录

  • 前言
    • 所谓SIMD
  • 一、SIMD是什么?
  • 二、内存对齐
  • 三、如何确保数据对齐?
  • 总结


前言

所谓SIMD

一、SIMD是什么?

SIMD(Single Instruction, Multiple Data)
SIMD 是一种并行计算方式,它通过单条指令同时对多个数据进行操作。SIMD 主要用于图形处理、科学计算、音视频处理等需要高效处理大量相似数据的场景。
SIMD 特指一个thread在一个core中ALU可进行向量计算
常见的 SIMD 类型指令集包括 Intel 的 SSE、AVX 和 ARM 的 NEON 等。

二、内存对齐

SIMD(Single Instruction, Multiple Data)运算方式通常要求严格的内存对齐,以确保高效的执行和避免性能问题。

为什么 SIMD 需要内存对齐?

  • 数据加载效率:SIMD 指令通常要求数据在内存中的地址是对齐的(例如 16 字节、32 字节对齐),因为处理器的 SIMD 寄存器通常是以这些对齐大小为单位的。
  • 避免性能损失:如果数据未对齐,处理器需要额外的加载指令来访问不连续的内存位置,这会导致性能下降。未对齐的数据访问可能会导致分成多个内存读取操作,增加开销。
  • 指令失败或崩溃:在某些处理器上,尝试对未对齐的数据进行 SIMD 操作会直接导致指令失败或程序崩溃。例如,某些旧的 SSE 指令在处理未对齐的数据时会触发硬件异常。

对齐的具体要求

SSE(Streaming SIMD Extensions):要求 16 字节对齐。
AVX(Advanced Vector Extensions):要求 32 字节对齐。
AVX-512:要求 64 字节对齐。
ARM NEON:通常要求 16 字节对齐。

三、如何确保数据对齐?

可以使用特定的内存分配函数,例如 std::aligned_alloc() 或 posix_memalign(),来分配对齐的内存。

编译器指令:使用编译器提供的指令或关键字,如 alignas(C++11 及以上)、attribute((aligned(16)))(GCC),来确保变量对齐。

对齐加载指令:现代 SIMD 指令集提供了对未对齐数据的特殊加载指令(如 _mm_loadu_ps),这些指令可以加载未对齐的数据,但性能可能低于对齐加载。


总结

尽管现代处理器的 SIMD 指令已经能处理未对齐的数据,但性能通常会显著下降。
理想情况下,数据的对齐能使 SIMD 运算以最优性能运行,因为所有数据块都能一次性加载到 SIMD 寄存器中进行并行运算。

SIMD 运算要求严格的内存对齐,以充分利用处理器的并行计算能力,提高执行效率,并避免额外的性能损失或潜在的指令失败。
在 SIMD 优化的程序中,确保数据对齐是关键的性能优化步骤。通过正确的内存分配方式和对齐指令,可以实现高效的 SIMD 运算。


http://www.ppmy.cn/embedded/108760.html

相关文章

977. 有序数组的平方(24.9.8)

题目 问题描述: 给你一个按非递减顺序排序的整数数组 nums,返回每个数字的平方组成的新数组,要求新数组也按非递减顺序排序。 示例 1: 输入:nums[-4,-1,0,3,10]输出:[0,1,9,16,100]解释:平方…

Python 内置的一些数据结构

文章目录 1. 列表 (List)2. 元组 (Tuple)3. 字典 (Dictionary)4. 集合 (Set)5. 字符串 (String) Python 提供了几种内置的数据结构来存储和操作数据,每种都有其独特的特点和用途。下面是一些常用的数据结构及其简要说明: 1. 列表 (List) 列表是一种可变…

基于多模态大语言模型的摄像头实时感知交互

简介: 调用本地摄像头,通过多模态大语言模型实时感知世界,并进行交互 界面: 代码: import tkinter as tk from tkinter import ttk from PIL import Image, ImageTk import cv2 import requests# 定义处理函数 def…

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管…

JDBC的API(DriverManager)基本了解

前言 本篇博客主要是了解,DriverManager的作用 简单的复习一下静态方法的特点 静态方法的特点 1 使用 static 静态修饰符,修饰方法 2 可以被类名直接调用 -------在这里 DriverManager 就是类名(类名都是大写的) 3 静态方法的调…

TCP通信—client与server

TCP client -> 1.初始化套接字 -> 2.连接 -> 数据收发 server -> 1.初始化套接字 -> 2.绑定 -> 3.监听 -> 4.接收客户端连接 -> 数据收发 client&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #inclu…

12C 新特性,MOVE DATAFILE 在线移动 包括system, 附带改名 NID ,cdb_data_files视图坏了

ALTER DATABASE MOVE DATAFILE 可以改名 可以move file&#xff0c;全部一个命令。 resue 可以重用&#xff0c;keep好像不生效&#xff01;&#xff01;&#xff01; system照移动不误-------- SQL> select file_name, status, online_status from dba_data_files where …

Flutter 中的低功耗蓝牙概述

随着智能设备数量的增加&#xff0c;控制这些设备的需求也在增加。对于多种使用情况&#xff0c;期望设备在需要进行控制的同时连接到互联网会受到很大限制&#xff0c;因此是不可行的。在这些情况下&#xff0c;使用低功耗蓝牙&#xff08;也称为 Bluetooth LE 或 BLE&#xf…