ValKey中使用SIMD指令优化bitcount命令
一、AVX/AVX2 的历史演进
随着计算机技术的飞速发展,数据处理需求呈指数级增长,SIMD(单指令多数据)技术应运而生。它通过一条指令同时处理多个数据元素,大幅提升计算效率,从早期的 MMX 技术起步,历经 SSE 系列的逐步完善,不断发展成熟。
2011年,英特尔推出 AVX(Advanced Vector Extensions)指令集,这是 SIMD 技术发展的重要里程碑。AVX 将寄存器宽度从 SSE 的128位扩展至256位,使处理器能够并行处理更多数据,极大地增强了并行计算能力,为高性能计算领域带来了重大突破,也为后续的技术演进奠定了坚实基础。
2013年,AVX2作为 AVX 的增强版本问世。AVX2 进一步扩展了整数指令集,新增了一系列乘法、除法等位操作指令,显著优化了整数运算性能;同时,它强化了数据读写机制,提升了内存访问效率,实现了计算性能的全方位升级。
二、AVX/AVX2 的原理剖析
(一)寄存器架构
AVX/AVX2的核心优势体现在256位YMM 寄存器上。相较于 128 位寄存器,YMM 寄存器的数据承载量翻倍。例如,在处理单精度浮点数时,存储量从 4 个提升至 8 个;对于整数数据的存储能力同样实现倍增,这为高效的数据并行处理提供了强大的硬件支撑。
(二)指令集特性
-
数据并行指令:AVX/AVX2 支持丰富的数据并行指令,涵盖算术运算、逻辑操作、移位运算等多个方面。单条指令即可同时处理8个单精度浮点数,相比传统指令执行方式,大幅提升了数据处理速度。
-
融合乘法累加(FMA)指令:AVX2 引入的 FMA 指令是一大亮点,它将乘法和累加运算合二为一,有效减少了指令执行周期。在科学计算、深度学习等对计算性能要求极高的领域,FMA 指令发挥着关键作用。
-
灵活的数据操作:AVX/AVX2 能够兼容整数、浮点数等多种数据类型,支持灵活的数据转换与对齐操作。这使其能够适配不同的内存访问需求,进一步优化数据读取效率,提升整体计算性能。
(三)数据处理流程
当执行 AVX/AVX2 指令时,数据首先从内存加载至256位 YMM 寄存器,一次可读取多个数据元素。随后,处理器根据指令类型,对寄存器中的数据进行并行运算处理。运算完成后,将结果写回内存或存储至其他寄存器。整个过程通过数据并行处理,极大地提高了计算资源利用率和数据处理效率。
三、AVX/AVX2 的广泛应用
(一)科学计算领域
科学计算常常涉及大规模的矩阵运算、数值模拟等复杂计算任务。AVX/AVX2 利用其并行指令特性,能够并行处理矩阵元素的乘累加运算。与传统的循环计算方式相比,计算效率得到显著提升。在气象预测、物理模拟等科研场景中,AVX/AVX2 加速了复杂计算过程,大幅缩短了科研时间,提高了科研效率。
(二)多媒体处理领域
音频、视频等多媒体数据具有数据量大、处理复杂度高的特点。在视频编解码过程中,AVX/AVX2 可以并行处理多个像素的变换、滤波等操作,实现视频的流畅播放和高效编码;在音频处理方面,AVX/AVX2 加速了滤波、混音等操作,有效提升了音频质量。
(三)深度学习领域
深度学习模型的训练和推理过程依赖大量的矩阵、向量运算。AVX/AVX2 的并行指令能够加速神经网络中的梯度计算和权重更新等关键操作。TensorFlow、PyTorch 等主流深度学习框架对 AVX/AVX2 进行优化后,在图像识别、语音识别等应用领域,模型的训练和推理速度得到大幅提升。
(四)数据压缩与解压缩领域
在数据存储和传输过程中,AVX/AVX2 能够加速 LZMA、Zstandard 等压缩算法的执行。通过并行处理数据,实现了快速的数据压缩和解压缩,显著缩短了数据存储和传输时间,提高了数据处理效率。
AVX/AVX2 作为先进的 SIMD 技术,在不断的发展演进中,凭借其独特的技术原理和强大的性能优势,在众多领域得到了广泛应用。随着技术的持续进步,AVX/AVX2 有望在更多领域发挥更大的作用,为计算机技术的发展和各行业的进步提供强大动力。
四、ValKey中的应用
以下代码通过使用 AVX2 指令集实现了一个高效的位计数(popcount)函数popcountAVX2
,用于计算给定内存区域中设置为 1 的位的总数。以下是对代码中如何应用 AVX2 的详细解释:
1. 定义目标架构属性
ATTRIBUTE_TARGET_AVX2
这行代码用于明确指定该函数针对 AVX2 架构进行优化,确保编译器生成适配 AVX2 指令集的机器码,从而充分发挥 AVX2 架构的性能优势。
2. 初始化和数据准备
long long popcountAVX2(void *s, long count) {long i = 0;unsigned char *p = (unsigned char *)s;long long bits = 0;/* clang-format off */const __m256i lookup = _mm256_setr_epi8(/* First Lane [0:127] *//* 0 */ 0, /* 1 */ 1, /* 2 */ 1, /* 3 */ 2,/* 4 */ 1, /* 5 */ 2, /* 6 */ 2, /* 7 */ 3,/* 8 */ 1, /* 9 */ 2, /* a */ 2, /* b */ 3,/* c */ 2, /* d */ 3, /* e */ 3, /* f */ 4,/* Second Lane [128:255] identical to first lane due to lane isolation in _mm256_shuffle_epi8.* For more information, see following URL* https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm256_shuffle_epi8 *//* 0 */ 0, /* 1 */ 1, /* 2 */ 1, /* 3 */ 2,/* 4 */ 1, /* 5 */ 2, /* 6 */ 2, /* 7 */ 3,/* 8 */ 1, /* 9 */ 2, /* a */ 2, /* b */ 3,/* c */ 2, /* d */ 3, /* e */ 3, /* f */ 4);/* clang-format on */const __m256i low_mask = _mm256_set1_epi8(0x0f);__m256i acc = _mm256_setzero_si256();
lookup
变量是一个__m256i
类型的向量,存储了一个查找表。通过这个查找表,可以快速获取每个字节中 1 的个数,为后续的位计数操作提供便利。low_mask
是一个全为0x0f
的向量,其作用是提取每个字节的低 4 位,以便进行后续的位计数计算。acc
是一个初始化为 0 的累加器向量,用于存储位计数过程中的中间计算结果。
3. 定义数据处理宏
/* Count 32 bytes per iteration. */
#define ITER_32_BYTES \{ \const __m256i vec = _mm256_loadu_si256((const __m256i *)(p + i)); \const __m256i lo = _mm256_and_si256(vec, low_mask); \const __m256i hi = _mm256_and_si256(_mm256_srli_epi16(vec, 4), low_mask); \const __m256i popcnt1 = _mm256_shuffle_epi8(lookup, lo); \const __m256i popcnt2 = _mm256_shuffle_epi8(lookup, hi); \local = _mm256_add_epi8(local, popcnt1); \local = _mm256_add_epi8(local, popcnt2); \i += 32; \}
_mm256_loadu_si256
:从内存中加载32字节的数据到__m256i
类型的向量vec
中,其中u
表示非对齐加载,这种方式可以灵活地从内存中读取数据。_mm256_and_si256
:将向量vec
与low_mask
进行按位与操作,分别提取每个字节的低4位和高4位,为后续的位计数查找做准备。_mm256_srli_epi16
:将向量vec
的每个16位元素右移4位,从而提取出每个字节的高4位。_mm256_shuffle_epi8
:根据lookup
表以及提取的低4位和高4位,查找每个字节中1的个数,并返回结果向量。_mm256_add_epi8
:将查找得到的位计数结果累加到local
向量中,实现位计数的累加操作。
4. 数据分块处理
/* Part A: loop unrolling, processing 8 * 32 bytes per iteration. */while (i + 8 * 32 <= count) {__m256i local = _mm256_setzero_si256();ITER_32_BYTESITER_32_BYTESITER_32_BYTESITER_32_BYTESITER_32_BYTESITER_32_BYTESITER_32_BYTESITER_32_BYTESacc = _mm256_add_epi64(acc, _mm256_sad_epu8(local, _mm256_setzero_si256()));}/* Part B: when the remaining data length is less than 8 * 32 bytes,* process 32 bytes per iteration. */__m256i local = _mm256_setzero_si256();while (i + 32 <= count) {ITER_32_BYTES;}acc = _mm256_add_epi64(acc, _mm256_sad_epu8(local, _mm256_setzero_si256()));#undef ITER_32_BYTES
- Part A:通过循环展开技术,每次处理8个32字节的数据块,充分利用 AVX2 的并行处理能力,提高指令执行并行度,加快位计数计算速度。
- Part B:当剩余数据长度小于8*32字节时,每次处理32字节的数据,确保对所有数据进行完整的位计数处理。
_mm256_sad_epu8
:计算两个向量对应元素的绝对差值之和,在这里用于将local
向量中的字节计数结果进行累加。_mm256_add_epi64
:将累加结果累加到acc
向量中,实现位计数结果的逐步汇总。
5. 结果提取和剩余数据处理
bits += _mm256_extract_epi64(acc, 0);bits += _mm256_extract_epi64(acc, 1);bits += _mm256_extract_epi64(acc, 2);bits += _mm256_extract_epi64(acc, 3);/* Part C: count the remaining bytes. */for (; i < count; i++) {bits += bitsinbyte[p[i]];}return bits;
_mm256_extract_epi64
:从acc
向量中提取64位整数,并累加到bits
变量中,将acc
向量中的位计数结果进行汇总。- Part C:对于剩余的字节,通过传统的数组查找方式(
bitsinbyte
数组)计算位计数,并累加到bits
中。最终,返回总的位计数结果,完成对给定内存区域中1的位总数的计算。
通过以上步骤,代码充分利用了 AVX2 指令集的向量处理能力,通过批量处理数据和循环展开技术,显著提高了位计数操作的效率。
五、优化效果
Value Size | QPS (After optimization) | QPS (Before optimization) | change |
---|---|---|---|
16 B | 114925 | 115924 | -0.8% |
256 B | 112619 | 112201 | +0.3% |
4 KB | 105523 | 96251 | +9.6% |
64 KB | 79723 | 36796 | +116% |
1MB | 21306 | 3466 | +514% |
CPU: AMD EPYC 9754 128-Core Processor * 8
OS: Ubuntu Server 22.04 LTS 64bit
Memory: 16GB
VM: Tencent cloud SA5.2XLARGE16
相关文章:
ValKey中使用SIMD指令优化bitcount命令
一、AVX/AVX2 的历史演进 随着计算机技术的飞速发展,数据处理需求呈指数级增长,SIMD(单指令多数据)技术应运而生。它通过一条指令同时处理多个数据元素,大幅提升计算效率,从早期的 MMX 技术起步࿰…...
leetcode114-二叉树展开为链表
leetcode 114 思路 用简单例子推导规律 不要一开始就看复杂的树,先从最简单的情况入手 案例一:只有一个节点 输入:1 输出:1不需要任何操作,直接返回 案例二:有两个节点 输入: 1/2输出&a…...
第七章 习题
1.给出下面表达式的逆波兰表示(后缀式): 3请将表达式-(ab)* (cd)-(abc)分别表示成三元式,间接三元式和四元式序列 四元式(Op,arg1,arg2,result) (,a,b,T1) (,c,d,T2) (*,T1,T2,T3) (uminus,T3,-,T4) (,a,b,T5) (,T5,c,T6) (-,T4,T6,r) 三元式 (op,arg1,arg2) (0) (,…...
Spring Ai Alibaba Graph实现五大工作流模式
Spring Ai Alibaba Graph实现五大工作流模式 概述 在 building-effective-agents 一文中,Anthropic将"智能体系统"(agentic systems),从架构层面分为 “工作流”(workflows)和 “智能体”(agents): 工作流…...
基于单片机的语音控制设计(论文)
摘要 自然语音作为人机交互在目前得以广泛的应用以及极大的发展前景。该设计介绍了基于非指定人语音芯片LD3320的语音控制器结构及其实现语音控制的方法。该语音控制器利用STM32F103C8T6单片机作为主要控制器,控制芯片对输入的进行语音识别并处理,根据语…...
【网络安全】从IP头部看网络通信:IPv4、IPv6与抓包工具 Wireshark 实战
从IP头部看网络通信:IPv4、IPv6与抓包工具 Wireshark实战 在网络安全分析和数据通信的世界中,一切都始于“数据包”。数据包是网络上传输的基本单位,而数据包的结构与内容,正是我们理解网络行为的核心。本文将带你深入了解 IP 协…...
计算机组成原理笔记(公众号版本)
1.MAR,存储单元和PC位数之间的关系 我们的MAR位数取决于我们的存储单元的个数; PC位数也是取决于我们的存储单元的个数; 假设我们是64个存储单元,我们的这个MAR实际上就是6位,因为这个2的6次方等于我们的64吗&#…...
CPM基本原理
CPM(连续相位调制,Continuous Phase Modulation )是一种恒包络,信号相位随时间连续变化的调制技术 。其优势显著,连续相位特性,频谱效率高,对带外辐射抑制好;相位平滑过渡࿰…...
浅谈开源在线客服系统与 APP 集成的技术方案与优劣势
在为移动端 App 接入在线客服系统的过程中,我经历了长时间的技术选型探索。最初,我也曾被一些“技术理想主义”选项所吸引,比如让用户自己研发界面我提供 API 以获得最高自由度,或集成 SDK 以追求原生体验。然而,随着项…...
AutoGPT,自主完成复杂任务
AutoGPT是一个开源的AI Agent项目,它的核心目标是让AI能够自主完成复杂任务,而不仅仅是回答单个问题。简单来说,它让AI具备了"自主思考和行动"的能力。 1. AutoGPT的核心概念 什么是AI Agent? AI Agent(智…...
基于Qt C++的影像重采样批处理工具设计与实现
摘要 本文介绍了一种基于Qt C++框架开发的高效影像重采样批处理工具。该工具支持按分辨率(DPI) 和按缩放倍率两种重采样模式,提供多种插值算法选择,具备强大的批量处理能力和直观的用户界面。工具实现了影像处理的自动化流程,显著提高了图像处理效率,特别适用于遥感影像处…...
Qt Windows平台调用ffmpeg动态库
本文基于QT6.8实测验证。 一、下载预编译库 从官方或第三方源获取FFmpeg的Windows动态库(Shared版本),解压后需包含以下目录: bin DLL文件(运行时依赖)include 头文件lib .lib或.dll.a链接…...
猿人学js逆向比赛第一届第十三题
一、分析请求 通过分析请求得知,本题目的参数为yuanrenxue_cookie,因为题目中中明说了是动态cookie,所以可以先删除这个cookie然后下脚本断点,简单分析看一下页面执行的js代码逻辑。 在经过这段代码的时候很明显的可以看到这里的有…...
React性能优化精髓之一:频繁setState导致滚动卡顿的解决方案
在开发一个 List 页面时,我们遇到了一个典型的React性能问题:页面在滚动时出现明显卡顿。这个问题的调试过程充满了误判和重新思考,最终发现了一个重要的性能优化原则。 问题现象 我们有一个监控仪表盘页面,包含多个图表组件。用…...
JavaScript 事件常用属性
一、事件对象基础 在事件处理函数中,浏览器会自动传入一个 event 对象,它包含了与事件相关的所有信息。 element.addEventListener(click, function(event) {// event 是事件对象 }); 二、常见事件属性 属性名 类型 描述 type String 事件类…...
配置自己的NTP 服务器做时间同步
✅ 推荐方案:使用 chrony 搭建 NTP 服务器(适用于 CentOS 7/8/9) chrony 是 CentOS 推荐的 NTP 实现,精度高、资源占用低、同步快,默认在 CentOS 8 中取代了 ntpd。 🔧 一、安装 chrony sudo yum install…...
基于深度学习的双色球智能预测系统:从原理到实现
需要源码的小伙伴可以在这里直接下载:基于深度学习的双色球智能预测系统:从原理到实现(完整代码训练数据)可直接运行-预测)资源-CSDN下载可直接运行,包括完整的训练测试数据,让你的双色球更准&a…...
STM32[笔记]--4.嵌入式硬件基础
4.嵌入式硬件基础 4.1认识上官二号开发板 主控芯片:STM32F103C8T6高速晶振:8M低速晶振:32.768kLED:5颗KEY:3个 主控芯片内部的资源如下项目介绍内核Cortex-M3Flsah64K*8bitSRAM20K*8bitGPIO37个GPIO,分别为PA0-PB15,PC13-PC15,PD0-PD1ADC2个12bitADC合计12了通道,外部通…...
Springboot项目中使用手机号短信验证码注册登录实现
文章目录 1. 功能概述2. 技术栈3. 实现步骤3.1 短信服务集成3.2 创建短信工具类3.3 验证码生成和存储3.4 控制器实现发送短信验证码手机号+验证码注册短信验证码登录3.5 服务层实现4. 前端实现4.1 API层4.2 手机号注册页面5. 最佳实践6. 总结本文将介绍如何在Spring Boot应用中…...
Python的GUI库选择指南(深度拓展)
前文我们分析了python的GUI库,有很多,面向应用场景也不尽相同,如何在使用过程中,选择合适的GUI库呢?可以查看:python有哪些常用的GUI(图形用户界面)库及选择指南-CSDN博客 初学者推…...
Kubernetes生命周期管理:深入理解 Pod 生命周期
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
JVM(12)——详解G1垃圾回收器
G1(Garbage-First)垃圾回收器。它是现代 Java 应用中默认的垃圾回收器(自 JDK 9 起),旨在提供一个高性能、可预测停顿时间(低延迟)的解决方案,尤其适合大内存(多GB甚至TB…...
Matplotlib vs Seaborn:选择与区别
相同点 都是Python数据可视化库:两者都用于创建统计图形和图表 基于Python生态系统:都与NumPy、Pandas等科学计算库良好集成 开源免费:两者都是开源项目,可自由使用 支持多种图表类型:都能创建折线图、柱状图、散点…...
TCP/UDP协议深度解析(一):UDP特性与TCP确认应答以及重传机制
🔍 开发者资源导航 🔍🏷️ 博客主页: 个人主页📚 专栏订阅: JavaEE全栈专栏 前言 在网络通信的世界里,传输层协议如同交通规则,决定了数据包如何从源头抵达目的地。其中UDP和TCP就…...
Linux线程概念及常用接口(1)
目录 1. Linux线程概念 什么是线程 线程的优点 线程的缺点 线程异常 线程用途 2. Linux进程VS线程 进程和线程 关于进程线程的问题 3. Linux线程控制 POSIX线程库 创建线程 线程ID及进程地址空间布局 线程终止 线程等待 为什么需要线程等待? 4. 分离线程 1. Linux线…...
Qt+OPC开发笔记(三):OPC客户端订阅特点消息的Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148868209 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
《美化生活》投稿简介
《美化生活》杂志是国家新闻出版署批准的正规期刊,是面向全国发行的文学艺术刊。本刊坚持“传播新理念,交流新经验”办刊方针,坚持“指导消费、丰富生活、美化心灵、雅俗共赏”的宗旨,以其丰富的内容,融学术性与技术性…...
如何为虚拟机上的 Manjaro Linux启用 VMware 拖放功能
如果你的Manjaro 发行版本是安装在 VMware Workstation Player 上使用的 ,而且希望可以通过拖放功能将文件或文件夹从宿主机复制到客户端的Manjaro 里面,那么可以按照以下的步骤进行操作,开启拖放功能。 在 VMware 虚拟机上安装 Manjaro 后&…...
VIVADO导出仿真数据到MATLAB中进行分析
VIVADO导出仿真数据到MATLAB中进行分析 目录 前言 一、导出仿真数据需要编写的RTL代码 二、MATLAB读入txt文件中的数据 三、需要注意的点 总结 前言 在使用 Xilinx Vivado 进行 FPGA 开发时,如何将 RTL 仿真生成的数据导出,进行进一步分析与可视化&…...
Harmony状态管理@Event
ArkUI Event装饰器:实现子组件向父组件通信的规范方式 概述 Event装饰器是ArkUI框架中用于规范组件间通信的重要工具,特别是在需要子组件向父组件请求更新Param变量的场景下。它通过回调机制实现数据的双向同步,是组件化开发中不可或缺的一…...
算力服务器选型
算力服务器选型需结合应用场景、算力需求及扩展性,核心要素如下: 应用定位: AI 训练 / 推理:优先高算力 GPU(如 NVIDIA A100、H100,或 RTX4090),搭配多核 CPU(如 Intel …...
基于目标驱动的分布式敏捷开发
研究结论 风险对项目目标的影响 时间目标:需求管理不当(如需求优先级不明确、多产品负责人需求冲突)、架构变更导致的返工、跨站点协调问题(如第三方依赖、通信基础设施不足)是影响项目时间的主要风险因素。质量目标&…...
大数据在UI前端的应用拓展:用户行为分析的深度挖掘
hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在当今数字化时代,大数据已成为推动各行业发展的核心动力之一。对于 UI 前端而言&…...
elk+filebeat收集springboot项目日志
目录 步骤 1: 安装和配置Elasticsearch 步骤 2: 安装和配置Logstash(可选) 步骤 3: 安装和配置Filebeat 步骤 4: 安装和配置Kibana 要使用ELK(Elasticsearch, Logstash, Kibana)堆栈和Filebeat来收集Spring Boot项目的日志&am…...
华为云Flexus+DeepSeek征文 | 华为云MaaS平台上的智能客服Agent开发:多渠道融合应用案例
华为云FlexusDeepSeek征文 | 华为云MaaS平台上的智能客服Agent开发:多渠道融合应用案例 🌟 嗨,我是IRpickstars! 🌌 总有一行代码,能点亮万千星辰。 🔍 在技术的宇宙中,我愿做永不…...
SQL关键字三分钟入门:UPDATE —— 修改数据
在数据库操作中,除了添加新记录外,我们还需要经常修改已有的记录。例如: 更新用户的个人信息;调整订单的状态;更改产品的价格。 这时候就需要用到 SQL 中非常基础但极其重要的关键字 —— UPDATE! 它是用…...
用Rust写平衡三进制加法器
1、三进制加法器的发展 最初的平衡三进制加法是采用了三选一结构(github原文),这位大佬也很厉害,他是硬件都弄了出来的,也写了虚拟机,甚至用这三态多路复用器弄出了可以存状态的硬件,但我没有去看了,因为当…...
【AI时代速通QT】第三节:Linux环境中安装QT并做测试调试
目录 引言 一、Linux QT开发环境的核心要素 1.1 编译器(g)与构建工具(make) 1.2 搞定 OpenGL 依赖 二、核心步骤——安装 Qt Creator 2.1 获取官方在线安装器 2.2 赋予文件执行权限 2.3 运行图形化安装向导 三、Linux上创…...
论文阅读:2025 arxiv Qwen3 Technical Report
https://arxiv.org/pdf/2505.09388 https://www.doubao.com/chat/9918384373236738 文章目录 论文翻译Qwen3技术报告摘要1 引言 论文翻译 Qwen3技术报告 Qwen团队 摘要 在这项工作中,我们介绍了Qwen模型家族的最新版本Qwen3。Qwen3包含一系列大型语言模型&…...
Vue3+el-table-v2虚拟表格大数据量多选功能详细教程
Vue3el-table-v2虚拟表格大数据量多选功能详细教程 本教程基于 Element Plus 组件库的 el-table-v2(假设你使用虚拟滚动表格),实现大数据量场景下的多选功能,并包含了全选、反选、已选行展示、清除选择等完整交互。 一、项目背景与…...
开源跨平台的轻量 C# 编辑器
NetPad一个基于.NET 开源、跨平台的 C# 编辑器,目的是创建一个开源的、支持 Web 的跨平台替代方案,从而为开发者提供便利的编程环境并为非 Windows 环境下的开发者提供一个可替代 LINQPad 的实用工具。它以.NET SDK 作为基础运行时环境,利用E…...
QT多线程
使用多线程的好处 假如当前窗口要进行一段非常复杂的逻辑处理,在单线程的情况下,是无法操控界面UI的,点击界面UI没有响应。此时就要用到多线程。 注意: 1、默认的线程在Qt中称之为窗口线程,也叫主线程,负…...
了解公共部门中的数据网格:支柱、架构和示例
作者:来自 Elastic Elastic Platform Team 想想那些像公共健康记录、城市规划模型等项目背后的所有数据。政府机构一直在产生大量数据。当数据分散在云平台、本地系统或像卫星和应急响应中心这样的专业环境中时,情况变得更加复杂。找到信息变得困难&…...
关于一维数组和字符串的详细讲解(从属于GESP三级)
本章内容 一维数组基础 字符串基础 就像打磨一串符号,每个位置都要精准对待,才能串起完整的风景。坚持下去,小细节终将成就大格局。 一、⼀维数组基础 1 📚 定义 典型写法 说明 易错/拓展 int a[5]; 编译期长度常量&#x…...
【驱动设计的硬件基础】PCI和PCI-E
打开电脑主机,你会看到主板上一排长短不一的插糟:矮胖的 PCI 插糟还插着古老的声卡,旁边细长的 PCI-E 插糟则牢牢卡住显卡、高速网卡等核心设备。这些看似普通的插糟,其实是计算机硬件沟通的 "高速公路",承载…...
【学习记录】Git Base使用-免密连接代码仓库
github(JL765)和gitee(JL765/git-test01)都可以用于管理代码 在windows中,可以通过Git Base软件(Git - Downloading Package)和仓库进行连接 下载略过 github登录 ssh -T gitgithub.com # 成…...
android脱糖
前言 另外一篇相关文章:https://androidblog.blog.csdn.net/article/details/148574130 通过sourceCompatibility 和targetCompatibility可以实现低版本写代码高版本输出(详情可查看我的另一篇文件中的:验证各种Java版本 > 一、纯Java项…...
DVWA Brute Force漏洞深度分析与利用指南
DVWA简介 DVWA(Damn Vulnerable Web Application)是一个基于PHP/MySQL的脆弱性Web应用平台,专为安全专业人员设计,用于测试技能和工具。它包含十大安全模块,其中Brute Force(暴力破解)是最基础…...
Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录
目录 🔧Docker 报错“x509: certificate signed by unknown authority”的排查与解决实录 📌 问题背景 🧪 排查过程 步骤 1:确认加速器地址是否可访问 步骤 2:检查 Docker 是否真的使用了镜像加速器 步骤 3&…...
采用ArcGIS10.8.2 进行插值图绘制
一、最终成果图展示 二、软件下载 链接: 百度网盘 请输入提取码 密码:azay 三、软件安装 1、在安装之前需要关闭电脑的防火墙及杀毒软件 设置-隐私和安全性-Windows安全中心-防火墙和网络保护 2、软件解压 (1)【ArcGIS_Desktop_1082_180......】“以管理员身份运行”…...