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

AI芯片:高性能卷积计算中的数据复用

  随着深度学习的飞速发展,对处理器的性能要求也变得越来越高,随之涌现出了很多针对神经网络加速设计的AI芯片。卷积计算是神经网络中最重要的一类计算,本文分析了高性能卷积计算中的数据复用,这是AI芯片设计中需要优化的重点之一,具体思路如下:
1.数据复用的动机
2.存储-计算分离框架下,针对卷积计算的优化思路
3.针对卷积计算的硬件架构设计分析
4.已经面临的挑战和解决方向
5.神经网络中数据复用的未来

1. 高性能卷积计算中数据复用的动机

  深度学习的发展过程中,较高的计算量是制约其应用的因素之一。卷积神经网络中,主要计算为三维的卷积计算(后简称为卷积),现有的主流处理器难以高性能,高效能的完成卷积计算。相比一般的通用计算,卷积计算中存在的大量数据复用以及计算的规则性,在硬件的微架构(后简称为架构)设计和计算优化上有很大的优化空间,由此诞生了众多针对深度学习加速的AI芯片。卷积计算过程可以表示如下:

for i = 1 : Hofor j = 1 : Wofor k = 1 : Cofor l = 1 : Hffor m = 1 : Wffor n = 1 : Ciout[i,j,k] += In[i*s+l.j*s+m,n]*F[l,m,n];

其中各参数的含义如下表:
在这里插入图片描述
据此可推算出输入输出数据的数据复用关系,如下表在这里插入图片描述
  可以看出,卷积计算过程中对Filter,Input和Output的数据均有很高的数据复用;充分利用计算过程中的数据复用是达到高性能和高效能的关键,这主要有以下几个方面原因:
1.利用数据复用更容易达到设计的峰值性能
2.利用数据复用可以降低内存访问,降低功耗
3.广义来看,卷积中规则的数据复用,可以降低处理器设计中缓存/控制逻辑的设计复杂度,提高总体的性能
  根据Roofline模型很容易解释第一点原因。Roofline模型是一种面向吞吐量的性能评价模型,它指出在理想情况下,处理器性能的理论上界。如下图所示,在数据复用不高的情况下,峰值性能受限于内存(Memory-bound)。
在这里插入图片描述
  访问不同存储的归一化能耗比(Ref. 6)可以解释第二点原因。充分利用数据复用,使得访存多发生在RF等靠近ALU的存储上,可以极大降低功耗。
在这里插入图片描述
  针对第三点,以AMD ZEN系列CPU为例,Die的结构如下图所示。可以看出FPU和ALU只占CPU面积的很小一部分。大部分面积是控制逻辑的缓存。这意味着如果针对卷积计算这种规则的,具有时间和空间强相关性的,且没有分支跳转的计算设计专门的硬件,可以抛开专用处理器中复杂的控制和缓存设计,减小芯片面积,提升性能,降低功耗。在这里插入图片描述
  这些特性表明,卷积计算有很大的优化空间;专门针对卷积计算设计的芯片能极大的提高性能和效能 。

2. 高性能卷积的计算方法

2.1 卷积即矩阵乘法

  矩阵-矩阵乘法的应用已经非常广泛,很多线性代数库充分结合了矩阵计算中的数据复用关系和处理器缓存的层次设计结构,对矩阵-矩阵乘法进行了充分的优化(GEMM,通用矩阵乘法)。(C = AB + C)的矩阵乘法可以表示为:

for i = 1 : mfor j = 1 : nfor k = 1 : tC(i,j) = A(i,k)*B(k,j) + C(i,j)

  这一形式和第1节中卷积的计算方式极其类似。实际上,针对三维的Tensor进行展开(即将卷积计算中的六层循环的内三层进行合并),很容易将卷积计算转化为矩阵乘法计算(im2col)。 其中一种展开方式如下图:
在这里插入图片描述
  下图也给出了一个具体的例子:
在这里插入图片描述
  此时,卷积计算等价为矩阵乘法计算;而卷积计算中的数据复用关系等价为了矩阵计算中的数据复用关系。矩阵-矩阵乘的复杂度如下所示:
  现有的处理器架构从存储和计算之间的关系上来看都是类似的,处理器计算性能的上限可以通过计算单元及其运行频率确定。为了高性能的完成矩阵计算,即使得性能达到Roofline模型中峰值,需要对矩阵计算的三层循环进行优化。在进行分析之前,需要明确两点固有的特性:
·处理器的存储是分层设计的,越靠近计算的单元,带宽越大,容量越小
·Roofline模型和访存的带宽有关,如下图所示
在这里插入图片描述
  如果矩阵存储在内存中(DDR),直接按三层循环进行矩阵计算,那么每个周期需要访问(a,b,c)三个数,此时性能会受限于DDR带宽。将矩阵放在片上的Cache中是一个好的选择,但是片上Cache的容量往往较小。解决这一个矛盾的方法是对大的矩阵进行分块,此时矩阵计算可以表示为:

for i = 1 : MR : m  // step MRfor j = 1 : NR : n  // step NRfor k = 1 : KC : c  // step KC// block-dot product in cache// Csub_{NR*MR} += Asub_{MR*KC}*B_sub(KC*NR)// opt. mirco kernelfor ir = 1:MRfor jr = 1:NRfor kr = 1: KCCsub(ir,jr) += Asub(ir,kr)*Bsub(kr,jr);

  采用这一分块方式,假设矩阵存储在DDR,分块后的矩阵存储在片上Cache;完成(MR\times NR\times NC)次乘法计算只需要从DDR获取(MR\times NR + NR \times NC + MR\times NC) 个数据,合理的分块能降低对DDR的访问。
   针对具有不同存储层次的处理器以及不同大小的矩阵计算而言,有不同的分块方式以达到峰值性能。虽然这一方法针对矩阵计算进行了很好的优化,但对于卷积计算而言,依旧存在缺陷
  im2col计算过程中针对Tensor进行了Reshape和Duplicate,这会增加带宽的消耗
  转化得到的矩阵乘法和传统的矩阵计算维度相差较大,可能无法获得好的性能
  由于这些缺陷存在,如果没有针对硬件架构进行特殊的设计,卷积即矩阵乘法的设计思路往往无法达到峰值性能。

2.2 卷积即卷积

一维的脉动阵列FIR滤波器的一种实现方式,其实现结构如下图,采用这种结构,每输入一个(x[n]),就能计算得到一个(y[n])。这种特殊的数据复用是根据卷积计算的特殊性质得到的。
在这里插入图片描述
  在卷积神经网络中,卷积层的计算一般也存在这种数据复用关系(除kernelsize <= stide情况外)。如果能用好这一特性,不再将卷积转化为矩阵乘法,直接计算卷积,能获得更高的性能。为了达到这一目标,和分析矩阵乘法类似,对卷积的六层循环进行分析。

for i = 1 : Hofor j = 1 : Wofor k = 1 : Cofor l = 1 : Hffor m = 1 : Wffor n = 1 : Ciout[i,j,k] += In[i*s+l.j*s+m,n]*F[l,m,n];

  类似GEMM,最内层循环会被并行化,为了达到更好的性能,可以对循环顺序进行调整。
  为了提高并行性,由于Co循环的各个计算之间相互独立,将其放置到最内层循环
  由于Wf,Hf可能会很小,为了保证并行性,将Wo放到Co循环外
  完成调整之后,对卷积计算进行分块
在这里插入图片描述
  为了进一步提高访存的效率,Input/Ouput/Filter在内存中的排布方式也需要进行相应的调整。
  无论是将卷积转化为矩阵计算,或者直接计算卷积,都能够通过分块的方式相对高效的完成卷积计算;由于将卷积转化为矩阵计算有一定开销,其性能可能会受到一定影响,但矩阵计算具有更高的灵活性。

3. 高性能卷积的架构设计

3.1 GEMM加速器

  显然,实现一个硬的GEMM加速器可以加速矩阵计算,进而加速卷积计算。针对GEMM的分块矩阵(即内层循环)进行硬件加速是一种简单,高效且相对灵活的选择,其优势包括:
  简单,计算单元实现GEMM的mirco kernel即可,易于集成
  灵活,支持所有可用GEMM加速的算法(理论上)
  编译器设计和调度有很多参考实现
  类似设计包括Nvidia的Volta架构,其加速核心被称为Tensor Core;以及华为的达芬奇架构(Davinci Core),其卷积的计算核心被称为CUBE Core。
  其中,Nvidia的每个Tensor Core是一个(4\times4\times4) 的MAC阵列。计算(C = AB + C) 时,矩阵(A,B) 中的元素广播到4个不同的MAC上,同时每个四个乘法的结构累加到一起,如下图所示:
在这里插入图片描述
达芬奇中的CUBE Core是一个(16\times16\times16)的MAC阵列(以Davinci Max为例),如下图所示,具有更高的数据复用关系。
在这里插入图片描述
Nvidia Volta架构中,Tensor Core仅仅只是一个特殊的计算单元,其地位和FP计算单元一致。在这里插入图片描述
  为了保证计算单元之外设计的统一性,送入计算单元的数据位宽完全一致,和普通的FP32计算单元比,Tensor Core在算力上有很大的优势。由下表可以看出,由于数据复用和精度的降低,Tesnor Core的理论性能是FP32的8倍(同频,其中两倍受益于精度的降低)。
在这里插入图片描述
在这里插入图片描述
  前文提到“卷积即矩阵乘法的设计思路无法达到峰值性能”,但有了硬件架构的联合设计,这一结论不再成立。譬如在Davinci Core中,在L0 Buffer进行Img2col可以降低由于im2col增加的访存带宽,合理设计的L0 BufferA/B/C也能应对卷积操作中大量的中间结果。

3.2 脉动阵列

  脉动阵列的典型代表是Google TPU,Google TPU中设计的脉动阵列也是针对矩阵乘法设计(虽然有的脉动阵列也可直接计算卷积,但TPU并没有采用这一类设计)。之前的文章有对Google TPU进行细致的分析(动手写一个简单版的谷歌TPU),并实现了一个小规模的基于VLIW+Vector Architecture的TPU(SimpleTPU,VLIW+向量体系结构),可以作为进一步参考。Google TPU的其计算核心为一个(256\times 256)的二维脉动阵列,如下图所示:
在这里插入图片描述
  另一个类似的设计时Telsa(特斯拉)的Full self-driving(FSD) computer,其内部的Nerual Network Accelerator(NNA)也实现了一个大规模的矩阵乘法器(NNA也可能时直接采用广播的形式,而非脉动形式进行输入)。参考其专利中的说明,其具体实现和Google TPU略有差异。
在这里插入图片描述
  根据描述,FSD NNA中的Wieght和Activation均通过DATA FORMATTER后送入到MATRIX PROCESSOR中。乘法的结果在MATRIX PROCESSOR中进行累加,计算出最终结果后依次向下移位输出。FSD中有两个NNA,其中MATRIX PROCESSOR的大小均为(96\times 96),和TPU1相比,FSD的主要差异表现在
  计算过程中,TPU的weight保持不变,而FSD的partial sum保持不变
  TPU中的weight保持在DRAM中(片外),FSD保留在SRAM中
  由于FSD的weight存储在片上,为了满足输入的数据排布要求,增加了在线的Weight Formatter模块
  FSD的输入宽度为96,是3的倍数,这是应为在Data Formatter时对kernel进行了展开((3\times 3)的kernel中有因子3);而TPU1的宽度为256是2的幂次,kernel的展开很有可能是时间上隐式进行的。
  针对TPU和FSD这种在数据流中的差异,可以分为Weight Stationary,Output Stationary和No Local Reuse等(Ref. 6)。这种针对Dataflow的分类方法也涉及到数据复用,但主要针对Register File上的复用进行分析,和本文针对计算中存在的数据复用关系进行分析有所不同(一个典型的差别是Ref.6中归类为no local reuse的情况在本文认为是有数据复用的)。

3.3 直接卷积加速器

  Eyeriss是一种直接针对卷积计算优化的加速器,和其他加速器不同,Eyeriss针对Convolution Reuse进行了优化。按Ref.6的分类标准,是一种Row Stationary。(Ref. 7)
  由于卷积神经网络计算卷积时C方向的特殊性,Convolution Reuse仅在H和W方向存在。以kernelsiz=3,stride=1为例,卷积计算中row方向的数据复用如下图(Ref. 7)
在这里插入图片描述
  此时ifmap中的元素3被利用了三次,只需要从存储中访问一次元素3,就能完成3次计算。当扩展为二维时,有(Ref. 7)
在这里插入图片描述
  即ifmap的row方向在不同PE之间进行复用;而实际上ifmap的col方向的数据会暂存在PE内的RF上,col方向的数据也在RF上进行复用。
  Eyeriss利用了convolution resue,同时也可以利用其他resue的手段。譬如上图中的filter在水平PE之间复用,psum在垂直的若干个PE之间复用。这意味这Eyeriss相比其他结构做到了更多的数据复用,可以进一步降低功耗。

3.4 基于变化域的卷积计算

  一维卷积的计算复杂度为(O(n^2)),由于时域卷积等于频域相乘,对于离散信号而言,可以通过快速傅里叶变换(Fast Fourier Transform,FFT)及其逆变换将信号在时域和频域之间变换。而FFT的计算复杂度为(O(nlogn)),当(n)取值较大时,其计算复杂度会远低于直接计算一维卷积。
  类似的,可以考虑在其他域进行二维/三维卷积的计算;针对卷积神经网络中的加速,有:FFT based Method (Fast training of convolutional networks through FFTs)、Winograd Method (Fast Algorithms for Convolutional Neural Networks)。但若想取得一定的加速比,这些方法对卷积核的大小和步长均有要求;这一类方法均难以适应卷积核日益小型化的发展趋势。

4. 轻量化网络带来的新的设计挑战

  当大多数AI芯片中的神经网络加速器还在使用AlexNet/VGG/ResNet跑benchmark时,新的网络层出不穷。一些为了运行在嵌入式设备上而设计的轻量化网络通过压缩卷积中各个维度的计算来降低计算量,这很大程度影响了卷积计算中的数据复用关系。考虑在轻量化网络中使用的Point Wise Conv和Depth Wise Conv,以及延时受限系统中Batch=1的全连接层,有下表:
在这里插入图片描述
而第三节中一些典型的基于数据复用的加速其设计中,若想达到最优性能,对数据复用的要求是在这里插入图片描述
  数据复用关系的失配会让这些加速器在运行这些特定的Layer时出现严重的效率问题。譬如TPU V1在计算(3\times3) Depthwise Conv时效率不可能超过(9/256=3.5%)。这样低的效率使得这些设计良好的网络带来的数量级的计算量下降变得毫无意义。
  从根源上看,Cube Core或者Systolic Array的优化目标都是Matrix-Matrix乘法,而Batch=1得FC和Depthwise Conv更贴近于Matrix-Vector乘法,这在本质上就是不同的。即使在软件层面的优化上,这两个运算也是分别进行优化的(GEMM和GEMV)。
  而对于芯片设计而言,已经面临的挑战是如何设计一个在多变的复用关系下均能保证较高效率的神经网络加速器。完成这一目标,至少有两种不同的设计方向
  具有灵活互联结构的可重构加速器
  标量+矢量+向量的异构加速器

4.1 具有灵活互联结构的可重构加速器

  上述的几乎所有的讨论和设计,都能归结到降低数据带宽上。一旦数据带宽降低后,其灵活性就受到了很大的限制,这是无法计算GEMV的原因之一。如果需要加速器能够在各种情况下有良好的表现,最直接的解决方案就是在设计上提供高的带宽和灵活性。
   Eyeriss V2就采用这种思路对Eyeriss V1进行改进,以高效支持MobileNet。为了提供高带宽,Eyeriss设计了层次化2D Mesh的Noc。
在这里插入图片描述
  设计中一个PE Cluster具有12个PE,12个PE之间互相连接;PE Cluster通过一个2D Mesh进行互联。Global Buffer到PE之间具有丰富的连线,在不同计算模式下可以以Multicast,broadcast和unicast进行数据传输,充分满足不同计算下的数据需求。
在这里插入图片描述
  尽管Eyeriss V2中并没有提到可重构,但其Noc在计算不同网络时有不同的选通路径,和可重构的思想一致。一般谈到硬件可重构,一般会想到FPGA(Field-Programmable Gate Array,现场可编程大规模逻辑门阵列)。通过FPGA片上丰富的的互联结构和查找表,FPGA理论上可以用于实现各种形式的电路。
  FPGA可以创造出各种可能,但FPGA设计上有很多冗余,在布局布线和加载上也会花费较多时间。究其本因,是因为FPGA采用了很底层的基本单元来构建整个电路。与FPGA这种细粒度可重构相对应的是粗粒度可重构网络,粗细度可重构不像FPGA一样可以控制每一个bit的选通,而是提供了一系列基本的计算单元和互联结构。根据算法的需求,可以采用不同的方式构建这些计算单元。譬如Plasticine中的PCU中,每个FU由前向,反馈等多种路径,可以构建不同的计算单元。
在这里插入图片描述
  多个PCU之间通过交换网络和其他PCU及PMU(Memory)相连,可以配合完成不同的操作。这些都以增加片上各个单元之间的互联性为基础。
在这里插入图片描述采用可重构设计的还有清华大学微电子系设计的Thinker芯片,具体可参考A High Energy Efficient Reconfigurable Hybrid Neural Network Processor for Deep Learning Applications(Ref11)。这样的具有灵活互联结构的可重构加速器,可以支持矩阵-矩阵乘法,矩阵-向量乘法以及更多的其他计算,具有较强的灵活性。

4.2 标量+矢量+向量的异构加速器

另一种思路是对某些运算做到极致的支持,其他的运算通过CPU或者其他的Core来计算;从华为达芬奇架构,到Google TPU2/3的设计上,都有的体现,华为的达芬奇架构可参见3.1节,Google V2/3的框图如下:
在这里插入图片描述
  Google的框图并没有透露太多的细节,仅仅表面TPU中由于MXU和scalar/vector units;华为的达芬奇架构则指出了
Vector:2048bit vector with special functions(activation functions,NMS,ROI,SORT)
Cube:4096 FP16 MACs
  虽然Vector Unit似乎并不能计算FC Layer或者Depthwise Conv Layer,但这也代表了一种设计方向。当采用3D Matrix Unit进行矩阵计算时,随着(N)取值的增加,数据输入带宽随增长,而MACs的数量随增长,这表面针对特定的计算进行优化结果可能会更优。当然,这样的设计也有一些缺陷。
  不同计算单元之间负载可能不均衡,导致计算出现瓶颈,不同计算单元之间的数据传输,调度会变得复杂,当然,这种设计思想并不意味一个加速Core只能加速很受限的计算类型,依旧可以对单个的加速Core进行兼容设计,本节的讨论和4.1并不完全冲突。譬如依旧有一些简单方法可以让一个三维的MAC阵列(类似Cube Core)同时支持GEMM和GEMV操作,但依旧会有一些限制,由于数据复用的不同,这两类运算始终落在Roofline模型的不同位置。
  但不管从哪个角度去解决面临的新的挑战,暂时都没有看到一个完美的解决方案。或许我们并不需要一个真正完美的解决方案,能解决一部分问题,创造价值就已经足够了。这里引用Cloud TPU(TPU V2/3)的一些说明。

5. 神经网络中数据复用的展望

  虽然在AI芯片设计过程中,都针对算法进行了深度的优化;同时算法也针对芯片实现进行了定点化和低比特量化等工作:这些看似是一个联合优化的过程。但是归根到底,既然是选择为AI应用设计芯片,在设计过程中,算法永远占主导地位。从长远来看,还需要把握算法的发展趋势。
  站在硬件设计的角度来看,由于在计算机诞生之初就有了高性能并行计算的需求,很多设计实际上以及出现了很长时间,譬如数据并行的向量体系结构,VLIW,脉动阵列,稀疏计算都有40年以上的历史,2D Mesh互联也至少有30年。从设计上看,新的东西并不是很多,架构成功的关键在于是否顺应了时代的潮流,包括算法/需求的发展和底层硬件技术的发展。
  在发展过程中算法和现有的硬件上的分歧往往是存在的,以本文讨论的卷积计算的数据复用为例,这和网络稀疏化的发展方向相悖。如果以极度稀疏化为目标,那么网络计算过程中的数据复用会越来越低。
  神经网络中数据复用的未来如何,完全取决于算法的发展。

参考

1.Hardware Accelerators for Machine Learning (CS 217)
2.volta-architecture-whitepaper.pdf
3.Scalable unified architecture for Neural Network computing (Hotchips 31)
4.In-Datacenter Performance Analysis of a Tensor Processing Unit
5.ACCELERATED MATHEMATICAL ENGINE(Telsa,US20190026078)
6.V Sze, T.-J. Yang, Y.-H. Chen, J. Emer, “Efficient Processing of Deep Neural Networks: A Tutorial and Survey,” Proceedings of the IEEE, vol. 105, no. 12, pp. 2295-2329, December 2017
7.Y-H. Chen, T. Krishna, J. Emer, V. Sze, “Eyeriss: An Energy-Efficient Reconfigurable Accelerator for Deep Convolutional Neural Networks,” IEEE Journal of Solid State Circuits (JSSC), ISSCC Special Issue, Vol. 52, No. 1, pp. 127-138, January 2017.
8.Y.-H. Chen, T.-J Yang, J. Emer, V. Sze, “Eyeriss v2: A Flexible Accelerator for Emerging Deep Neural Networks on Mobile Devices,” to appear in IEEE Journal on Emerging and Selected Topics in Circuits and Systems (JETCAS), June 2019.
9、Zhang J , Franchetti F , Low T M . High Performance Zero-Memory Overhead Direct Convolutions[J]. 2018.
10.hotchips详细介绍了达芬奇架构
11.Prabhakar R, Zhang Y, Koeplinger D, et al. Plasticine: A Reconfigurable Architecture For Parallel Paterns[C]// Acm/ieee International Symposium on Computer Architecture. 2017.
12.A High Energy Efficient Reconfigurable Hybrid Neural Network Processor for Deep Learning Applications[J]. IEEE Journal of Solid-State Circuits, 2018, 53(4):968-982.

相关文章:

AI芯片:高性能卷积计算中的数据复用

随着深度学习的飞速发展&#xff0c;对处理器的性能要求也变得越来越高&#xff0c;随之涌现出了很多针对神经网络加速设计的AI芯片。卷积计算是神经网络中最重要的一类计算&#xff0c;本文分析了高性能卷积计算中的数据复用&#xff0c;这是AI芯片设计中需要优化的重点之一&a…...

gitlab修改默认访问端口

GitLab 自带了一个 Nginx 服务器实例&#xff0c;用于处理 HTTP 和 HTTPS 请求。这个内置的 Nginx 服务器被配置为与 GitLab 应用程序实例一起工作&#xff0c;并且它负责处理所有前端的网络通信。 通过yum或者apt安装Gitlab时&#xff0c;nginx通常是被自带安装并配置好的。 …...

python——异常

Python 中的异常及继承关系 在 Python 中&#xff0c;异常用于表示程序在运行过程中遇到的错误&#xff0c;所有异常类最终都继承自 BaseException。通过异常处理&#xff0c;我们可以捕获和处理这些错误&#xff0c;避免程序崩溃。 Python 异常继承关系图 BaseException-- …...

【人工智能】利用TensorFlow.js在浏览器中实现一个基本的情感分析系统

使用TensorFlow.js在浏览器中进行情感分析是一个非常实用的应用场景。TensorFlow.js 是一个用于在JavaScript环境中训练和部署机器学习模型的库&#xff0c;使得开发者能够在客户端直接运行复杂的机器学习任务。对于情感分析&#xff0c;我们可以使用预先训练好的模型来识别文本…...

Python——扩展数据类型

Python 的扩展数据类型是对内置数据类型的增强&#xff0c;旨在解决特定需求&#xff0c;提供更高级的功能。我们来看一些常见的扩展数据类型及其原理、用途&#xff0c;并通过示例逐步讲解。 1. collections.namedtuple namedtuple 是增强的元组&#xff0c;允许用名称访问元…...

JavaScript 详解——Vue基础

第一章 JavaScript简介 为什么学习javascript &#xff1f; JavaScript 是全球最流行的编程语言。 JavaScript 是属于 Web 的编程语言。 JavaScript 是 web 开发者必学的三种语言之一&#xff1a; HTML 定义网页的内容 CSS 规定网页的布局 JavaScript 对网页行为进行编程 …...

机械行业数字化生产供应链产品解决方案(十二)

我们为机械行业提供的数字化生产供应链解决方案通过集成物联网、人工智能和大数据技术&#xff0c;打造了一套智能化的生产和供应链管理系统&#xff0c;实现了从设计、生产到物流的全程数字化、智能化。该系统通过实时数据采集与分析&#xff0c;优化生产计划和资源配置&#…...

Git——命令集合

Git命令集合 1. 基本操作 1.1 创建版本库 初始化本地仓库&#xff1a;git init添加文件到仓库&#xff1a;git add | git add file file2… | git add.提交文件到本地仓库&#xff1a;git commit -m “message” 1.2 版本回退 查看状态&#xff1a; git status查看全部修改…...

python 数据可视化折线图练习(下:代码演示)

根据上篇对三国疫情情况数据的罗列&#xff0c;构建折线图完成数据展示。&#xff08;示例如下&#xff09; 接下来是具体代码演示 import json from pyecharts.charts import Line from pyecharts.options import TitleOpts , LegendOpts , ToolboxOpts ,VisualMapOpts , T…...

深入探索 Go 1.18 的 debug/buildinfo:构建信息的获取与应用

标题&#xff1a;深入探索 Go 1.18 的 debug/buildinfo&#xff1a;构建信息的获取与应用 引言 Go 语言自 1.18 版本起&#xff0c;引入了对构建信息的标准化处理&#xff0c;这一特性极大地简化了获取程序构建信息的过程。debug/buildinfo 包提供了访问 Go 二进制文件中嵌入…...

Nios II的BSP Editor

1.菜单打开BSP Editor &#xff08;1&#xff09; &#xff08;2&#xff09; &#xff08;3&#xff09; 项目文件夹 -> software文件夹 -> ... _bsp文件夹 -> settings.bsp文件 2.文件打开BSP Editor 选中项目文件&#xff0c;右键&#xff0c;Nios II -> …...

Android-自适用高度的ViewPager

需求 在项目中&#xff0c;我们常常遇到需要动态调整 ViewPager 的高度&#xff0c;以适应其内容大小的需求。默认情况下&#xff0c;ViewPager 的高度是固定的&#xff0c;无法根据每个页面的内容高度进行调整。这会导致在内容高度不一致时&#xff0c;出现不必要的空白区域或…...

代码随想录day38|| 322零钱兑换 279完全平方数 139单词拆分

322零钱兑换 力扣题目链接 题目描述&#xff1a; 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c…...

Cesium天空盒子(Skybox)制作(js代码)和显示

介绍 在Cesium中&#xff0c;星空背景是通过天空盒子方式&#xff08;6张图片&#xff09;来显示的&#xff0c;原生的图片分辨率太低&#xff0c;本项目用于生成天空盒子的6张图片。最终生成的6个图片大小约为500kb(每个)&#xff0c;格式为jpg&#xff0c;总共的恒星数目约为…...

JAVA中的缓冲流BufferedInputStream

在Java中&#xff0c;BufferedInputStream 是一种用于包装其他输入流&#xff08;如 FileInputStream&#xff09;的过滤流。它通过内部缓冲区机制提高了输入流处理的效率。使用缓冲流可以减少读取数据的次数&#xff0c;因为每次从输入流读取数据时&#xff0c;BufferedInputS…...

WindowContainerTransaction类详解(一)

1、WindowContainerTransaction是什么&#xff1a; windowContainerTransaction类的对象是用来存储对windowContainer的修改的一个集合&#xff0c;windowContainer。因为应用侧是无法直接操作windowContainer的&#xff0c;如果应用侧需要修改windowContainer的话&#xff0c…...

安装NFS扩展

#添加helm源 helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner #创建个namespace(可选,主要是为了查看资源方便) kubectl create ns nfs-sc-default #使用helm安装(10.1.129.86为NFS地址,/home/data/nfs…...

计算机网络——运输层(进程之间的通信、运输层端口,UDP与TCP、TCP详解)

运输层协议概述 进程之间的通信 运输层向它上面的应用层提供通信服务。 当网络边缘部分的两台主机使用网络核心部分的功能进行端到端的通信时&#xff0c;都要使用协议栈中的运输层&#xff1b;而网络核心部分中的路由器在转发分组时只用到下三层的功能。 Q1&#xff1a;我们…...

代码随想录算法训练营第一天 | 二分查找

文章目录 Leetcode704 二分查找二分法的使用前提:区间选择其他注意事项 Leetcode27 移除元素解题思路:优化思路 Leetcode704 二分查找 链接&#xff1a;https://leetcode.cn/problems/binary-search/ 代码随想录: https://programmercarl.com/ 时间复杂度: O(logN) 空间复杂度:…...

python相关知识

1、注释 共有三种&#xff1a;#、 、””” ””” 2、数据类型 整数、浮点、字符串、布尔、列表、元组、集合、字典 num1 666、num2 3.14、t1 True、t2 False、 列表&#xff1a;list [1,2,3,4] 元组&#xff1a;tuple (11,aaa,ddd,3) 字典&#xff1a;dict {li…...

Visual Studio 2022 LNK2001无法解析的外部符号 _wcscat_s 问题记录

ANSI C程序中&#xff0c;用到了wcsrchr、wcsncpy_s、wcscat_s、wcscpy_s等几个字符串函数&#xff0c;但是编译时提示&#xff1a; 错误 LNK2001 无法解析的外部符号 _wcscat_s 查了挺多帖子&#xff0c;没有解决。 https://bbs.csdn.net/topics/250012844 解决VS编译…...

Java高并发处理机制

高并发处理的思路&#xff1a; 扩容&#xff1a;水平扩容、垂直扩容缓存&#xff1a;将基础的数据放入缓存进行处理使用SpringCloud的注册中心&#xff0c;分服务注册到同一个注册中心&#xff0c;服务器检测使用Spring的熔断操作&#xff0c;检测服务器的心跳那个正常随机跳转…...

7 数据存储单位,整型、浮点型、字符型、布尔型数据类型,sizeof 运算符

目录 1 数据类型的分类 2 数据存储单位 2.1 位 2.2 字节 2.3 其余单位 3 整数类型 3.1 基本介绍 3.2 整型的类型 3.2.1 整数类型多样性的原因 3.2.2 整型类型之间的相对大小关系 3.3 整型注意事项 3.4 字面量后缀 3.5 格式占位符 3.6 案例&#xff1a;声明并输出…...

导游职业资格考试真题题库

导游职业资格考试真题题库 80.重庆有"雾都"之称。壁山区的()全年雾日多204天&#xff0c;堪称"世界之最"。 A.枇杷山 B.雾灵山 C.云雾山 D.四姑娘山 答案&#xff1a;C 81.我国最具热带海洋气候特色的地方为&#xff08;&#xff09;。 A.广西壮族…...

【Rust】使用开源项目搭建瓦片地图服务

本文通过获取在线和离线地图数据&#xff0c;使用开源Rust项目搭建瓦片地图服务&#xff0c;并使用DevExpress的MapControl控件使用自建地图服务 获取地图数据 获取地图数据有很多种方式&#xff0c;这里分别用在线和离线地图数据举例说明 在线下载瓦片地图 打开在线瓦片地…...

【面试宝典】mysql常见面试题总结(上)

一、MySQL 中有哪几种锁&#xff1f; MySQL中的锁机制是数据库并发控制的重要组成部分&#xff0c;它用于管理多个用户对数据库资源的访问&#xff0c;确保数据的一致性和完整性。MySQL中的锁可以根据不同的分类标准进行分类&#xff0c;以下是一些常见的分类方式及对应的锁类…...

第1章 初识C语言

第1章 初识C语言 1.1 C语言概述 1.1.1 C语言的发展历史 C语言的原型为ALGOL 60语言&#xff08;也称A语言&#xff09;。 1963年 剑桥大学将ALGOL 60语言发展成为GPL语言。 1967年 剑桥大学的Matin Richards简化GPL&#xff0c;产生了BGPL语言。 1970年 美国贝尔实验室的Ken…...

【考研数学】定积分应用——旋转体体积的计算(一文以蔽之)

目录 一、如何计算旋转体体积&#xff1f;思考一个小例子 二、旋转体体积的二重积分表达式 三、用真题&#xff0c;小试牛刀 定积分的应用中&#xff0c;有一类题是求解旋转体的体积问题。 相较于记忆体积计算公式&#xff0c;有一种通法求解体积更不容易出错&#xff1a;二重…...

PHP移动端商城分销全平台全端同步使用

&#x1f4f1;【掌中购物新纪元&#xff1a;探索移动端购物商城系统的无限魅力】&#x1f6cd;️ &#x1f680; 随时随地&#xff0c;购物自由新体验 在这个快节奏的时代&#xff0c;移动端购物商城系统彻底颠覆了传统购物方式&#xff0c;让消费者享受到了前所未有的便捷与…...

TLE8386-2EL:汽车级DC-DC转换器中文资料书

描述 TLE8386-2EL是一款具有内置保护功能的低端感应升压控制器。该器件的主要功能是将输入电压升高&#xff08;升压&#xff09;到更大的输出电压。开关频率可从100kHz调整至700kHz&#xff0c;并可与外部时钟源同步。 TLE8386-2EL的独特功能可将关断电流消耗降至 <2μA。该…...