指令级并行(ILP)和线程级并行(TLP)的区别,GCC -O3优化会展开循环吗?
1. GCC 自动循环展开是怎么展开的?
当你使用 -O3
这样的优化选项时,GCC 会分析你的循环。如果它认为展开循环有利可图,它会做类似这样的事情(概念上的):
-
原始循环 (Conceptual C Code):
for (int i = 0; i < 100; i++) {sum += data[i]; // 循环体 }
-
GCC 自动展开4次后 (Conceptual Assembly/Intermediate Representation):
编译器会把代码转换成类似这样的逻辑(注意,这不是真正的 C 代码,只是为了说明):// 处理大部分数据,步长为4 for (int i = 0; i < 96; i += 4) { // 注意循环条件和步长改变sum += data[i]; // 第 1 次迭代的操作sum += data[i+1]; // 第 2 次迭代的操作sum += data[i+2]; // 第 3 次迭代的操作sum += data[i+3]; // 第 4 次迭代的操作 } // 处理剩余的迭代 (如果总次数不是4的倍数) - 这叫 "cleanup loop" 或 "epilogue" for (int i = 96; i < 100; i++) {sum += data[i]; }
关键点:
- 复制循环体: 编译器在生成的代码中(通常是汇编或更低级的中间表示)复制了原始循环体 N 次(这里是 4 次)。
- 修改循环控制: 循环的步长增加了(
i += 4
),循环的结束条件也相应调整了。 - 处理余数: 如果总迭代次数不能被展开次数整除,编译器通常会生成一个小的“扫尾”循环来处理剩下的几次迭代。
- 减少开销: 主要目的是减少循环控制指令(比如比较
i < 100
和跳转jmp
)的执行次数。原来执行 100 次比较和跳转,现在(在主循环里)只需要执行 96 / 4 = 24 次。
2. 汇编语言不是依次执行吗?怎么并行呢?
你说得很对,从程序员或者说从指令集的角度看,指令是按顺序排列的,程序的逻辑是顺序的。但是,现代 CPU 内部并不是严格按照这个顺序一次只执行一条指令的。这就是关键所在!
现代 CPU 为了提高效率,内部有很多复杂的机制,可以实现 指令级并行 (Instruction-Level Parallelism, ILP)。这主要通过以下几种方式:
- 流水线 (Pipelining): 就像工厂流水线一样,一条指令的执行过程被分解成多个阶段(如取指、译码、执行、访存、写回)。CPU 可以同时处理处于不同阶段的多条指令。比如,在执行指令 A 的同时,可以对指令 B 进行译码,对指令 C 进行取指。
- 超标量 (Superscalar): CPU 内部有多套执行单元(比如多个加法器、乘法器、加载/存储单元)。如果有多条指令可以同时执行(比如它们之间没有数据依赖关系),CPU 可以在同一个时钟周期内把它们派发到不同的执行单元上并行执行。
- 乱序执行 (Out-of-Order Execution): CPU 可以不按照程序代码中的顺序来执行指令。如果后面的某条指令不依赖于前面的指令,并且执行它的资源(执行单元)已经就绪,CPU 可能会先执行这条后面的指令,然后再回头执行前面的指令。当然,最终结果会按照程序顺序提交,保证逻辑正确性。
循环展开如何利用 ILP 实现“并行”:
当你展开循环后,原来分散在多次迭代中的独立操作现在被放在了一起。比如:
; 未展开 (简化示意)
loop:load data[i] -> reg1add sum, reg1 -> suminc icmp i, 100jl loop; 展开4次 (简化示意)
loop4:load data[i] -> reg1load data[i+1] -> reg2 ; <--- 可以和上一条 load 并发 (如果 CPU 支持)load data[i+2] -> reg3 ; <--- 可以和前两条 load 并发load data[i+3] -> reg4 ; <--- 可以和前三条 load 并发add sum, reg1 -> sum ; <--- 可能需要等待 reg1add sum, reg2 -> sum ; <--- 可能需要等待 reg2, 但可以和 add reg1 那条并行 (如果 CPU 支持)add sum, reg3 -> sum ; <--- ...add sum, reg4 -> sum ; <--- ...add i, 4 ; <--- 可以和其他 add 并行cmp i, 96jl loop4
在展开后的代码里:
- 多个
load
指令: 如果 CPU 有多个加载单元,并且内存带宽允许,这几条加载指令可能可以并行或流水线执行。 - 多个
add
指令: 虽然它们都修改sum
,可能存在依赖,但 CPU 的乱序执行和寄存器重命名等技术可能允许它们部分重叠执行,或者至少减少了串行依赖链的长度。更重要的是,它们与其他指令(如load
,add i, 4
)的并行机会增加了。 - 减少跳转: 最明显的好处是跳转指令大大减少,这有助于保持 CPU 流水线的“满载”状态,因为跳转指令往往会打断流水线。
所以,这里的“并行”指的是在一个 CPU 核心内部,利用其微架构特性(流水线、超标量、乱序执行)同时处理多条指令的能力,即指令级并行 (ILP)。
3. 指令级并行 (ILP) 和多核处理器的并行有什么区别?
这是一个非常重要的区别:
-
指令级并行 (ILP):
- 发生在哪里? 单个 CPU 核心内部。
- 并行的是什么? 单个程序(或线程)中的多条指令。
- 如何实现? 主要靠 CPU 硬件 (流水线、超标量、乱序执行) 自动完成,编译器优化(如循环展开、指令调度)可以帮助硬件更好地发挥 ILP 能力。
- 对程序员是否可见? 大部分情况下是透明的。程序员写的还是顺序代码,是 CPU 和编译器在幕后做了优化。
-
多核并行 (通常指线程级并行, Thread-Level Parallelism, TLP):
- 发生在哪里? 多个 CPU 核心之间。
- 并行的是什么? 多个线程或进程。每个核心可以独立运行一个(或多个,如果支持超线程)线程。
- 如何实现? 需要程序员显式地设计并行算法,并使用并行编程技术(如创建多线程 Pthreads,
std::thread
, 使用 OpenMP, MPI 等库或框架)来将任务分配到不同的核心上。操作系统负责调度这些线程到不同的核心。 - 对程序员是否可见? 非常可见。程序员需要主动编写并行代码,处理线程同步、数据共享等问题。
简单类比:
- ILP: 想象一个厨师(单核),他可以同时切菜(一个执行单元)、看火(另一个执行单元)、等水烧开(指令等待),非常熟练地同时处理多个步骤(指令)。循环展开就像把原本分四次做的“切菜、下锅”动作,变成一次性“切四份菜、依次下四个锅”,让厨师能更连贯、更并行地利用他的技能和厨具(执行单元)。
- TLP: 想象请了四个厨师(多核),每个人负责炒一道菜(一个线程)。他们可以真正同时独立地工作。你需要明确告诉每个厨师做什么菜(编程分配任务),并可能需要协调他们(线程同步)。
总结:
GCC 的 -O3
自动循环展开是通过在编译时复制循环体、修改循环控制来实现的。它并不会改变汇编指令顺序执行的基本逻辑,而是通过提供更多独立的指令给 CPU,让 CPU 内部的指令级并行 (ILP) 机制(流水线、超标量、乱序执行)能够更好地发挥作用,从而在单个核心内部实现指令的并发执行,提升速度。这与利用多个 CPU 核心来同时执行不同线程的多核并行 (TLP) 是完全不同的概念。
相关文章:
指令级并行(ILP)和线程级并行(TLP)的区别,GCC -O3优化会展开循环吗?
1. GCC 自动循环展开是怎么展开的? 当你使用 -O3 这样的优化选项时,GCC 会分析你的循环。如果它认为展开循环有利可图,它会做类似这样的事情(概念上的): 原始循环 (Conceptual C Code): for (int i 0; i …...
hadoop伪分布式模式
以下是 Hadoop 伪分布式模式(Pseudo-Distributed Mode)的环境搭建步骤。伪分布式模式下,Hadoop 的各个组件(如 HDFS、YARN、MapReduce)以独立进程运行,但所有服务均部署在单台机器上,模拟多节点…...
C++入门小馆: 模板
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
# 基于 Python 和 jieba 的中文文本自动摘要工具
基于 Python 和 jieba 的中文文本自动摘要工具 在信息爆炸的时代,快速准确地提取文本核心内容变得至关重要。今天,我将介绍一个基于 Python 和 jieba 的中文文本自动摘要工具,帮助你高效地从长文本中提取关键信息。 一、背景与需求 在处理…...
.NET平台用C#在PDF中创建可交互的表单域(Form Field)
在日常办公系统开发中,涉及 PDF 处理相关的开发时,生成可填写的 PDF 表单是一种常见需求,例如员工信息登记表、用户注册表、问卷调查或协议确认页等。与静态 PDF 不同,带有**表单域(Form Field)**的文档支持…...
Azure AI Foundry实战:从零开始构建智能应用
1. 引言 在人工智能快速发展的今天,如何高效地开发和部署AI应用已成为众多开发者和企业关注的焦点。微软的Azure AI Foundry应运而生,为AI应用开发提供了一站式解决方案。本文将带您深入了解Azure AI Foundry,并通过实战指南,帮助您从零开始构建智能应用。 2. Azure AI Found…...
YOLO视觉模型可视化训练与推理测试工具
推荐一款YOLO可视化训练测试工具: 对于yolo的训练,新手小白往往无从下手,本章推荐的这款工具可以非常轻易的帮您从模型训练到测试到部署。 下载地址http://www.voouer.com/yolo 可以点击此处跳转。 下载成功后打开这款工具,将会出现图形化界面,类似于下图所示: 当前页是可视…...
数据清洗的定义跟实际操作
数据清洗的定义 数据清洗(Data Cleaning) 是指对原始数据进行处理,以纠正、删除或填补不完整、不准确、重复或无关的数据,使其符合分析或建模的要求。数据清洗是数据预处理的关键步骤,直接影响后续分析和机器学习模型…...
如何用AI生成个人职业照/西装照?
一、核心工具推荐与对比 1. 搜狐简单AI • 特点: • 一键生成:上传1张生活照,AI自动生成职业照/西装照,支持商务精英、韩系女主等20模板。 • 自然微调:优化五官比例、柔化法令纹,保留个人特色࿰…...
Ecology中拦截jquery.ajax请求接口后的数据
功能:获取调用接口之后的数据在进行返回参数重写 首先ecology中一般直接看不到源码的,为什么知道是jquery.ajax请求呢,需要用到开发者工具 点开这里之后就能知道调用接口具体走的是什么逻辑然后返回值又做了哪些操作 一般来说,文…...
基于站点观测的中国1km土壤湿度日尺度数据集(2000-2022)
A 1 km daily soil moisture dataset over China based on in-situ measurement (2000-2022) 关键数据集分类地表参数数据集时间分辨率日空间分辨率1km - 10km共享方式开放获取数据大小592.76 GB数据时间范围 1999-12-31 — 2022-12-31 元数据更新时间2024-08-09 数据集摘要 …...
Django 自定义celery-beat调度器,查询自定义表的Cron表达式进行任务调度
学习目标: 通过自定义的CronScheduler调度器在兼容标准的调度器的情况下,查询自定义任务表去生成调度任务并分配给celery worker进行执行 不了解Celery框架的小伙伴可以先看一下我的上一篇文章:Celery框架组件分析及使用 学习内容ÿ…...
第 12 届蓝桥杯 C++ 青少组中 / 高级组省赛 2021 年 4 月 24 日真题
一、选择题 第 1 题 单选题 题目:在 C++ 中下列哪个不属于字符型常量 ( )。 A. ‘a’ B. ‘\x2A’ C. ‘@’ D. “F” 答案:D 解析:字符型常量使用单引号括起单个字符(如 A、C),或转义字符(如 B 中的十六进制转义字符)。D 选项 “F” 使用双引号,属于字符串常量,而…...
windows远程服务器数据库的搭建和远程访问(Mysql忘记密码通过Navicat连接记录解密密码)
服务器数据库的搭建和远程访问 mysql数据库安装(详细) window安装mysql详细流程 路程:重设MySQL5密码,发现远程服务器原本有一个MySQL5,尝试在服务器本地建立连接被拒绝,因为不知道密码。 (1…...
w~大模型~合集14
我自己的原文哦~ https://blog.51cto.com/whaosoft/13884560 #Attention as an RNN Bengio等人新作:注意力可被视为RNN,新模型媲美Transformer,但超级省内 , 既能像 Transformer 一样并行训练,推理时内存需求又不随 token 数…...
2025平航杯—团队赛
2025平航杯团队赛 计算机取证 分析起早王的计算机检材,起早王的计算机插入过USB序列号是什么(格式:1)分析起早王的计算机检材,起早王的便签里有几条待干(格式:1)分析起早王的计算机检材,起早王的计算机默认浏览器是什…...
5、SpringBoot整合RabbitMQ
5.1 工作队列模式 1、生产者 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</gro…...
深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning
深度学习论文: Describe Anything: Detailed Localized Image and Video Captioning Describe Anything: Detailed Localized Image and Video Captioning PDF: https://arxiv.org/pdf/2504.16072 PyTorch代码: https://github.com/shanglianlm0525/CvPytorch PyTorch代码: htt…...
Seata客户端@GlobalTransactional核心源码解析
文章目录 前言一、GlobalTransactional1.1、wrapIfNecessary1.2、handleGlobalTransaction1.3、invoke 二、总结 前言 Seata是阿里开源的分布式事务解决方案。在Spring传统的事务中,开启事务,执行事务,回滚/提交事务,统一由Spring…...
某大麦某眼手机端-抢票
引言 仅供学习研究,欢迎交流 抢票难,难于上青天!无论是演唱会、话剧还是体育赛事,大麦网的票总是秒光。作为一名技术爱好者,你是否想过用技术手段提高抢票成功率?本文将为你揭秘大麦手机端抢票的核心技术…...
深入探索ChatClient:简化AI模型交互的强大工具
深入探索ChatClient:简化AI模型交互的强大工具 前言 在人工智能飞速发展的当下,大语言模型(LLM)的应用越来越广泛。然而,构建基于LLM的应用程序并非易事,通常需要多个组件协同工作,如提示词模…...
AI 知识库:企业知识管理的利器
在数字化转型的今天,企业每天都会产生海量的信息和数据。从客户资料到内部文档,从市场调研到项目经验,这些宝贵的知识资源构成了企业的核心竞争力。然而,你是否注意到这样一个问题:很多企业在快速发展的同时࿰…...
【STM32实物】基于STM32的RFID多卡识别语音播报系统设计
演示视频: 基于STM32的RFID多卡识别语音播报系统设计 前言:本项目可实现多个电子标签IC卡RFID识别,刷卡识别后进行中文语音播报反馈,同时进行控制对应的灯光开关。以此也可扩展开发更多功能。 本项目所需主要硬件包括:STM32F103C8T6最小系统板、RFID-RC522模块、五个IC电…...
[实战] Petalinux驱动开发以及代码框架解读
目录 Petalinux驱动开发以及代码框架解读一、引言二、步骤2.1 创建PetaLinux工程2.2 配置硬件描述文件2.3 设备树配置2.4 建立驱动框架2.5 编辑 .bb 文件2.6 编写驱动文件2.7 编写 Makefile2.8 验证配方配置2.9 集成驱动到 RootFS2.10 全系统编译与部署2.11 启动验证 三、框架解…...
ArcGIS Pro几个小知识点分享
相信熟悉ArcGIS 10.X系统的朋友接触ArcGIS Pro或者QGIS的上手难度都很低,因此向大家分享我最近才注意到的一些ArcGIS Pro小的知识点或者注意事项等,用来查缺补漏。如果是GIS新手小白,建议先去了解GIS相关理论基础,再摸索GIS相关软…...
运维仙途 第1章 灵机突现探监控
第1章 灵机突现探监控 情节梗概 凌运维本是青云门杂役弟子,负责看守藏经阁灵脉枢纽。某日子夜,护山大阵突然灵力紊乱,阁中古籍无风自动。危急时刻,他意外触发祖师留下的「混沌钟」,获得观测灵脉状态的能力… 技术映…...
深入解析Java架构师面试:从核心技术到AI应用
深入解析Java架构师面试:从核心技术到AI应用 在互联网大厂的Java求职者面试中,技术深度和项目经验是成功的关键。本文以严肃的面试官与资深Java架构师马架构(拥有十年研发及架构设计经验)之间的对话为背景,详细展示了…...
Grounding DINO
论文标题: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 代码地址: GitHub - IDEA-Research/GroundingDINO: [ECCV 2024] Official implementation of the paper "Grounding DINO: Marrying DINO …...
MCP协议:自然语言与结构化数据的双向桥梁 ——基于JSON-RPC 2.0的标准化实践
MCP协议:自然语言与结构化数据的双向桥梁 ——基于JSON-RPC 2.0的标准化实践 一、MCP的本质:标准化共识的协议框架 MCP(Model Context Protocol)是Anthropic于2024年提出的开放通信协议,其核心价值在于建立自然语言…...
区块链+医疗:破解数据共享困局,筑牢隐私安全防线
在医疗健康领域,数据共享与隐私保护一直是一对难以调和的矛盾。一方面,分散在不同机构的医疗数据(如电子病历、检查报告、用药记录)阻碍了诊疗效率和科研进展;另一方面,患者隐私泄露事件频发,加…...
Arduino IDE中更新esp32 3.2.0版本的办法
在Arduino IDE中更新esp32-3.2.0版本是个不可能的任务,下载文件速度极慢。网上提供了离线的办法,提供了安装文件,但是没有3.2.0的版本。 下面提供了一种离线安装方法 一、腾讯元宝查询解决办法 通过打开开发板管理地址:通过在腾…...
关于 live555延迟优化之缓存区优化“StreamParser::afterGettingBytes() warning: read”” 的解决方法
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/146354088 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
毫米波通信的技术挑战与解决方案
毫米波通信的技术挑战与解决方案 随着5G技术的迅速发展,毫米波通信(Millimeter Wave, mmWave)作为一种具有巨大潜力的通信技术,正在成为实现超高速数据传输、低延迟和大规模连接的关键。然而,毫米波通信虽然在理论上具…...
软考中级-软件设计师 数据库(手写笔记)
基本概念 数据库分析设计过程 E-R模型 关系模式 关系模式相关名词和完整性约束和关系的三种类型 七种基本算法 并交查和笛卡尔积 投影选择和连接 题 规范化-函数依赖 求候选码 非规范化可能处于的问题 问题 题 关系-模型分解 事务管理 备份和恢复 数据仓库和数据挖掘...
Compose笔记(二十一)--AnimationVisibility
这一节主要了解一下Compose的AnimationVisibility,AnimatedVisibility 是 Jetpack Compose 里用于实现组件可见性动画效果的组件,借助它能让组件在显示和隐藏时带有平滑的过渡动画,从而提升用户体验。现总结如下: API 1. visible 含义:这是一…...
生物化学笔记:神经生物学概论05 感受野 视觉中枢 高级视皮层中的信息走向
信息传递中的“击鼓传花” 新特性的突现 功能柱:简化节点 高级视皮层中的信息走向...
记录idea可以运行但是maven install打包却找不到问题
解决idea使⽤maven多模块install报依赖模块的包找不到的问题 如果被依赖项⽬是springboot项⽬,那么可以把相关的springboot的东西移除掉,改造成普通项⽬。如果不想改造项⽬,那就添加部分的配置,因为springboot项⽬打包的时候会⽣…...
牛客:AB5 点击消除
链接:点击消除_牛客题霸_牛客网 题解: 利用栈,遍历输入的字符串,栈为空则入栈,栈不为空则去除栈顶字符和当前遍历到的字符比较,相等则栈顶字符出栈,当前遍历的字符也不入栈,不相等…...
vue3 动态修改系统title
vue3 动态修改系统title 修改前 修改后 1、封装 useTitle 工具函数 创建组合式 API,通过 watchEffect 监听标题变化: // composables/useTitle.js import { ref, watchEffect } from vue;export function useTitle(initialTitle) {const title r…...
产品经理.产品设计.产品设计工具
一、 产品经理常用工具 1. 业务流程图---系统流程图 业务流程图,面向用户调研,描述业务的流转和数据的处理要求,跟用户和业务方确认;---业务角色的泳道流程图。 系统流程图,面向产品需求设计, prd系描述各…...
kibana重建es索引
kibana如何重命名es索引名 背景 在初期设计es索引文档的时候考虑不是很周全,会多出很多无效字段。如果不删除或禁用对后续数据增量以及文档维护会有不良影响。 技术实现 使用 _reindex 1.执行Reindex # 复制旧索引数据到新索引 POST _reindex {"source&qu…...
windows系统常用快捷键(CMD常用命令,DOS常用命令)
Windows系统常用快捷键 Win E: 打开“文件资源管理器”(我的电脑)。Win S: 打开“搜索”功能,可以搜索文件、应用、设置等。Win I: 打开“设置”菜单,用于调整系统设置。Win X: 打开“快速链接”菜单,包含电源选项…...
使用 ossutil 上传文件到阿里云 OSS
在处理文件存储和传输时,阿里云的对象存储服务(OSS)是一个非常方便的选择。特别是在需要批量上传文件或通过命令行工具进行文件管理时,ossutil提供了强大的功能。本文将详细说明如何使用 ossutil 上传文件到阿里云 OSS,…...
专家访谈:从文本到视频,GEO多模态优化的实战法则
提问者:什么是生成引擎优化(GEO)?它与传统SEO的核心差异是什么? 源易GEO专家:生成引擎优化(GEO)是一种新兴策略,旨在提升内容在生成式AI引擎(如DeepSeek、…...
7.计算机网络相关术语
7. 计算机网络相关术语 ACK (Acknowledgement) 确认 ADSL (Asymmetric Digital Subscriber Line) 非对称数字用户线 AP (Access Point) 接入点 AP (Application) 应用程序 API (Application Programming Interface) 应用编程接口 APNIC (Asia Pacific Network Informatio…...
openEuler 22.03 安装 Redis 6.2.9,支持离线安装
目录 一、环境检查1.1 必要环境检查1.2 在线安装(有网络)1.3 离线安装(无网络) 二、下载Redis2.1 在线下载2.2 离线下载 三、安装Redis四、配置Redis服务五、开机自启服务六、开放防火墙端口七、常用命令 一、环境检查 1.1 必要环…...
Java架构师深度技术面试:从核心基础到分布式架构全解析
一场关于互联网大厂Java求职者的深度技术面试 在当今竞争激烈的互联网行业中,作为一名Java程序员,如何在众多候选人中脱颖而出显得尤为重要。本文通过一个完整的面试故事场景,以严肃的面试官和经验丰富的Java架构师马架构之间的问答形式&…...
你的项目有‘哇‘点吗?
你的项目有哇点吗? 刷了一下午招聘软件,发现没?大厂JD里总爱写有创新力者优先——可你们的简历,创新力还不如食堂菜单! 程序员写项目最大的误区:把创新当彩蛋藏最后!什么参与需求评审负责模块…...
RPG3.角色输入
流程: 需要创建原生的标签。 需要创建输入配置数据资产,通过这个资产,将标签映射到角色的唯一动作,通过输入的文本来识别应该做哪一个动作。需要创建自定义的输入组件。 需要绑定输入,创建不同的输入回调。 需要在…...
【python】-基础语法3
💖作者:小树苗渴望变成参天大树🎈 🎉作者宣言:认真写好每一篇博客💤 🎊作者gitee:gitee✨ 💞作者专栏:C语言,数据结构初阶,Linux,C 动态规划算法🎄 如 果 你 …...