VLDB 2023 | 北大河图发布分布式训练神器Galvatron, 一键实现大模型高效自动并行...

article/2025/10/29 10:51:52

关注公众号,发现CV技术之美

本文转自机器之心。

北大河图团队提出了一套面向大模型的自动并行分布式训练系统Galvatron,相比于现有工作在多样性、复杂性、实用性方面均具有显著优势,论文成果已经被 VLDB 2023 接收

最近一段时间,「大模型」在 AI 领域的各种应用场景都大放异彩,其中基于 Transformer 的大规模预训练模型是最典型的大模型之一,已经成为了当前基础模型(Foundation Model)的核心架构。例如 NLP 领域的 BERT、GPT 系列,CV 领域的 ViT、Swin Transformer 系列,以及最近非常火热的多专家混合模型 MoE 以及多模态模型 CLIP 等等,都是以 Transformer 作为核心的基础架构。与之相应的,这类稠密大模型拥有着动辄数十亿、百亿甚至万亿规模的参数量,面临高昂的计算、存储、以及通信开销,也为 AI 基础设施带来了巨大的挑战。

为了支持大模型的训练,人们研发了很多工具(如 NVIDIA 提出的「威震天」Megatron,Microsoft 提出的 DeepSpeed,Meta 提出的 FairSeq 等等)来实现各种各样的并行方式,数据并行、张量模型并行、流水并行、分片数据并行等等。这些系统对上述并行方式提供了良好的封装,对外屏蔽相应的实现细节,使得用户能够通过添加配置的方式来实现混合并行策略。

基于上述思想,已经有很多工作围绕如何在张量或者算子层面表达各种并行方式进行探究,这类工作的 “自动化” 主要体现在并行 API 到执行层的转化过程。但是如果只是局限在设计并行 API 或者中间表达上,这种工程上的封装并没有从根本上解决分布式训练的问题。最直观的结果就是,用户仍然无法从分布式部署的难题中解放出来。实际上,大模型的分布式部署是一个非常复杂的问题,目前的绝大多数的分布式训练系统,都依赖用户人工反复尝试以及系统专家经验来进行部署,造成严重的资源利用效率低下的问题,与真正的 “自动并行” 存在相当大的差距。

基于此,北大河图团队提出了一款分布式训练神器 Galvatron,以实现大模型的高效自动并行,研究论文入选国际顶会 VLDB 2023。

1ee89870f8afe5bd8095db864c88a7f5.png

  • 论文地址:https://arxiv.org/abs/2211.13878

  • 项目代码链接:https://github.com/PKU-DAIR/Hetu/tree/main/tools/Galvatron

大模型自动并行到底难在哪里

研究者认为,大模型的自动并行之难主要体现在以下三个方面:

(1)多样性:首先,在并行方式方面,目前大模型的并行方式呈现出百花齐放的态势,即使是对于同一个算子,不考虑混合并行方式,不同的基础并行方式也会存在显著的差异,从而导致不同的内存开销、通信代价以及计算效率。下图展示了四种最主要的基础并行方式,即数据并行(Data Parallelism)、张量模型并行(Tensor Parallelism)、流水模型并行(Pipeline Parallelism)、分片数据并行 (Sharded Data Parallelism),在两张 GPU 上对于简单的矩阵乘法算子分布式执行的过程。

97e02009f12dbe7213cac57ce2112abe.png

并行方法对比示意图

其次,在模型方面,各种各样的模型架构最近也是层出不穷,这往往也伴随着不同的模型配置(例如不同输入序列长度,模型层数,模型隐层宽度等),从而造成计算负载上的差异。另外,在硬件方面,用户往往面临着非常差异化的集群环境,可能会面临不同的内存容量、通信带宽、计算能力等等。总体上来看,由于上述多样性的存在,没有哪种并行技术总是能够获得最佳训练效率,“自动并行” 也就成为了分布式训练的核心挑战。

(2)复杂性:上述分析还相对比较单一,实际上哪怕是对于同一个算子也可以同时应用多种不同的基础并行方式,如果考虑到由这些基础并行方式复合所构成的混合并行方式,则会导致问题变得非常复杂。更重要的是,大模型的计算图往往结构非常庞大,对应的也需要更大规模的集群,如果对每个算子都进行探索(包括选取集群中合适的计算资源以及设计相应的混合并行方式),会带来组合空间爆炸的问题,寻找整个模型的最优分布式执行方案变得难以求解。

(3)实用性:除此之外,实用性也是非常重要的问题。一方面,在进行自动并行搜索的过程中,对于各种分布式执行方案,必须提供比较精确的内存、通信、计算开销,否则会导致结果与实际执行偏差过大,产生次优解或者根本无法使用。为此,就需要非常精准的代价模型,对不同的模型结构和硬件条件进行建模。另一方面,系统提供自动并行能力所带来的额外时间开销必须在一个可以接受的范围内,过于高昂的搜索代价同样也无法接受。

分布式训练神器 Galvatron,一键实现大模型高效自动并行

系统特性:

为了解决上述问题,研究者们提出了一些系列工作来探索混合并行的自动搜索:一类工作主要讨论了同时考虑数据并行和模型并行的搜索空间,代表性工作包括 FlexFlow,Tofu,另一类工作则产生于流水并行场景,将其与数据并行相结合,代表性工作包括 PipeDream,DAPPLE。在此基础上还有一些衍生工作,如 Unity、Alpa,进一步扩展了自动并行的探索范围。北大河图团队提出的系统「惊破天」Galvatron 同样属于自动并行搜索的研究领域,但相比于现有工作,该系统主要拥有以下三方面优势:

(1)在多样性方面,现有工作能够支持的并行维度仍然比较有限,而 Galvatron 不仅可以支持更多的并行维度,并且面对更加差异化的 Transformer 模型结构也能够精准建模,以及在不同的集群硬件条件下验证了其自适应调优的能力。

94e3d6b4085621df82e0ddee2b24b167.jpeg

大模型分布式训练系统对比示意图

(2)在复杂性方面,由于具备在多样性上的优势,Galvatron 面临了前所未有的庞大搜索空间,为此,研究者探究了几条目前大规模分布式训练过程中的一些经过实验性或理论性验证的重要观察,作为搜索空间的剪枝准则,从而实现高效的分布式执行计划优化。

(3)在实用性方面,该研究结合了理论建模和实验测量两者的优势,实现对内存、通信、计算开销的精确估计,甚至考虑到了计算与通信重叠所导致的 GPU 执行效率下降问题,从而保证能够得到足够准确的自动并行优化结果。

另外,Galvatron 底层选择 PyTorch 作为执行引擎,兼容 Huggingface 等常见的主流 Transformer 模型实现,所以完全不会对 PyTorch 用户带来额外的使用负担;同时也不需要用户付出额外的系统安装或者调试代价,使用时只需要添加几行代码,就可以轻松完成自动并行的整个流程。

85666d635da9444bf8a0d64217a42d20.jpeg

Galvatron 工作流程及用户使用接口展示

关键技术

1. 基于决策树的搜索空间分解

Galvatron 的设计目标是高效地在复杂而庞大的并行策略空间内自动搜索,并为给定的 Transformer 模型和分布式环境生成最佳的并行执行计划。在搜索空间上,Galvatron 是业界首个考虑 4 种主流并行方法的自动并行训练系统,包括包括数据并行(data parallelism, DP)、分片数据并行(sharded data parallelism, SDP)、张量并行(tensor parallelism, TP)和流水并行(pipeline parallelism, PP)。由于混合并行策略会包含以上四种并行算法的任意组合,在多 GPU 的场景下这种组合带来的搜索空间十分庞大。例如,对于双机四卡场景,一种可行的策略是在机内使用 2-way TP,机间使用 2-way PP,另一种可行的策略是在机内使用 2-way PP,机间使用 2-way DP。当节点内 GPU 数量扩展到 8 卡时,模型每一层的候选策略都多达上百种。随着模型层数的增加,其搜索空间规模指数增长,难以有效探索。

为了高效地搜索如此庞大的搜索空间,该研究首先提出了以下观察作为指导:

  • Takeway#1:PP 倾向于被跨设备岛放置。此处 “设备岛” 指具有高内部带宽的一组设备,在绝大多数 Transformer 模型中,PP 的通信量相比于其它并行方式,显著更少。因此,人们通常优先对模型进行 PP 切分并放置于设备岛之间。

  • Takeway#2:在同构设备的前提下,并行策略倾向于将设备均匀切分。例如,对于 4 卡 GPU 的 2-way DP 倾向于将设备切分两组 2 卡的设备,而不是一组 1 卡和一组 3 卡的设备。在这种情况下,一个设备组内的最优混合并行策略与其他组内的最优策略保持一致。

  • Takeway#3:一般来说,在能够混合使用 DP 和 SDP 的情况下,只使用 SDP 在理论上性能更优。根据分析结果,N-way SDP 的通信开销和内存开销均优于bb511a1ad506927673edffb60104ceb7.jpegd494f707b66bc6768163b286937fd375.jpeg的组合,其中28df3bf54fc790416b4ab5b97c682bdd.jpeg

基于以上重要观察,该研究提出了一种基于决策树的搜索空间构建方法:

(1)给定一个 Transformer 模型,基于 Takeway#1 和 Takeway#2,Galvatron 首先用 PP 将模型切分成多个阶段,同时将设备均匀且连续地切分为多个设备组。例如 8 卡场景下,模型被切分为 1/2/4/8-way PP,分别对应设备组大小为 8/4/2/1。

(2)每种 PP 切分对应着一棵决策树及一个子搜索空间,决策树叶结点总数为设备组大小,决策树高度为可用的并行方法数量,即决策树每一层可应用一种并行策略。

(3)并行策略在决策树不同层间不可重复使用。

(4)非叶结点的度数默认在 2 的指数次幂 {2,4,8,…} 中选择。

基于以上决策树构建规则,Galvatron 构建的决策树能表示以上并行的任意组合。Takeway#1 和 Takeway#2 帮助 Galvatron 规避了低效的并行组合,缩小了搜索空间。对于 8 卡 GPU 训练一层模型的场景,以上规则将产出 34 种候选的混合并行策略。进一步,使用 Takeway#3 将 DP 和 SDP 同时出现在一棵决策树的情形剪枝后,8 卡候选策略数降至 22 种。

下图给出了 8 卡 GPU 场景不同 PP 并行度(8/4/2/1)下的决策树示意图。

9b216bd6582eb6bdf94bc688422a9ef4.png

8 卡 GPU 场景不同 PP 并行度(8/4/2/1)下的决策树示意图

2. 基于动态规划的并行优化算法

现有系统如 Megatron 或者 DeepSpeed 通常由用户指定全局并行方案及其对应的并行度,严重限制了对分布式执行计划的表达能力。Galvatron 的优化目标是在用户给定模型定义和分布式环境的情况下,无需用户指定任何并行配置,自动生成最优的分布式执行计划。具体来说,给定一个 L 层的模型 M 和内存容量为 E 的 N 个 GPU 设备,Galvatron 的优化目标是搜索得到最高的系统吞吐 T_pt 并返回对应的并行方案,这里的并行方案指以层(或算子)为基础单位的细粒度混合并行策略。

afae098a550b37f1f490e582e6d12d09.png

算法 1: Galvatron 优化过程

优化过程:Galvatron 的优化过程如算法 1 所示。Galvatron 最外层循环逐步增加搜索的 batch size 直到超出设备内存;给定每个候选 batch size B,Galvatron 首先根据 Takeaway#1 对模型进行 PP 切分并搜索不同的并行度 P(第 4 行),选定 P- way PP 后模型被切分为 P 个阶段(第 6 行),与之对应的所有设备被切分为 P 组,每组含有 N/P 个设备;接着 Galvatron 构建对应的决策树,其能不重不漏地表示出 DP、SDP、TP 的任意组合,从而获得策略集合 S;然后对于每个模型阶段 M_i,在设备内存限制 E 下,Galvatron 使用动态规划搜索得到其中每一层的最优混合并行策略并返回最小时间开销(第 9 行);最后,Galvatron 在所有可能的 PP 并行度和 batch size 中选择吞吐率最高的策略并返回(第 15 行)。

动态规划搜索:下面介绍 Galvatron 并行优化工作流中的动态规划搜索算法。对于一个给定的包含 L 层的模型阶段,用开销函数 C(L,E) 表示 L 层模型在设备内存限制 E 下的总执行时间,3e8dfd558e65d3be4ac70be41a264d87.jpeg表示第 L 层使用策略 S_j 的执行时间,其中策略 S_j 是并行策略候选集合 S 中的策略。设定初始值c1bea1cfc24e5af177091b7681aefade.jpeg,Galvatron 的动态规划搜索遵循以下状态转移方程(公式 1):

1f2750e6317facf8a833c7774e3cfc81.jpeg

其中,e4123f4ccddf05bf0d6baa6255ca1090.jpeg是第 L 层使用策略 S_j 的内存开销,a3ea053d7e74622a1983b4e7e1c495a1.jpeg是第 L 层使用策略 S_j、其前一层使用策略 S_i 带来的转换开销。在状态转移过程中,当内存开销超过设备内存限制设备内存限制 E,开销函数 C 返回无穷大。

复杂度分析:Galvatron 使用的动态规划搜索(公式 1)计算复杂度为 O(LE|S|)。可见,每一层的搜索空间 S 的大小对于整体搜索复杂度非常重要,Galvatron 提出的基于决策树的搜索空间分解能够显著减小搜索空间,控制搜索开销在合理范围内。

3. 基于混合建模的执行代价估计方法

Galvatron 使用一个策略开销估计模块来对混合并行策略的计算、通信、内存开销进行估计。现有的开销估计方法主要包括测量(profiling)和模拟(simulating)两种,Galvatron 吸取了两者的长处并设计了一种代价低廉、高效且准确的开销估计方法。具体来说,对于内存开销,Galvatron 使用张量的形状和数据类型来完成估计;对于计算时间,Galvatron 通过在单设备上通过 profiling 测量逐样本计算时间,结合 batch size 和拟合函数从而估计总体计算时间;对于通信时间,Galvatron 通过通信量除以设备通信带宽得到预估的通信时间,其中通信量由理论计算得到,通信带宽由 profiling 测量得到。

基于以上估计结果,Galvatron 通过 simulating 执行过程来计算给定层使用给定策略的开销 c(l,s)。和现有分布式训练系统的代价模型不同,Galvatron 在建模中首次考虑了计算和通信的重叠对 GPU 性能下降带来的影响。该研究通过实验发现,由于重叠导致的 GPU 性能下降会显著影响系统的执行效率,而这在以往的工作中都是被忽视的。因此,Galvatron 的开销估计更加准确,并行优化效果更佳。

实验结果

实验设置:在实验中,研究者将 Galvatron 和四种使用单一并行策略的基线系统(DP、SDP、TP、PP)以及专家设置的 DeepSpeed 3D Parallelism 进行对比,同时额外设置了两个弱化版本的 Galvatron 作为辅助基线,在有限的并行策略组合空间(即 TP+DP,PP+DP),展开自动并行搜索。该研究选用了 NLP Transformer 模型 BERT 和 T5,CV Transformer 模型 ViT 和 Swin Transformer 作为实验对象。

6fb28d91617e7c16bc8f06e692d764d9.jpeg

Galvatron 和基线系统在 8 GPUs 20G 显存下的吞吐对比情况

实验对比效果:该研究首先在八卡 Nvidia RTX TITAN 24GB 环境下进行了实验。实验表明,在不同模型规模和不同内存限制下,Galvatron 相比于总是取得最优的吞吐率,与现有的最先进的单一并行方法和混合并行方法相比,训练吞吐量均有显著提升。具体而言,在 ViT 模型上,Galvatron 相比于单一策略的吞吐率加速比最高可达 338%,相比于其他混合并行策略的吞吐量从加速比最高可达 55%;在其他三个模型上,Galvatron 相比于单一策略和现存的混合策略加速比最高可达 200%-334% 和 28%-52%。

c1848910ff1cfcdc76c4ccca52060f6c.jpeg

Galvatron 搜索得到的部分最优并行策略示意图

可解释性实验:该研究选取了一些由 Galvatron 搜索得到的最优并行策略进行展示。对于 BERT 模型在 8GB 情况下(Case A),Galvatron 选择了两种混合并行策略 PP-TP-DP 以及 PP-TP-SDP,而当可用显存增大到 12GB 时,Galvatron 放弃了 PP,选择使用更多的 DP,同时引入 SDP 来节省显存空间。在 Swin Transformer 上情况则稍有不同,该模型的不同层呈现出明显的异质性,当显存比较紧缺时(Case C),浅层 SDP 的并行度较高,随着层数加深,每层的激活变小,参数变多,所以 TP 逐渐取代 SDP。当显存增多时(Case D), 不仅重新启用了 PP 替代了一部分低效的 SDP,而且浅层倾向于使用 DP 的趋势更为明显。

可扩展性实验:该研究进一步在更大的集群上测试了 Galvatron,包括 16 卡 Nvidia RTX TITAN GPUs 的环境和 64 卡 Nvidia A100 GPUs 的环境。在 16 卡环境下,Galvatron 相比于其他策略依然拥有最高吞吐率,与相同内存限制的 8 卡实验结果相比,由于更加多样化的混合并行策略,Galvatron 在 16 卡上能获得超过 2 倍的加速比。在 64 卡实验中,Galvatron 的吞吐率同样是其他策略中最高的。这说明了 Galvatron 具有良好的可扩展性,详细结果可以参见论文原文。

北大河图团队简介

河图(Hetu)开发团队来自于北京大学数据与智能实验室(Data and Intelligence Research Lab at Peking Univeristy,以下简称:实验室),实验室由北京大学计算机学院崔斌教授带领,多年来主要在人工智能、大数据等领域进行前沿研究,在理论和技术创新以及系统研发上取得多项成果,已在国际顶级学术会议和期刊发表学术论文 100 余篇。

8a453cd383a384fd51b3dd911f2d9fe4.png

河图系统是一个面向超大模型的分布式深度学习系统,相比现有的老牌分布式深度学习框架,在系统功能性、系统复杂性和系统易用性上有诸多创新贡献,如自动分布式并行策略、一致性协议和通信架构、GPU 算子优化等方面。Hetu 团队目前已在多种分布式机器学习或深度学习场景下进行了学术创新,相关成果被 SIGMOD、VLDB、ICML、KDD 等国际顶级会议收录,其中稀疏大模型分布式训练系统 HET 荣获 VLDB 2022 最佳可扩展数据科学论文奖。本次被 VLDB 2023 录用的论文 Galvatron 则是河图团队在稠密大模型分布式训练场景上的又一突破成果,已经集成到 Hetu 系统并对外开源。目前,Hetu 团队已经与腾讯、阿里巴巴、快手、字节跳动等多家知名企业展开科研合作和应用落地。

2219b5e8c4a38a9767b3a7511079ae55.jpeg

END

欢迎加入「计算机视觉交流群👇备注:CV

d4cc43d5177c79520c913a1d80ec9efd.png


http://chatgpt.dhexx.cn/article/sy75pWmB.shtml

相关文章

Benchmarking Learned Indexes(VLDB2021)

最近学习索引结构的进步建议用近似学习模型来替代现有的索引结构,比如b树。在这项工作中,我们提出了一个统一的基准,它将三种已经学习过的索引结构的优化实现与几种最先进的传统基准进行比较。通过使用四个真实的数据集,我们证明了…

阿里云数据库再获学术顶会认可,一文全览VLDB最新亮点

一年一度的数据库领域顶级会议VLDB 2019于当地时间8月26日-8月30日在洛杉矶圆满落幕。在本届大会上,阿里云数据库产品团队浓墨登场,不仅有多篇论文入选Research Track和Industrial Track,为了进一步加深产学研学术交流,阿里云还在…

2019计算机研究生暑期学校,2019年度VLDB暑期学校

由CCF数据库专业委员会、VLDB中国数据库学院主办,中国人民大学信息学院与数据工程与知识工程教育部重点实验室承办的2019年度VLDB暑期学校(VLDB Summer School 2019)于2019年7月22日在中国人民大学信息楼报告厅隆重举行开班仪式。出席开班仪式的嘉宾有:中…

13 种高维向量检索算法全解析!数据库顶会 VLDB 2021 论文作者干货分享

编者按: 以图搜图、商品推荐、社交推荐等社会场景中潜藏了大量非结构化数据,这些数据被工程师们表达为具有隐式语义的高维向量。为了更好应对高维向量检索这一关键问题,杭州电子科技大学计算机专业硕士王梦召等人探索并实现了「效率和精度最…

Deep Upsupervised Cardinality Estimation 解读(2019 VLDB)

Deep Upsupervised Cardinality Estimation 解读(2019 VLDB) Deep Upsupervised Cardinality Estimation选择度(基数)估计问题定义选择度和数据联合分布的关系深度自回归模型如何计算joint distribution编码解码策略具体执行属性的…

VLDB 2021 COCO 论文阅读

Epoch-based Commit and Replication in Distributed OLTP Databases 记录一篇之前读过的论文。。。 整篇论文的核心在于Epoch,将传统数据库以事务为粒度提交和恢复变成了以Epoch为粒度来提交和恢复,这样做的好处就是可以减少2PC和同步复制的时间开销。…

【区块链论文整理】VLDB篇

VLDB (Very Large Data Base)是数据库三大顶会之一,近几年也发表了不少水平很高的文章。本文主要针对VLDB 会议中区块链相关的论文进行简单整理。 2021 SlimChain: Scaling Blockchain Transactions through Off-Chain Storage and Parallel Processing…

入选数据库顶会 VLDB:如何有效降低产品级内存数据库快照尾延迟?

阿里云操作系统团队、阿里云数据库团队以及上海交通大学新兴并行计算研究中心一起合作的论文 “Async-fork: Mitigating Query Latency Spikes Incurred by the Fork-based Snapshot Mechanism from the OS Level” 被数据库系统领域顶会 Very Large Data Bases Conferences (V…

VLDB 2023 | 基于擦除的浮点无损压缩(附论文和源码)

大量浮点时间序列数据正以前所未有的高速率生成。一种高效、紧凑、无损的时间序列数据压缩方法对海量数据的应用场景至关重要。现有的大多数浮点无损压缩方法是基于异或操作,但它们没有充分利用尾随零,这通常会导致压缩率不尽如人意。本次为大家带来重庆…

运算符—逻辑运算符

目录 5.逻辑运算符 5.1逻辑运算符概述 5.2短路逻辑运算符 5.逻辑运算符 (学完之后要求能够使用逻辑运算符完成逻辑运算) 5.1逻辑运算符概述 在数学中,一个数据x,大于3,小于6,我们可以写为这样来表示&am…

C语言关系运算和逻辑运算

一、关系运算 1.关系运算符 每个关系运算符对它左侧值和右侧值进行比较大小的运算 2.关系表达式 用关系运算符连接起来的式子。 若关系为真,关系表达式的值为1; 若关系为假,关系表达式的值为0; 3.优先级 关系运算符优先级低于算术…

C语言复习--逻辑运算符|| 和,!

&& 只有两个条件都为真时,才为真。||只要一个为真,就为真。 逻辑运算符很重要的法则是短路法则。 逻辑运算符的运算顺序都是从左到右计算。 && 当左侧条件为假时,就不计算右侧。 || 都左侧条件为真时,就不计…

C语言:关系运算符逻辑运算符

本节的所讲解的符号,大家在生活中应该都有用过,像我们去商场买东西,都会比较一下价格,是不是相等啊,哪家的贵,哪家的便宜啊。 在C语言中程序中也存在这样的比较,这个时候就需要用到关系运算符了…

C语言逻辑运算符详解

情景模式&#xff1a;现在研发出了一款新的软件&#xff0c;要求使用者必须成年&#xff0c;并且成绩大于等于60&#xff0c;该怎么办呢&#xff1f; 或许你会想到使用嵌套的 if 语句&#xff0c;类似下面这样的代码&#xff1a; #include <stdio.h> int main() {int a…

C 语言 逻辑运算符

文章目录 介绍逻辑运算符一览案例演示 介绍 用于连接多个条件&#xff08;一般来讲就是关系表达式&#xff09;&#xff0c;最终的结果要么是真(非 0 表示)&#xff0c;要么是 假(0 表示) 。 逻辑运算符一览 下表显示了 C 语言支持的所有逻辑运算符。假设变量 A 的值为 1&am…

☀️光天化日学C语言☀️(11)- 逻辑运算符 | 我是一个有逻辑的人

&#x1f649;饭不食&#xff0c;水不饮&#xff0c;题必须刷&#x1f649; C语言免费动漫教程&#xff0c;和我一起打卡&#xff01; &#x1f31e;《光天化日学C语言》&#x1f31e; LeetCode 太难&#xff1f;先看简单题&#xff01; &#x1f9e1;《C语言入门100例》&#…

C语言逻辑运算符介绍和示例

文章目录 1、逻辑运算符介绍2、逻辑表达式的书写3、不得不说的逻辑非4、获取视频教程5、版权声明 1、逻辑运算符介绍 在日常生活中&#xff0c;要做出某个决定&#xff0c;需要判断的条件往往不止一个&#xff0c;需要判断多个条件&#xff0c;例如超女选秀&#xff0c;参与选…

C语言按位逻辑运算符总结-与、或、非、异或

点击上方蓝字关注我&#xff0c;了解更多咨询 C中有按位逻辑运算符&#xff1a;按位取反、按位与、按位或、按位异或。这4个运算符可以用于整型&#xff0c;包括char类型。按位操作针对每一个位进行操作&#xff0c;不影响左右两边的位。4个运算符的作用总结如下&#xff1a; 一…

C语言逻辑运算符和||,一篇文章带你读懂逻辑表达式!

目录 逻辑运算符有哪些&#xff1f; 逻辑运算符的短路特性 逻辑运算符在表达式求值中的问题 逻辑运算符&&、||混合的不同情况 逻辑运算符有哪些&#xff1f; C 语言提供了以下三种逻辑运算符。 一元&#xff1a;&#xff01;&#xff08;逻辑非&#xff09;。 二…

勒让德符号判断二次剩余-C语言

近日备考学习二次剩余理论&#xff0c;其中了解到勒让德符号这个相比欧拉定理更加方便判断一个正整数在一个模数下是否为二次剩余&#xff1b; 基于勒让德符号理论的学习&#xff0c;本文旨在通过程序来实现基于勒让德符号的二次剩余判断方法&#xff1b; 本文着重点在于运算…