当前位置: 首页 > article >正文

大模型训练为什么依赖GPU

近年来,随着人工智能技术的飞速发展,特别是深度学习领域的进步,大模型的训练逐渐成为研究和工业界的热点。作为大模型训练中的核心硬件,GPU(图形处理单元)扮演了至关重要的角色。那么,为什么大模型训练如此依赖GPU呢?本文将从多个角度探讨这一问题。

一、GPU的并行计算能力

1.1 大规模并行处理

GPU的架构设计与CPU截然不同。CPU通常拥有少量的高性能核心,这些核心擅长处理复杂的任务和多样化的计算指令,适用于串行计算和较少的数据并行。而GPU则设计有成百上千的简单核心,这些核心能够同时处理多个相同操作。这样的设计使得GPU特别适合于大规模并行计算,在需要对大量数据进行相同形式的运算时,其性能优势明显。

在深度学习的训练过程中,尤其是神经网络,这种操作的并行性更加突出。例如,在训练过程中,我们会遇到大量的矩阵运算,比如权重更新、前向传播和反向传播等。这些矩阵运算能够被分解成较小的子任务,利用GPU的并行核心同时处理,从而实现加速。多个研究显示,在相同的硬件条件下,使用GPU进行深度学习训练可以比使用CPU快数十倍甚至上百倍。这种加速效果使得科研人员和工程师能够更快地迭代与优化模型,大幅度缩短实验时间。

1.2 大模型的复杂度

随着深度学习模型的不断演化,其复杂度和规模也在迅速上升。现代深度学习模型,特别是图像识别、自然语言处理等领域,通常拥有数以亿计的参数。例如,OpenAI的GPT-3模型拥有1750亿参数。这种规模的模型意味着需要大量的计算资源来进行训练,尤其是在初期阶段,模型参数的随机初始化、损失函数的求解、梯度的计算等都需要消耗大量的计算能力。

GPU由于其优秀的并行性,能够有效进行大量的浮点运算。与传统的CPU执行指令顺序的方式不同,GPU能够把一个复杂的深度学习模型的整个训练过程分解成多个小任务,减少了时间成本。每个小任务可以被分配到GPU的不同核心上并行处理,使得整个训练过程更加高效和时间友好。这也是为什么在面对复杂的深度学习模型时,选择GPU进行训练几乎是唯一的选择。

1.3 CPU与GPU架构差异

在计算架构上,CPU(中央处理单元)和GPU(图形处理单元)有着显著的差异。CPU设计用于执行少量的复杂任务,通常拥有4到16个高性能核心,这些核心具备强大的逻辑控制能力,适合处理复杂的算法和多样化的任务。相较之下,GPU拥有数千个简化核心(例如,NVIDIA A100具有6912个CUDA核心),专为并行计算优化。这种设计使得GPU在面对大规模数据处理时,能够最大化地发挥其并行计算能力。

CPU和GPU的架构对比图展示了两者在处理能力上的不同产品特性——CPU专注于低延迟和高单线程性能,而GPU则专注于高并发和高吞吐量。这种并行结构使得GPU成为处理深度学习模型和大规模数据集的理想硬件。

1.4 矩阵运算加速比

在机器学习和深度学习中,矩阵运算是最基础且最重要的计算形式。在深度学习训练过程中,无论是前向传播还是反向传播,都涉及大量的矩阵乘法。

为了展示GPU的强大性能,我们可以对比CPU和GPU的矩阵运算:

python

# CPU矩阵乘法(单线程)
import numpy as np
a = np.random.rand(10000, 10000)
b = np.random.rand(10000, 10000)
%timeit np.dot(a, b)  # 约120秒# GPU加速(使用CuPy)
import cupy as cp
a_gpu = cp.array(a)
b_gpu = cp.array(b)
%timeit cp.dot(a_gpu, b_gpu)  # 约0.8秒

通过上面的对比,我们可以看到,使用GPU进行矩阵运算的加速比高达150倍。这种加速能力使得训练复杂的深度学习模型,尤其是参数数量庞大的模型,成为可能。

1.5 大规模并行的优势

在实际应用中,大规模并行计算的优势不仅体现在速度上,更是在资源利用率和成本效益上。GPU的并行计算架构可以在相同时间段内处理多个模型或批次的数据,通过合理的批量处理,进一步提升训练效率。

例如,在集群环境中,多个GPU可以协同工作,利用数据并行和模型并行策略共同训练模型。这种方式在多个GPU上分配计算负载,充分利用每个GPU的计算能力,极大地加速了训练过程。在大模型(如GPT系列)中,单一节点的计算能力往往不足以支撑复杂的运算,借助GPU集群,研究人员能够高效地完成更复杂的训练任务。

二、内存带宽与数据吞吐量

2.1 高带宽内存

内存带宽是衡量计算设备将数据从内存读取到计算核心中速度的一项重要指标。GPU通常配备了专用于高带宽数据传输的显存,如GDDR6或HBM(高带宽内存),这些内存技术的设计目标就是为了满足极高数据流的需求。在深度学习训练中,尤其是在大模型的情况下,内存的带宽限制常常会成为性能瓶颈。

比如,在训练一个神经网络时,输入的数据(如图片、文本或其他格式)需要迅速加载到显存中,之后进行处理和计算。如果内存带宽不足,计算核心会等待数据,从而导致效率下降。GPU的高带宽内存可以确保数据在计算单元与内存之间快速流动,最大限度地减少核间等待,从而保持高效的计算。这种优越的内存带宽是CPU难以比拟的,后者通常更注重单核性能和复杂计算任务的处理。

2.2 计算和数据传输并行

在极大规模的模型训练中,计算和数据传输是两个并行操作。GPU的设计使得在执行密集的计算时,它能够同时与内存进行高速的数据交互。这种处理方法减少了CPU和内存之间的调度延迟,避免了在计算时等待数据的情况发生。

传统的计算模型往往采取的顺序执行方式,即计算完成后再进行数据更新,这种模式在面对大规模数据时显得极为低效。而GPU则能在每个时钟周期内交替进行计算和数据传输,使得计算资源得到最优配置。在训练神经网络的过程中,所有层之间的权重更新、激活值计算和损失函数评估等,都可以在一个大的并行框架中流畅进行,确保模型能够高效训练。这种计算与数据流的高度协调化,使得GPU在处理大数据量和不断变化的模型参数时,拥有独特的优势。

总而言之,GPU之所以在大模型训练中占据重要地位,正是因为其卓越的并行计算能力和高效的内存带宽,使得处理复杂数据、进行大量计算变得高效而迅速。随着AI的发展,GPU的角色只会愈发重要,推动我们的技术进步。

2.3 内存带宽的对比

内存带宽是衡量计算设备从内存读取数据能力的关键指标。在深度学习中,尤其是大规模模型的训练过程中,数据的输入与输出频率极高,带宽不足可能成为性能瓶颈。

硬件类型典型带宽数据搬运效率
DDR4内存50GB/s延迟约100ns
HBM2显存1.5TB/s延迟约10ns

HBM2显存通常是GPU采用的高带宽内存技术,其带宽比DDR4内存高出30倍。这使得GPU能够以更快的速度去处理来自模型和数据集的庞大交换量,从而有效减小训练时间。

2.4 大模型显存占用实例

大模型的参数数量与显存的占用息息相关,以下提供了一些典型模型的显存需求对比:

模型规模参数数量FP32显存占用混合精度优化后
GPT-3175B700GB280GB
LLaMA-270B280GB112GB

使用NVIDIA A100(具有80GB显存)的GPU进行训练时,为了满足大模型的显存需求,通常需要至少4卡并行运行,以确保显存能够满足需求并保持训练效率。混合精度训练通过降低运算精度,提高了显存利用率,进一步提升了训练速度。

2.5 数据流动与计算的同步

在大模型的训练过程中,数据流动的速度同样重要。GPU的高带宽显存和并行计算能力可以确保数据传输与计算密切同步,这一特点是CPU所无法比拟的。

传统的CPU处理流程往往在进行计算时需要等待数据的准备,而GPU则能够并行执行数据加载与计算任务。在深度学习中,尤其是训练大模型,能够实时将新数据送入GPU进行计算,使得GPU始终处于高效运行状态,避免了因等待数据而造成的资源闲置。

高带宽和高吞吐量的结合,使得GPU在大规模深度学习训练中具备了无与伦比的优势,确保了在极短时间内完成庞大的计算需求。

三、专用硬件的优势

3.1 深度学习优化

GPU不仅因其通用的并行计算能力而受到青睐,更重要的是,现代GPU在架构上已针对深度学习的需求进行了显著优化。例如,NVIDIA推出了一系列专为深度学习设计的GPU,如Volta架构中的Tensor Cores。这些Tensor Cores能够以更高的效率执行深度学习所需的大量矩阵乘法运算,尤其是在混合精度训练中可达到数倍于传统计算过程的加速能力。

通过对计算任务的细致优化,GPU不仅可以更快速地完成训练过程,还能降低功耗,提升计算效率。这对于在数据中心或云计算环境中运行深度学习任务尤为重要,因为更低的功耗意味着更低的运营成本。专用硬件的设计使得数据科学家和机器学习工程师能够更专注于模型设计而不是底层优化,从而提高了整个项目的开发效率。

3.2 芯片设计的演化

随着对深度学习需求的上升,许多公司(尤其是以NVIDIA为首)开始将重点放在开发专用的AI硬件上。这些专用ASIC(应用专用集成电路,如TPU)和FPGA(现场可编程门阵列)被广泛应用于AI训练和推理任务。越来越多的硬件供应商根据深度学习模型的特性设计出优化芯片,例如Google的TPU,其架构专门用于高效处理大规模神经网络的训练和推理。

这种芯片设计的演变不仅提高了深度学习计算的性能,更创造了新的市场机会。许多企业和研究机构开始关注专用硬件,以解决传统计算资源在处理深度学习任务时面临的性能瓶颈。此外,许多新兴的非易失性内存和三维堆叠技术的运用也进一步增强了GPU等专用硬件的存储能力和访问速度,支持处理更大规模的模型和数据集。

3.3 Tensor Cores革命:算力的飞跃

在GPU硬件架构的发展中,NVIDIA的Tensor Core技术无疑是一个重要的里程碑。Tensor Core专为加速深度学习任务而设计,可以在单个时钟周期内执行高效的矩阵运算。在标准的FP32计算中,NVIDIA A100的性能达到19.5 TFLOPS,而通过Tensor Core的优化,这一性能可以激增至312 TFLOPS,尤其在稀疏矩阵计算中表现卓越。

以下是一个Tensor Core优化的矩阵乘法示例:

cuda

__global__ void tensorCoreMatmul(half* A, half* B, float* C) {using namespace nvcuda;__shared__ half Ashare[16][16];__shared__ half Bshare[16][16];wmma::fragment<wmma::matrix_a, 16, 16, 16, half, wmma::row_major> a_frag;wmma::fragment<wmma::matrix_b, 16, 16, 16, half, wmma::col_major> b_frag;wmma::fragment<wmma::accumulator, 16, 16, 16, float> c_frag;// 使用Tensor Core进行计算wmma::load_matrix_sync(a_frag, Ashare, 16);wmma::load_matrix_sync(b_frag, Bshare, 16);wmma::mma_sync(c_frag, a_frag, b_frag, c_frag);wmma::store_matrix_sync(C, c_frag, 16, wmma::mem_row_major);
}

这种创新在训练大规模模型时可以显著降低时间成本,使得巨型神经网络的训练成为可能。

3.4 通信优化技术:网络协同的助推器

在大型集群中,计算节点之间的高效通信也是十分关键的。NVIDIA的NVLink 3.0技术可以提供600GB/s的双向带宽,极大地提升了多个GPU之间的数据交换速度。此外,GPUDirect RDMA允许不同节点之间跨网络直接访问内存,这不仅降低了延迟,还提高了数据传输的效率。

这样的通信优化技术,使得在大型分布式系统中,GPU能够更高效地协作,共同完成复杂的大模型训练任务。

四、生态系统与框架支持

4.1 深度学习框架的优化

现代深度学习的发展离不开框架的支持,这些框架(如TensorFlow、PyTorch、MXNet等)不仅为开发者提供了高效的算法实现,还针对GPU进行了深度的优化。这些框架利用GPU的多核特性、并行计算和高带宽特性,自动将训练任务调度到GPU上,极大地简化了开发流程。

例如,许多框架支持CUDA和cuDNN等库,这些是NVIDIA为GPU计算提供的专用库,专门用于优化神经网络的训练和推理过程。这使得研究人员可以在不必深入了解GPU底层工作的情况下进行实验,方便快速迭代和验证想法。这种框架层的优化使得深度学习的入门门槛下降,为更多开发者和研究者提供了平滑的学习曲线。

4.2 社区与文档支持

围绕GPU及其深度学习框架,已经形成了一个庞大的社区和丰富的文档资源。这些社区为开发者提供了广泛的支持,包括问题解答、最佳实践、案例分享和教学内容。在诸如GitHub等代码托管平台上,许多基于GPU的深度学习项目都在不断更新与迭代,用户可以在这里找到大量已有的实现和优化技巧。

此外,组织和公司还在积极举办各种类型的竞赛和挑战(如Kaggle比赛、腊八挑战等),这使得社区成员能够在实际应用中进行合作与学习,促进技术的交流与进步。文档和资料的丰富性为使用GPU进行深度学习研究和开发提供了坚实的基础,帮助新手和老手解决实际遇到的问题,加速AI技术的推广与应用。

4.3 深度学习框架的强大支持

在深度学习领域,主流框架(如PyTorch、TensorFlow和JAX)对GPU的支持已达到极致。它们不仅实现了GPU加速,还通过各自的特性使模型构建和训练过程变得简便高效。

  • PyTorch:结合CUDA和cuDNN,支持动态计算图,确保可以灵活处理不同的神经网络结构,并提供AMP(自动混合精度)以提高训练速度和减少显存占用。
  • TensorFlow:集成了XLA编译器,通过静态图优化和分布式策略,实现可高效部署的深度学习模型。
  • JAX:将GPU和TPU的后端统一,使得函数式编程和自动微分优化变得容易,使得研究者可以专注于算法开发而不是底层实现。

整体上,深度学习框架的进步使得GPU的优势得以充分发挥,为AI研究提供了强大的工具支持。

4.4 典型加速库的崛起

在CUDA生态中,许多高性能计算库的出现为模型训练提供了基础设施。例如:

  • cuBLAS:为矩阵运算提供高效的BLAS(基础线性代数子程序)实现。
  • cuDNN:专为深度学习设计,提供高性能的卷积计算。
  • NCCL:专注于多GPU的通信优化,使得数据并行训练得以高效实施。

以下是各库间的关系图示:

这些优化库和框架的结合,创建了一个无与伦比的软件生态系统,对GPU在大模型训练中的应用提供了全面支持,保证模型训练高效、稳定。

从专用计算单元的流行到日益成熟的生态系统,GPU不仅在算力上具备无可比拟的优势,还在逐渐完善的基础设施中发挥着核心作用。面对未来,GPU仍将是大规模模型训练的首选设备。随着技术的不断发展和创新,了解并掌握有效的CUDA优化技术将成为AI工程师和研究者的核心竞争力。

五、结论

综上所述,大模型训练依赖GPU主要是由于其强大的并行计算能力、高带宽内存、专用硬件的优势及良好的生态支持。随着技术的不断进步和需求的不断增加,GPU在大模型训练中的重要性只会愈加凸显。未来,我们可以期待GPU与深度学习算法之间的联系更加紧密,推动AI技术的进一步发展。

相关文章:

大模型训练为什么依赖GPU

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;特别是深度学习领域的进步&#xff0c;大模型的训练逐渐成为研究和工业界的热点。作为大模型训练中的核心硬件&#xff0c;GPU&#xff08;图形处理单元&#xff09;扮演了至关重要的角色。那么&#xff0c;为什么大模…...

二叉树链式结构:数据结构中的灵动之舞

目录 前言 一、 前置说明 二、二叉树的遍历 2.1前序遍历 2.2中序遍历 2.3 后序遍历 2.4层序遍历 三、二叉树的遍历的应用 3.1二叉树节点个数&#xff1a; 3.2二叉树的高度 3.3 二叉树第k层的节点的个数 3.4二叉树的查找 总结 前言 在数据结构的世界里&#xff0c;二叉…...

【kafka系列】Kafka如何保证消息不丢失?

目录 1. 生产者端&#xff1a;确保消息成功发送到Broker 核心机制&#xff1a; 关键步骤&#xff1a; 2. Broker端&#xff1a;持久化与副本同步 核心机制&#xff1a; 关键源码逻辑&#xff1a; 3. 消费者端&#xff1a;可靠消费与Offset提交 核心机制&#xff1a; 关…...

新建github操作

1.在github.com的主页根据提示新建一个depository。 2.配置用户名和邮箱 git config --global user.name "name" git config --global user.email "email" 3.生成ssh秘钥 ssh-keygen -t rsa 找到public key 对应的文件路径 cat /root/.ssh/id_rsa 复制显…...

第 15 天:数据存储,打造存档 读取系统!

&#x1f3af; 目标&#xff1a; ✅ 掌握 UE5 SaveGame 存档系统 ✅ 在 C 创建存档类&#xff0c;存储游戏数据 ✅ 实现存档 & 读取功能&#xff0c;让游戏状态可持久化 ✅ 在 BP_PlayerCharacter 里实现&#xff1a; * 游戏开始时自动加载存档 * 玩家受到伤害时自动存档 …...

Flutter 异步编程利器:Future 与 Stream 深度解析

目录 一、Future&#xff1a;处理单次异步操作 1. 概念解读 2. 使用场景 3. 基本用法 3.1 创建 Future 3.2 使用 then 消费 Future 3.3 特性 二、Stream&#xff1a;处理连续异步事件流 1. 概念解读 2. 使用场景 3. 基本用法 3.1 创建 Stream 3.2 监听 Stream 3.…...

Java短信验证功能简单使用

注册登录阿里云官网&#xff1a;https://www.aliyun.com/ 搜索短信服务 自己一步步申请就可以了 开发文档&#xff1a; https://next.api.aliyun.com/api-tools/sdk/Dysmsapi?version2017-05-25&languagejava-tea&tabprimer-doc 1.引入依赖 <dependency>…...

React进阶之React核心源码解析(一)

React核心源码解析 react 特点CPU卡顿IO 卡顿 新老 react 架构对比v15v16.8Scheduler 调度器Reconciler 协调器 React fiber原理更新dommount 构建过程 render阶段 — scheduler reconcilerreact源码解析react-domreact-dom/src/client/ReactDOMRoot.js react-reconcilerreact-…...

【Vue】打包vue3+vite项目发布到github page的完整过程

文章目录 第一步&#xff1a;打包第二步&#xff1a;github仓库设置第三步&#xff1a;安装插件gh-pages第四步&#xff1a;两个配置第五步&#xff1a;上传github其他问题1. 路由2.待补充 参考文章&#xff1a; 环境&#xff1a; vue3vite windows11&#xff08;使用终端即可&…...

类加载机制及双亲委派模型

一、引言 二、类加载流程 1. 加载 2. 连接 2.1 验证 2.2 准备 2.3 解析 3. 初始化 三、类加载器 类加载器的类型 双亲委派模型 打破双亲委派模型 双亲委派模型优点 一、引言 在 Java 的运行机制中&#xff0c;类加载是一个至关重要的环节。它不仅决定了 Java 程序的动态…...

tcp/ip协议设置参数,tcp/ip协议6设置

TCP/IP协议设置参数主要涉及到IP地址、子网掩码、网关地址以及DNS服务器地址等关键参数。这些参数的配置确保了网络设备能够正确地接入互联网并与其他设备进行通信。以下是对这些参数设置的详细说明&#xff1a; 1. IP地址 定义&#xff1a;IP地址是互联网中用于唯一标识每一…...

如何在Java EE中使用标签库?

在Java EE&#xff08;现在称为Jakarta EE&#xff09;中使用标签库&#xff08;Tag Library&#xff09;&#xff0c;主要是通过JSP标准标签库&#xff08;JSTL&#xff09;或自定义标签库来实现的。标签库允许在JSP页面中使用自定义的标签&#xff0c;从而简化页面逻辑、增强…...

【java】方法的基本内存原理(栈和堆)

java内存主要分为栈和堆&#xff0c;方法相关的部分主要在栈内存里&#xff0c;每个方法调用时会在栈里创建一个栈帧&#xff0c;存放局部变量和方法执行的信息。执行完后栈帧被销毁&#xff0c;局部变量消失。而对象实例存在堆里&#xff0c;由垃圾回收器管理。 **Java方法内…...

今日AI和商界事件(2025-02-15)

根据2025年2月15日的科技动态&#xff0c;以下是今日AI领域的重要事件及相关进展总结&#xff1a; 1. DeepSeek日活突破3000万&#xff0c;开源生态加速AI普惠 里程碑意义&#xff1a;开源大模型DeepSeek宣布日活跃用户数突破3000万&#xff0c;其R1模型凭借开源策略和低成本优…...

尚硅谷课程【笔记】——大数据之Hadoop【一】

课程视频链接&#xff1a;尚硅谷Hadoop3.x教程 一、大数据概论 1&#xff09;大数据概念 大数据&#xff08;Big Data&#xff09;&#xff1a;指无法再一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发…...

SQL 建表语句详解

SQL 建表语句详解 在 SQL 中&#xff0c;创建表&#xff08;Table&#xff09;是数据库设计的基础。表是存储数据的基本单位&#xff0c;每个表由行和列组成。创建表的过程涉及到定义表的结构&#xff0c;包括列名、数据类型、约束等。本文将详细介绍 SQL 中的建表语句&#x…...

wordpress主题插件开发中高频使用的38个函数

核心模板函数 get_header()/get_footer()/get_sidebar() – 加载模板部件 the_title()/the_content()/the_excerpt() – 显示文章标题、内容、摘要 the_post() – 循环中获取文章数据 bloginfo(‘url’) – 获取站点URL wp_head()/wp_footer() – 输出头部/尾部代码 wp_n…...

DockerFile优化镜像体积

title: DockerFile优化镜像体积 date: 2025-02-15 15:22:40 tags: DockerFile优化镜像体积DockerFile优化镜像体积 DockerFile优化镜像体积前文回顾:一、细数优化镜像体积的思路与方式二、优化Dockfile文件编辑 Dockerfile2文件三、构建镜像四、运行镜像五、查看运行效果原文 …...

使用 playwright 自定义 js 下载的路径和文件名

遇到一个问题&#xff0c;点击按钮自动下载文件&#xff0c;路径和文件名都不能自定义&#xff0c;可以用 playwright 来解决这个问题 from playwright.sync_api import sync_playwright import os import time class ExcelDownloader: def __init__(self, download_pat…...

Open FPV VTX开源之OSD使用分类

Open FPV VTX开源之OSD使用分类 1. 源由2. 硬件2.1 【天空端】SigmaStar2.2 【天空端】Raspberry Pi2.3 【地面端】 3. 软件3.1 天空端软件3.2 地面端软件 4. 分类4.1 嵌入式OSD分类A1-嵌入式OSD&#xff1a;SigmaStar Android分类A2-嵌入式OSD&#xff1a;SigmaStar Hi3536分…...

题解:洛谷 P4113 [HEOI2012] 采花

题目https://www.luogu.com.cn/problem/P4113 运用类似于P1972 [SDOI2009] HH的项链的操作&#xff0c;将数据离线下来处理。 按照区间右端点从小到大排序。 问题是数量大于等于 的时候才能算进去。 于是乎我们用两个数组维护倒数第二次出现和最后一次出现的地方。 每次在…...

linux概念详解

用户守护进程 用户空间守护进程是一些在后台运行的长期服务程序&#xff0c;提供系统级服务。 下面举一些例子。 网络服务&#xff1a; 如sshd&#xff08;SSH服务&#xff09;、httpd&#xff08;HTTP服务&#xff09;。 sshd&#xff1a;sshd 守护进程会在后台运行&#x…...

easyexcel快速使用

1.easyexcel EasyExcel是一个基于ava的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel 即通过java完成对excel的读写操作&#xff0c; 上传下载 2.easyexcel写操作 把java类中的对象写入到excel表格中 步骤 1.引入依赖 <depen…...

fetch() 与 XMLHttpRequest 的差异

fetch() 与 XMLHttpRequest 的差异 fetch() 的功能与 XMLHttpRequest 基本相同&#xff0c;都是向服务器发出 HTTP 请求&#xff0c;但有三个主要的差异。 &#xff08;1&#xff09;fetch()使用 Promise&#xff0c;不使用回调函数&#xff0c;因此大大简化了写法&#xff0…...

【java面向对象的三大特性】封装、继承和多态

目录标题 一、封装&#xff08;Encapsulation&#xff09;&#xff1a;二、继承&#xff08;Inheritance&#xff09;&#xff1a;三、多态&#xff08;Polymorphism&#xff09;&#xff1a;1. 多态的三个必要条件&#xff1a;2.多态的具体实现&#xff1a;3.多态的使用场景&a…...

c# textbox 设置不获取光标

[DllImport("user32",EntryPoint "HideCaret")] private static extern bool HideCaret(IntPtr hWnd); //需引入命名空间using System.Runtime.InteropServices; private void Txt_RecInfo_MouseDown(object sender, MouseEventArgs e) { …...

算法13-BFPRT算法

一、BFPRT 算法概念 BFPRT 算法&#xff08;Blum-Floyd-Pratt-Rivest-Tarjan 算法&#xff09;是一种用于在无序数组中快速找到第 k 小&#xff08;或第 k 大&#xff09;元素的高效算法。它的时间复杂度为 O(n)&#xff0c;在最坏情况下也能保证线性时间复杂度。BFPRT 算法的…...

android studio下载安装汉化-Flutter安装

1、下载android studio官方地址&#xff1a;&#xff08;这个网址可能直接打不开&#xff0c;需要VPN&#xff09; https://developer.android.com/studio?hlzh-cn mac版本分为X86和arm版本&#xff0c;电脑显示芯片是Inter的就是x86的&#xff0c;显示m1和m2的就是arm的 …...

Seaweedfs(master volume filer) docker run参数帮助文档

文章目录 进入容器后执行获取weed -h英文中文 weed server -h英文中文 weed volume -h英文中文 关键点测试了一下&#xff0c;这个-volume.minFreeSpace string有点狠&#xff0c;比如设置值为10&#xff08;10%&#xff09;&#xff0c;它直接给系统只留下10%的空间&#xff0…...

嵌套调用实现数组元素逆序存放

主函数调用reverse_array(int ptr[],int cnt)函数&#xff0c;该函数在调用inplace_swap(int *x,int *y)函数时&#xff0c;把两个不同的地址送给inplace_swap(int *x,int *y)函数&#xff0c;实现这两个位置处元素的交换。 令*xa,*yb 则*y *x^*y执行后&#xff0c;*xa,*ya^b…...