ClickHouse为什么这么快(二)SSE指令优化

上一篇 ClickHouse为什么这么快(一)减少数据扫描范围 我们说到了ClickHouse中使用列存储,每个列都单独存储为一个文件,每个文件都是由一个或多个数据块组成,也就是说:每个文件由一个或多个数组组成,这篇博客就说一说如何使用SSE指令优化在数组上的查询。

问题:为了让性能对比更加明显,我们假定有一个表tab02包含一个uint8类型的列col,完成以下查询:

SELECT count(col) FROM tab02 WHERE col > 0

 由于col的数据存储为一个数组,我们可能会写出如下的代码:

size_t total1 = 0;
for (size_t i = 0; i < TotalCnt; i++)
{if (pData[i] > 0){total1++;}
}

每次循环对一个数进行比较,当满足条件时让统计变量自增1,最后输出统计的变量值即可。这样可以完成任务。

但是,有没有更高性能的实现方法: 当然有,那就是可以一次对多个数进行操作的SSE指令集,在这个对比测试中我们用到了:_mm_setzero_si128,_mm_loadu_si128,_mm_cmpgt_epi8,_mm_movemask_epi8,_mm_popcnt_u32 如果需要运行测试程序请确认你的CPU支持 SSE2和SSE4.2 指令集(确认方法请自行百度)。

对应的实现代码如下:

const size_t SIMD_BYTES = 16;
size_t total2 = 0;
const __m128i zero16 = _mm_setzero_si128();
for (size_t i = 0; i < TotalCnt; i += SIMD_BYTES)
{int mask = _mm_movemask_epi8(_mm_cmpgt_epi8(_mm_loadu_si128(reinterpret_cast<const __m128i*>(pData + i)), zero16));total2 += _mm_popcnt_u32(static_cast<uint32_t>(mask));
}

每个函数的详细的功能介绍请自行百度,这里仅介绍执行逻辑:

执行过程:每次执行对pData中的16个数与zero16中对应位置的数进行比较,如果pData中的数大于zero16中对应位置的值则得1,否则得0;接着将每个比较结果转换为一个bit(也就是mask的值);最后计算mask值中bit为1的数量,也就是这16条数据中满足条件的数量。

在这个方案中:一次能对16个数进行比较,执行循环的次数仅为前一个实现的1/16,在我的测试中,后面的实现耗时大约只有前面实现耗时的1/8。

在ClickHouse中大量使用SSE指令集优化性能,具体的使用场景请参考源码。这里仅仅是实现了一个性能差别最大的示例来展示SSE指令优化的执行过程。

测试程序在Windows下VS2019编译执行,完整代码如下:

#include <iostream>
#include <Windows.h>
#include <emmintrin.h>
#include <nmmintrin.h>int main(int argc, char* argv[])
{const size_t TotalCnt =  1024 * 1024;const size_t SIMD_BYTES = 16;LARGE_INTEGER bgTest1, edTest1, bgTest2, edTest2;uint8_t* pRaw = new uint8_t[TotalCnt + SIMD_BYTES];size_t curMod = reinterpret_cast<uintptr_t>(pRaw) & (SIMD_BYTES - 1);uint8_t* pData = pRaw + (curMod == 0 ? 0 : SIMD_BYTES - curMod);for (size_t i = 0; i < TotalCnt; i++){pData[i] = rand() % 10;}QueryPerformanceCounter(&bgTest1);size_t total1 = 0;for (size_t i = 0; i < TotalCnt; i++){if (pData[i] > 0){total1++;}}QueryPerformanceCounter(&edTest1);QueryPerformanceCounter(&bgTest2);size_t total2 = 0;const __m128i zero16 = _mm_setzero_si128();for (size_t i = 0; i < TotalCnt; i += SIMD_BYTES){int mask = _mm_movemask_epi8(_mm_cmpgt_epi8(
_mm_loadu_si128(reinterpret_cast<const __m128i*>(pData + i)), zero16));total2 += _mm_popcnt_u32(static_cast<uint32_t>(mask));}QueryPerformanceCounter(&edTest2);std::cout << "Test1 耗时:" << edTest1.QuadPart - bgTest1.QuadPart 
<< ", total1:" << total1 << std::endl;std::cout << "Test2 耗时:" << edTest2.QuadPart - bgTest2.QuadPart 
<< ", total2:" << total2 << std::endl;system("pause");return 0;
}

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

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

相关文章

3分钟阅读100篇文献?GPT可以做到!

摘要和背景 PPMAN-AI 01 在开始深入阅读之前&#xff0c;了解文献的主题和背景是非常重要的。这可以帮助你快速判断该文献是否符合你的研究需求。 prompt&#xff1a; 请简述文献[文献标题]的摘要。 解释文献[文献标题]中提到的研究背景。 文献[文献标题]的主要研究目的是什…

WordPress块编辑器(Gutenberg古腾堡)中如何添加脚注?

WordPress默认自带的块编辑器​&#xff08;Gutenberg古腾堡编辑器&#xff09;本身就自带添加脚注功能&#xff0c;不过经典编辑器不行。如果想要在WordPress中添加更加专业的脚注&#xff0c;建议使用Modern Footnotes插件&#xff0c;具体介绍及使用请参考『WordPress站点如…

【计算机图形】几何(Geometry)和拓扑(Topology)

目录 参考文献三维实体建模内核CSG/BREPParasolid简介Parasolid接口函数Parasolid类的结构 Parasolid数据分类&#xff1a;几何(Geometry)和拓扑(Topology)拓扑(Topology)什么是“拓扑”呢&#xff1f;Principle Geometry- Topology - Construction Geometry案例&#xff1a;拓…

ElementUI Form:Switch 开关

ElementUI安装与使用指南 Switch 开关 点击下载learnelementuispringboot项目源码 效果图 el-switch.vue 页面效果图 项目里el-switch.vue代码 <script> export default {name: el_switch,data() {return {value: true,value1: true,value2: true,value3: 100,value…

MFC串行化的应用实例

之前写过一篇MFC串行化的博文;下面看一个具体例子; 新建一个单文档应用程序;在最后一步,把View类的基类改为CFormView; 然后在资源面板编辑自己的字段; 然后到doc类的头文件添加对应变量, public:CString name;int age;CString sex;CString dept;CString zhiwu;CStrin…

蓝桥杯2024/1/31----第十届省赛题笔记

题目要求&#xff1a; 1、 基本要求 1.1 使用大赛组委会提供的国信长天单片机竞赛实训平台&#xff0c;完成本试题的程序设计 与调试。 1.2 选手在程序设计与调试过程中&#xff0c;可参考组委会提供的“资源数据包”。 1.3 请注意&#xff1a; 程序编写、调试完成后选手…

JAVA Web 学习(二)ServLet

二、动态web 资源开发技术——Servlet Servlet&#xff08;小服务程序&#xff09;是一个与协议无关的、跨平台的Web组件&#xff0c;由Servlet容器所管理。运行在服务器端&#xff0c;可以动态地扩展服务器的功能&#xff0c;并采用“请求一响应”模式提供Web服务。 Servlet的…

将java对象转换为json字符串的几种常用方法

目录 1.关于json 2.实现方式 1.Gson 2.jackson 3.fastjson 3.与前端的联系 1.关于json JSON是一种轻量级的数据交换格式。它由Douglas Crockford在2001年创造。JSON的全称是JavaScript Object Notation&#xff0c;它是一种文本格式&#xff0c;可以轻松地在各种平台之间传…

C#学习笔记_类(Class)

类的定义 类的定义是以关键字 class 开始&#xff0c;后跟类的名称。类的主体&#xff0c;包含在一对花括号内。 语法格式如下&#xff1a; 访问标识符 class 类名 {//变量定义访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;访问标识符 数据类型 变量名;......//方…

正则表达式与文本三剑客

目录 一、正则表达式 1. 定义 2. 字符匹配 3. 重复限定符 4. 位置锚点 5. 分组和引用 6. 扩展正则表达式 二、文本三剑客 1. grep 1.1 定义 1.2 语法 1.3 选项 1.4 示例 2. sed 2.1 定义 2.2 通式 2.3 选项 2.4 脚本格式&#xff08;脚本语法&#xff09; 2.…

【Unity3D小功能】Unity3D中Text使用超链接并绑定点击事件

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中遇到了要给Text加超链接的需求&#xff0c;研究了实现…

什么样的评论更容易得到别人的关注

要发表吸引人的评论&#xff0c;可以注意这些个方面&#xff1a; 合适的软件&#xff1a;用DT浏览器的笔记本写文本&#xff0c;保存为图片&#xff0c;用图片的方式评论更容易得到别人的关注。 特别的观点&#xff1a;发表与众不同的观点&#xff0c;或者从不同的角度看待问…

WiFi基础知识介绍(超详细)

1.WiFi专业名词概念 AP(Access Point):无线接入点&#xff1a;这个概念特别广&#xff0c;在这里&#xff0c;用大白话说&#xff0c;你可以把CC3200当做一个无线路由器&#xff0c;这个路由器的特点不能插入网线&#xff0c;没有接入Internet&#xff0c;只能等待其他设备的链…

canvas自定义扩展方法:文字自动换行

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

Websocket基本用法

1.Websocket介绍 WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并进行双向数据传输。 应用场景&#xff1a; 视频弹幕网页聊天体育实况更新股票基金…

基于OpenCV的高压电力检测项目案例

一、项目背景与目标 随着高压电力设施的日益增多&#xff0c;传统的巡检方式已无法满足现代电力系统的需求。为此&#xff0c;我们决定利用计算机视觉技术&#xff0c;特别是OpenCV库&#xff0c;开发一个高压电力检测系统。目标是实现自动化、高精度的电力设备检测&#xff0c…

P1228 地毯填补问题(葬送的芙蓉王【bushi】)

地毯填补问题 题目描述 相传在一个古老的阿拉伯国家里&#xff0c;有一座宫殿。宫殿里有个四四方方的格子迷宫&#xff0c;国王选择驸马的方法非常特殊&#xff0c;也非常简单&#xff1a;公主就站在其中一个方格子上&#xff0c;只要谁能用地毯将除公主站立的地方外的所有地…

Redis -- String 字符串, 计数命令,字符串操作

"学如逆水行舟&#xff0c;不进则退。" 目录 Redis的String字符串 常见命令 set get mget mset setnx setex psetex 计数命令 incr incrby decr decrby incrbyfloat 字符串操作 append getrange setrange strlen 小结 string内部编码 Redis…

文生图提示词:自然景观

场景描述 --自然景观 Natural Landscapes 涵盖了多种自然景观&#xff0c;可以用于精确地表达 AI 生成图像中所需的自然环境。 Mountain 山脉 River 河流 Forest 森林 Beach 海滩 Ocean 海洋 Lake 湖泊 Waterfall 瀑布 Desert 沙漠 Valley 山谷 Meadow 草地 Glacier 冰川 Cliff…

springboot137欢迪迈手机商城设计与开发

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…