TDengine 3.2.3.0 集成英特尔 AVX512!快来看看为你增添了哪些助力

在当今的 IoT 和智能制造领域,海量时序数据持续产生,对于这些数据的实时存储、高效查询和分析已经成为时序数据库(Time Series Database,TSDB)的核心竞争力。作为一款高性能的时序数据库,TDengine 不仅采用了先进数据处理算法,还在 3.2.3.0 版本引入了英特尔® AVX512 高级向量扩展指令集,实现并行处理数据,产品查询性能获得了进一步提升。本篇文章将深入介绍 TDengine 与 AVX512 集成的优化工作。

TDengine 与 AVX-512 集成原理

作为一种单指令多数据(Single Instruction Multiple Data,SIMD)指令集,英特尔® AVX-512 在密集型计算负载中有着得天独厚的优势。得益于其 512 位的寄存器宽度和两个 512 位的融合乘加(Fused Multiply Add,FMA)单元,该指令集能并行执行 32 次双精度、64 次单精度浮点运算,或操作 8 个 64 位和 16 个 32 位整数,极大地提升了数据的处理能力。

时序数据中存在大量相似数据,而 TDengine 对时序数据的处理流程是一致的。对于这些无前后依赖性的时序数据,采用 AVX512 并行处理数据可以显著提升系统性能。特别是在 TDengine 进行数据平均值查询时,由于符合数据并行化特点,引入 AVX512 技术可有效提升性能。

为了节省数据存储空间,TDengine 在数据存储前会进行编码处理,去除数据中的冗余,并进行压缩,从而使最终存储的数据占用空间大大减少。而数据平均值的查询过程则是相反的,需要对存储的数据进行解码和计算。如下图所示:

其中算法 Simple8B、ZigZag、Delta of Delta 可以通过 AVX512 进行优化。

  • Simple8B 的 AVX512 优化

如果要将相同长度的数据使用 Simple8B 存储在一个 64bit 空间中,例如每个有效数据占用 3bit,在 64bit 内,索引占用 4bit,剩下的 60bit 可以存储 20 个 3bit 的有效数据。在解码过程中,传统的方法是将每个有效的 3bit 数据逐个加载到 32bit 变量中,然后进行处理,这将需要进行 20 次处理。

而使用 AVX512 指令,可以一次并行将 8 个 3bit 的数据变换成 32bit 的数据,这样我们用很少的次数就可以处理完所有数据,大大提升了系统性能。如下图,payload 是 64bit 的 simple8B 数据,使用 AVX512 指令,通过并行同步移位和掩码的方式,一次提取出 8 个有效数据,并装载在 512bit 的寄存器里(32bit x 8),为 ZigZag 算法提供数据输入。

  • ZigZag 算法的 AVX512 优化

通过 AVX512 的指令,替代了之前的 8 次相同的循环操作,实现了一次并行处理 8 个数据,利用减法和移位异或操作,将数据还原成 ZigZag 编码前的数值。在优化后,只用了很少的 AVX512 指令,就实现了循环多次才能获得的结果,极大的减少了指令数,提升了系统的性能。

AVX512 的编译环境和运行环境

为了充分利用 AVX512 指令集,建议使用 gcc 版本 9 以上的编译器进行编译,以获得更完善的 AVX512 指令支持。在运行时,应检查 CPU 是否支持 AVX512 指令,只有在支持 AVX512 的 CPU 上运行 AVX512 指令,才能做到和其他非 AVX512 的 CPU 的代码兼容。

总而言之,通过利用英特尔® AVX512 高级向量扩展指令,TDengine 成功优化了数据处理算法,提升了时序数据库的性能。特别是针对 Simple8B 和 ZigZag 算法的优化,让时序数据的处理得以实现更高效的并行计算,通过一次性处理多个数据,减少了指令数,显著提升了系统的性能表现。

开启 AVX512 指令集优化以后,在 TDengine 新版本 3.2.3.0 上,解码整数类型数据的性能是软件解码性能的 1.82 倍,是 AVX2 指令集解码性能的 1.28 倍。这些优化措施也让 TDengine 在处理海量数据的查询和分析过程中更加高效,为实时应用场景提供了更强大的支持。

注:AVX指令集支持的开启,需要用户自己编译代码并打开配置开关。具体操作可以联系 TDengine 官方团队。

特别鸣谢:在本次 TDengine 与 AVX512 的优化集成工作中,英特尔数据中心与人工智能事业部的高级软件架构师蒋锴,凭借专业知识和技术能力,积极推动着优化工作的进展,为 TDengine 的发展贡献着重要的力量。


 

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

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

相关文章

Pandas数据分析:掌握agg()方法的高级应用“

今天一个知识点: agg() 方法的 func 参数可以传入单个函数或函数列表。 agg() 方法在Pandas库中用于对DataFrame或Series的列进行聚合操作。func 参数可以传入单个(值得注意的是,这里数据是一个单个而不是多个的内容,自己在这个…

【全开源】沃德会务会议管理系统(FastAdmin+ThinkPHP+Uniapp)

沃德会务会议管理系统一款基于FastAdminThinkPHPUniapp开发的会议管理系统,对会议流程、开支、数量、标准、供应商提供一种标准化的管理方法。以达到量化成本节约,风险缓解和服务质量提升的目的。适用于大型论坛、峰会、学术会议、政府大会、合作伙伴大会…

docker 安装达梦8

背景 X86-64架构使用Docker安装dm8_20240422_x86_rh6_64_rq_std_8.1.3.100_pack2.tar 1.下载Docker安装包 达梦官网下载dm8_20240422_x86_rh6_64_rq_std_8.1.3.100_pack2.tar安装包 快速下载通道: 达梦镜像包 2.将安装包上传至服务器,并加载镜像 拷…

结合人工智能的在线教育系统:开发与实践

人工智能(AI)正在革新各行各业,教育领域也不例外。结合AI技术的在线教育系统能够提供个性化的学习体验、智能化的教学辅助和高效的数据分析,从而大大提升教育质量和学习效果。本文将探讨结合AI技术的在线教育系统的开发与实践&…

如何调整C#中数组的大小

前言 数组存储多个相同类型的一种非常常用的数据结构。它长度是固定,也就是数组一旦创建大小就固定了。C# 数组不支持动态长度。那在C#中是否有方法可以调整数组大小呢?本文将通过示例介绍一种调整一维数组大小的方法。 方法 数组实例是从 System.Arr…

Type.GetTypeFromProgID 调用com组件

Type.GetTypeFromProgID 方法用于通过程序标识符(ProgID)获取 COM 类型。ProgID 是一个字符串标识符,用于标识 COM 组件。它通常在注册表中配置,并指向一个具体的 COM 类的 CLSID(类标识符)。 什么是 Prog…

【数据结构与算法】顺序查找、折半查找、分块查找

文章目录 顺序查找实现对有序表的顺序查找 二分查找(折半查找)实现二分查找判定树 分块查找(索引顺序查找)最理想的分块情况 顺序查找 顺序查找,又叫线性查找。适用于线性表。它的核心思路是从线性表的一端开始&#…

Unity的ScrollView滚动视图复用

发现问题 在游戏开发中有一个常见的需求,就是需要在屏幕显示多个(多达上百)显示item,然后用户用手指滚动视图可以选择需要查看的item。 现在的情况是在100个data的时候,Unity引擎是直接创建出对应的100个显示item。 …

13个行业数据分析指标体系如何建设100问

提供针对13个行业的数据分析指标体系的全面指南,涵盖各行业的关键指标和分析维度,帮助读者深入了解和构建有效的指标体系。以下是文章的主要内容: 电商行业数据指标体系:包括客户价值、商品、网站流量、整体运营、市场营销活动、市…

若依-前后端分离项目学习

第一天(6.24) 具体参考视频 b站 楠哥教你学Java 【【开源项目学习】若依前后端分离版,通俗易懂,快速上手】 https://www.bilibili.com/video/BV1HT4y1d7oA/?share_sourcecopy_web&vd_sourcecd9334b72b49da3614a4257…

C++如何实现继承和多态

继承 继承是指一个类&#xff08;子类&#xff09;从另一个类&#xff08;父类&#xff09;继承属性和方法。C支持单继承和多继承。 #include <iostream>// 基类&#xff08;父类&#xff09; class Animal { public:// 基类中的方法void eat() {std::cout << &q…

Elasticsearch Scroll 报错entity content is too long

2024-06-24 15:22:01:568 ERROR [task-31] (ScrollFetcherProduceAction.java:129) 访问ES出错org.apache.http.ContentTooLongException: entity content is too long [112750110] for the configured buffer limit [104857600]at org.elasticsearch.client.HeapBufferedAsync…

一下出来4个面试官,这是要舌战群儒啊

老张昨天下午请假了&#xff0c;我猜他就是面试去了。果不其然&#xff0c;今天来了&#xff0c;我问老张&#xff1a;昨天面试如何&#xff1f;老张很惊讶的问&#xff1a;你怎么知道我面试去了&#xff1f;我迫不及待的说&#xff1a;赶紧说说昨天面试的场景&#xff0c;给我…

智慧安防/边缘计算EasyCVR视频汇聚网关:EasySearch无法探测到服务器如何处理?

安防监控EasyCVR智能边缘网关/视频汇聚网关/视频网关属于软硬一体的边缘计算硬件&#xff0c;可提供多协议&#xff08;RTSP/RTMP/国标GB28181/GAT1400/海康Ehome/大华/海康/宇视等SDK&#xff09;的设备接入、音视频采集、视频转码、处理、分发等服务&#xff0c;系统具备实时…

Redis-事务-watch-unwatch

文章目录 1、监视key2、提交事务 1、监视key 打开两个窗口&#xff0c;第一个窗口先监视key&#xff0c;然后开始事务&#xff0c;然后再打开第二个窗口&#xff0c;修改balance为0 2、提交事务 此时事务被打断

playwright vscode 插件源码解析

Playwright vscode插件主要功能 Playwright是微软开发的一款主要用于UI自动化测试的工具&#xff0c;在vscode中上安装playwright vscode插件&#xff0c;可以运行&#xff0c;录制UI自动化测试。 playwright vscode插件主要包括两块功能&#xff0c;功能一是在Test Explorer中…

探索 Java 死锁:常见原因与解决方案

什么是死锁&#xff1f; 死锁是一种特殊的情况&#xff0c;发生在两个或多个线程彼此等待对方持有的资源&#xff0c;从而陷入无限等待的状态。具体而言&#xff0c;死锁通常涉及以下四个必要条件&#xff1a; 互斥条件&#xff1a;至少有一个资源被一个线程独占。持有并等待…

解决Microsoft Edge浏览器无法使用英文翻译功能

一、问题描述 原来我们使用的Microsoft Edge浏览器是可以对英文界面选择翻译为中文的&#xff1b;但是最近该浏览器更新过后右上角的翻译图标找不到了&#xff0c;无法翻译英文界面内容。 二、解决方法 2.1、打开浏览器的设置界面 2.2、选择语言 2.3、将首选语言下除中文外的…

【2024德国工作】蓝卡攻略:人在中国,怎么去德国工作?

德国工作签证解析 外国人只要拥有符合德国劳动法的劳动合同&#xff0c;工资符合当地标准&#xff08;非紧缺专业&#xff0c;税前工资一般需达到49600欧元&#xff09;&#xff0c;并且具备一定的外语能力&#xff0c;就可以申请德国境内工作签证&#xff01;不申请者还需要有…

【electron 5】electron将获取的Uint8Array转为中文

使用protobufjs&#xff1a; 安装&#xff1a; yarn add global protobufjs yarn add global protobufjs-cli// 将项目中的*.proto文件编译成json文件 npx pbjs -t json electron/main/proto/*.proto > electron/main/proto/proto.json可以在src/proto目录下生成一个proto.…