网络能成为AI加速器吗

news2024/10/1 1:16:46

网络能成为AI加速器吗

摘要

人工神经网络(NNs)在许多服务和应用中扮演越来越重要的角色,并对计算基础设施的工作负载做出了重要贡献。在用于延迟敏感的服务时,NNs通常由CPU处理,因为使用外部专用硬件加速器会效率低下。然而,随着工作负载规模和复杂性的增长,CPU已经达到了计算极限,需要引入新的专门针对该任务的专用硬件加速器。在本文中,我们分析利用可编程网络设备,如网络卡和交换机,作为NN加速器的选项,以取代专门构建的硬件。为此,在本初步工作中,我们深入分析了在CPU上进行NN处理的属性,推导出有效分割此类处理的选项,并显示可编程网络设备可能是实现CPU的NN协处理器的适当引擎。

CCS概念

• 网络→可编程网络;网络内处理;
• 计算方法学→机器学习;
• 计算机系统组织→神经网络;

关键词

计算卸载;可编程交换机;智能网卡

1 引言

NN是一种机器学习工具,在分类任务中最近表现出比其他方法更好的性能,例如在计算机视觉中。该技术在不同领域的广泛应用显着影响了数据中心的工作负载,这些数据中心现在将大量计算资源用于执行NN [5]。

NN工作负载有两个阶段。训练阶段用于学习NN的权重,使NN适应特定任务。训练完成后,NN用于推理阶段。通常,训练是纯离线任务,计算成本高,但频率相对较低。推理阶段轻得多,但可能需要执行许多次,并具有潜在的非常严格的延迟约束,因为NN的预测可能作为在线服务的一部分使用。

由于计算成本高,训练阶段通常由专用硬件加速器执行,例如通用GPU。这些设备可以对大量数据进行并行计算,使计算更快,更便宜,因此具有经济可行性。尽管如此,使用加速器会产生一些开销。首先,数据需要在计算节点内移动,即从通用CPU,其中对其进行预处理,到连接到机器PCIe总线的加速器。其次,当前的加速器在处理更大的批次时提供更高的效率。附加的数据移动和批处理的需求最终影响整个端到端延迟。因此,使用常规CPU处理NN推理阶段通常更有效,特别是在处理延迟敏感的工作负载时 [6]。

不幸的是,Dennard的比例缩小挑战着进一步扩展CPU的计算能力的能力[4]。事实上,Facebook报告称,对于一些当前的机器学习工作负载,更高效的单个CPU机器被不那么高效但更强大的多CPU机器替换以匹配所需的性能水平[6]。同样,谷歌已经设计并部署了TPU,这是专门用于NN推理工作负载的自定义ASIC [9]。
鉴于这种前提,随着在线和时间敏感的推理工作负载增长,似乎我们只有两个选项来处理它们:i)使用今天的加速器进行在线NN处理,接受相关的低效率;ii)或经过努力和复杂性设计和部署新的专用加速器专门用于NN推理。

相反,我们寻求第三种替代方案,利用网络设备协助在计算机的CPU上执行的计算。换句话说:网络可以成为加速器吗?

我们的工作得出两个观察结果。首先,网络接口卡(NIC)和交换机越来越多地包括可编程功能。这种可编程性肯定有助于解决典型的网络数据包处理功能的实现,但它也为以有利于终端主机应用程序的方式执行数据包处理提供了巨大的机会[3,8,13]。也就是说,编程网络设备操作的能力突然将一个仅移动数据的愚笨管道变成了一个在数据流动时转换数据的处理管道。其次,这些设备已经坐落在数据路径上,这最小化了执行额外昂贵的数据移动的需求,并减少了端到端处理延迟。

为了实现这一愿景,我们提供了三个贡献:

i)我们详细分析了使用深度卷积NN执行推理所需的计算,并在不同的机器配置上对其进行了分析。我们的分析表明,在处理完全连接的层时,CPU不能以全速发挥作用,主要是因为需要由于内存缓存未命中而暂停CPU的流水线。

ii)建立在这一观察基础上,利用NN的分层结构,我们分析了分割NN处理的选项,以便将(一部分)NN的层从CPU卸载到不同的处理器。我们发现可以定义一个NN执行拆分,以最小化将计算从一个处理器移动到另一个处理器的开销。

iii)我们最后的贡献是评估NIC和交换机在哪些条件下适合作为CPU的协处理器处理NN。我们通过设计BaNaNa Split来实现这一点,该解决方案利用最近的技术来执行NN模型量化,并在基于网络处理器的SmartNIC和可编程交换芯片上执行这些量化模型。虽然仍处于早期阶段,但BaNaNa Split表明,已经可用的网络硬件可以帮助处理当前报告的数据中心NN推理工作负载的大部分。

我们相信我们的发现可能促进NN处理基础设施和网络设备研究的讨论。

2 背景

2.1 人工神经网络

NN是由互相连接的神经元组成的层次结构。神经元从前一层的神经元获取输入(称为激活),并将其输出发送到下一层的神经元。一般来说,可以将一层视为一个黑盒子,它接受一个激活向量并将其转换为输出向量。层数,它们的类型以及每层神经元的数量是NN的超参数,最终影响网络执行任务的能力。例如,完全连接层(fc)有神经元,它们将前一层神经元的所有输出作为激活,并将它们的输出提供给下一层的所有神经元。仅具有fc层的网络称为多层感知器(MLP)。深度NN具有超过三层,其中卷积NN(CNN)最近在某些分类任务中取得了出色的表现,特别是在计算机视觉中。图1显示了AlexNet [12] CNN的层次序列。卷积(conv)和fc层具有权重,称为NN的参数,与层神经元的每个输入相关联。其余层仅执行某些固定的激活变换,因此没有权重。

值得注意的是AlexNet模型末尾的三个fc,因为单独看它们与MLP模型非常相似。这是所有CNN的共同特征。其他类型的NN,例如循环NN,具有不同的结构,本文不涉及。

在推理工作负载组成方面,MLP远远是最常见的NN,其次是RNN和CNN,分别占工作负载的61%,29%和5%[9]。由于MLP可以视为CNN的特例,在本文的其余部分中,我们将重点关注CNN,特别是AlexNet。实际上,最近的NN可能具有更多的层,然而,由于额外的层只是在图1中呈现的层的重复,因此由于其相对简单性,AlexNet模型仍然是一个有效的示例,可以简化表述。

image-20230621111737066

图1:AlexNet[12]的层序列

2.2 神经网络加速器

NN加速器,如通用GPU(GPGPU),通常作为附加硬件板连接到机器的PCIe总线上。这些设备通常使用单指令多数据(SIMD)范例执行大规模并行计算。因此,当执行给定任务时,它们在大量数据上有效使用,通常使用批处理。因此,从系统角度来看,使用加速器执行NN推理的过程如下。首先,通过机器的NIC接收包含推理任务的请求,并将其发送到RAM上的PCIe总线。其次,CPU执行请求的预处理以提取NN输入,并将其添加到当前批次中。第三,一旦批次组成,就将其传输到加速器中执行推理。第四,结果被复制回主存储器,通过PCIe总线传输。最后,CPU准备将结果传输到网络,即将其放置在网络数据包中,并再次通过PCIe总线将其传输到NIC。我们期望前端服务器将接收到这样的结果,并将其包含在面向用户的服务中。

批处理的需求和PCIe总线上的数据移动会显著增加NN推理的端到端处理延迟。例如,[9]报告,在他们特定的设置中,GPGPU的批处理大小必须从64减少到16以满足处理延迟限制。这迫使GPGPU以37%的峰值性能工作(在这种情况下使用64个批次时实现的)。此外,即使Google专门针对推理工作量设计和部署了加速器(即TPU),在某些情况下,将数据传输到/从TPU的时间也可能占据处理时间的71%。

3 工作负载分析

为了理解NN加速器的问题,在本节中,我们分析了AlexNet在推理期间所需的处理。我们进行了从模型结构派生的静态分析和在CPU上处理期间使用的系统资源的运行时分析。

3.1 结构分析

image-20230621123816832

图2:每层的输出大小和参数

对于给定的网络模型,NN层的参数数量以及激活和输出向量的大小是固定的。图2a显示了每个AlexNet层的输出向量大小(请注意,初始输入大小由直方图最左侧的条形表示)。有趣的是,一些层的输出向量比它们的激活向量更大(例如,conv2具有69K元素的输入和产生186K元素的输出),而对于其他层,情况相反(例如,pool1层从290K到69K显着减少了输出元素的数量)。此外,值得注意的是,fc层的激活和输出向量远小于其他层,从不超过9K。

有趣的是,图2b显示参数数量遵循不同的分布:conv层最多具有885K个参数(conv3),而fc具有更多的参数,最多可达37M(fc6)。

3.2 运行时分析

image-20230621124032366

图3:每层的推理延迟

image-20230621124346257

图4:IPC和L3高速缓存丢失

我们在一个由双套接字(NUMA)机器组成的测试平台上运行AlexNet,运行Linux内核4.10,使用两个Intel Xeon E5-2650 CPU(每个CPU具有8个核心@2.4GHz),禁用超线程,并且每个套接字具有16GB的RAM。每个CPU具有32KB的L1数据和指令缓存,并且每个核心具有256KB的L2缓存。20MB的L3缓存由所有CPU的核心共享。我们使用perf收集性能计数器,采用10ms轮询间隔并避免硬件计数器多路复用。AlexNet使用针对Intel处理器优化的Caffe框架实现[10],以利用CPU的矢量处理功能等。

我们对系统进行仪器化,以收集总体和每层的推理延迟。此外,我们收集硬件计数器,以测量执行期间的每周期指令数(IPC),停滞周期数以及L1(数据),L2和L3缓存未命中数。所有测量都使用专用CPU上的单个独立核心执行(即,同一CPU的所有其他核心都处于空闲状态,因此L3缓存完全专用于运行AlexNet的核心)。

图3显示了处理单个激活向量时执行AlexNet的每个层所需的时间。在这些层中,conv2,conv3和conv1的执行时间最长,然后是fc6和其他层。
查看硬件计数器,我们得出NN执行期间实现的IPC(图4的实线)。我们发现,执行pool5层及以下的层可实现IPC 3.2,这意味着CPU的流水线已满,并且处理是计算密集型的。相反,执行fc层的IPC低于1。这个较低的值是由于大量停滞周期引起的,这些停滞周期是由所有缓存级别的缓存未命中引起的。即,系统必须等待从RAM读取数据。图4的虚线显示fc层的L3缓存未命中率增加。

这种性能可以快速解释为fc层执行的计算类型,它对权重值的重用很少。这与这些层参数的大量数量一起导致CPU缓存的低效使用。作为参考,仅fc6的参数需要151MB的内存,考虑到每个参数在32b上表示,即CPU缓存中可用空间的7倍。

3.3 批处理效应

image-20230621124236163

表1:批处理与顺序推理处理时间比较

image-20230621124412040

图5:归一化的每层推理延迟

我们重新运行了之前的测试,对16、32、64个激活向量的批处理进行推理。在表1中,我们比较了执行批处理和顺序执行批中包含的激活所需的时间。我们可以看到,与顺序执行相比,批处理减少了总体处理时间,减少范围从16个向量批处理的13%到64个向量批处理的9%。这确实证实了批处理提高了处理效率。

为了了解提高效率的原因,表1的最后一行报告了批处理的效果,如果我们关注fc层的处理时间配额。此外,在图5中,我们比较了每个层的处理延迟对总体推理处理延迟的相对贡献,考虑到非批处理执行和使用64个向量批处理的执行。很明显,批处理对fc层的效益最大,从处理延迟的总体贡献20%到仅4%。换句话说,批处理提高处理效率的大部分原因是由于处理fc层的效率提高。这得到了硬件计数器的分析证实,它显示IPC的增加和缓存未命中的减少。这种行为很容易解释,因为与非批处理情况相反,现在在缓存中加载的参数在批处理中的每个向量中都被重复使用,然后被丢弃。

不幸的是,批处理显着提高了NN的平均响应时间,因为只有在整个批处理完成处理后,才能提供NN推理的结果。

4 神经网络分割

对AlexNet的运行时分析显示,CPU对于conv、pool和norm层是高效的执行器,但在处理fc层时效率要低得多。也就是说,在处理fc层期间,CPU的流水线会在很大一部分时间内停滞,这实际上浪费了其他有用的计算能力。批处理改善了这种情况,但对于延迟敏感的在线工作负载而言,这是一种不可行的方法。

考虑到仅由fc层组成的NN在NN工作负载中占据了绝大部分(参见第2节),因此开发解决方案以改进这些层的执行显然可以提供重要的好处。也就是说,合适的fc层执行器一方面可以降低推理处理延迟,另一方面可以释放CPU资源,这些资源可以更好地用于其他工作负载。

在试图确定可编程网络设备是否可以成为高效的fc层执行器之前,值得评估和量化可能由两个不同执行器之间的NN处理分割引入的附加开销。这将有助于确定使用当前加速器的问题。

特别地,我们首先验证将执行分割在两个执行器之间是否会对处理效率产生影响,例如由于潜在的冷缓存效应或无法利用某些数据预取。然后,我们量化由执行器之间的额外数据移动引入的成本。

4.1 分割处理开销

为了评估对处理效率的影响,我们选择两个同质的执行器,但具有独立的内存和缓存,即我们NUMA机器的两个CPU。使用CPU可以通过它们的插座之间的快速QPI互连交换数据,从而最小化数据移动的开销。此外,由于我们使用同质的执行器,因此我们可以直接将分割执行的测量结果与非分割执行的测量结果进行比较。

为了测试我们的测试平台,我们修改了我们的NN实现,以生成两个进程,每个进程执行NN的一部分。第一个进程执行其层处理直到分割点,然后将中间结果传输给第二个进程,后者继续处理直到NN的末端。两个进程都将网络模型加载到其各自的NUMA节点的本地RAM中。

图6a的QPI图表显示,在分割NN执行时存在开销,与非分割执行情况相比,推理时间可能高出8%,在某些情况下几乎没有增加。当分割发生在具有大输出向量的层之后时,开销会更高。

测试结果表明,开销主要是由于需要等待将输入向量加载到第二个CPU的缓存中。这个解释可以很容易地验证,因为在较小的输入层之前分割执行的开销总是在1.3%以内。

4.2 通信开销

image-20230621124834506

图6:不同分割点的标准化推理延迟和通信开销故障

在这第二个测试中,我们再次将处理的执行分割在我们NUMA机器的两个CPU之间,但是这一次,我们强制它们之间的通信通过NIC进行。也就是说,我们用一根电缆将NIC的端口连接在一起形成一个循环,并修改我们的NN实现以使用TCP连接传输中间数据(在分割点)。为了避免连接建立和TCP慢启动的开销,连接被预先打开并配置了非常大的初始拥塞窗口。

如预期的那样,端到端处理延迟增加。图6a的NIC条形图显示,延迟增加范围在2-12%之间,并且遵循与QPI条形图类似的模式。

图6b显示了由于通信引入的开销的三个部分的细分:(i)数据序列化时间,需要准备中间结果进行传输;(ii)传输时间,需要通过TCP套接字发送数据并在另一端接收数据,例如它包括通过PCIe总线和NIC端口传输数据的时间;(iii)数据反序列化时间,需要准备接收到的数据以供喂给NN的第二部分。在这三个组成部分中,仅当分割发生在具有大输出向量的层之后时,传输时间才显著大,否则只会贡献数十到数百微秒。相反,序列化和反序列化时间的组合始终提供约300微秒的额外延迟,在较小的网络上可能是显著的。例如,网络末尾的三个fc层总共需要约19ms进行处理,因此额外的1ms将对应约1.5%的延迟增加。

4.3 总结

本节中提供的测试确认并澄清了使用当前加速器执行NN推理时存在的问题。一方面,如果仔细选择分割点,则可以限制分割NN执行的开销。这表明使用加速器执行部分NN处理是可能的。另一方面,将数据移动到加速器的成本可能是显着的,特别是对于较小的网络,这证实了[9]中报告的数字。

5 BaNaNa SPLIT

前面几节中呈现的结果强调了在使用离线加速器(如GPGPUs或TPUs)时,数据移动的开销是一个重大问题。然而,如果加速器实现在已经在路径上的网络设备中,那么这种额外的数据移动是不需要的。

也就是说,为了将NN处理结果发送回请求者(例如服务前端),必须从CPU/内存向NIC(然后是交换机)传输数据。因此,如果在路径上的网络设备可以执行NN处理,它们将主要引入由于处理分割而产生的开销。正如我们所看到的,如果仔细选择分割点(即考虑层输入大小),这种开销可能非常小。但是,SmartNIC和可编程交换机能否执行NN处理呢?

这些设备的硬件架构确实包括大量的快速SRAM,可以容纳NN的参数(或其中一部分)。但是,它们通常只设计用于执行简单操作,不包括NN所需的相对复杂的算术运算。

为了解决这个问题,我们引入了BaNaNa Split。我们的方法利用了最近在NN研究中的进展,显示在许多情况下,通过称为量化的过程可以简化NN的fc层,而不会牺牲太多模型准确性[7、11、18]。量化模型减少了用于表示NN激活和参数的位数,因此比其原始版本更小。这有助于将模型参数适当地放入大型SRAM中。此外,一些量化技术使得可以使用更简单的算术运算,这些运算可以由当前的网络设备支持[17]。

因此,给定一个NN模型,BaNaNa Split的工作方式如下。在配置时间,它将模型分割到fc层之前。第一组层将在CPU上执行。其余的层经历了一个量化过程,实际上将原始的NN模型转化为可以适当地编程执行的形式。在运行时,NN推理请求首先由机器的CPU处理,然后,中间结果被封装在网络数据包中(例如在头部),并发送到机器的(Smart)NIC。在这里,中间结果由NIC处理以执行量化层。最后,量化层输出再次封装在网络数据包中,然后发送到其最终目的地。

由于中间结果封装在数据包中,BaNaNa Split可能会将计算分配给路径上的不同设备,包括SmartNIC和可编程交换机。

5.1 实现

我们的概念验证原型设计用于与现有的商用网络设备配合使用。它使用二值化作为量化技术,即激活和参数都使用1b表示。得到的NN称为二值神经网络(BNN)[2],只需要实现位逻辑操作和人口计数计算[7、11、18]。因此,BNN处理的实现可以由当前的SmartNIC和可编程交换机支持。特别是,我们使用N2Net [21]在可编程交换机上实现BNN,并进一步扩展它以添加基于网络处理器的SmartNIC支持。N2Net是一个编译器,给定一个BNN模型描述,生成用于配置类似于RMT的交换机管道的P4 [1]程序。我们的SmartNIC扩展替换了N2Net的人口计数实现,以利用内置的支持此类操作的功能,如果可用的话[3]。

早期测试。在撰写本文时,我们仍在构建一个完整的端到端原型。因此,在这里我们仅提供一个微基准测试的结果,该测试评估使用基于网络处理器的SmartNIC执行单个(二值化的)fc层,其中包含4096个神经元。

这样的层的激活向量包含4096b,即512B,因此编码在单个网络数据包中。该层的参数大小为2MB,并且在运行执行之前预配置。在这里,需要注意的是,高性能网络设备通常不使用缓存层次结构来为内存服务数据包处理,以提供快速且保证的内存访问时间。在这些条件下,我们的SmartNIC实现需要1毫秒来处理该层。

对于交换芯片评估,我们仅基于RMT架构提供了一个估计,基于[21]中报告的数字。在这种情况下,我们假设交换机在处理单个数据包时最多可以并行执行96个神经元。实际上,这将需要将数据包循环43次,以执行该层的4096个神经元。不幸的是,我们无法将这些数字直接链接到处理延迟,因为我们尚未在可编程硬件交换机上测试我们的原型。

6 讨论

image-20230621125448567

图7: BNN fc执行延迟

许多研究正在探索可编程网络设备在协助处理不同类型工作负载方面的适用性[3、8、13-15、19、20]。BaNaNa Split加入了这个列表,探索了当前可编程网络设备作为神经网络加速器的适用性。

然而,我们的工作必然建立在重要的假设基础之上。首先,我们严重依赖量化的神经网络模型。虽然很有前途,但这些模型仍然非常研究导向,它们的广泛应用尚未得到证明。因此,这些方法的成功可能会对使用(当前的)网络硬件作为神经网络加速器的可能性产生重大影响。

其次,我们目前假设我们可以将整个层的参数适配到网络设备的快速内存中。即使使用量化模型,我们也没有考虑到利用相同内存的传统网络功能。为了缓解这个问题,可以在NIC和多个正常路径交换机之间分配NN计算。

另一个重要的观察是,在使用量化模型时存在微妙的副作用。也就是说,它们更小,可以在CPU上提高执行效率,减少加速的需求。图7展示了这种效应,当AlexNet的fc层的大小缩小到二值化层的大小时,处理时间缩短到原始处理时间的21%,从而减少了像BaNaNa Split这样的解决方案可能带来的潜在好处。尽管如此,考虑到工作负载的大小(参见第2节),即使在缩小后,仍然可以从CPU中卸载出相当大的工作量。

在相关工作方面,应该指出微软的BrainWave [16]使用网络附加的FPGA加速神经网络。BaNaNa Split的方法不同之处在于它使用进行数据包处理的网络设备硬件来执行NN处理,而在我们的理解中,BrainWave可以被认为是部署在“靠近”网络的专用加速器。

7 结论

虽然远未完成系统实现,但我们的研究和早期原型表明,确实可以将某些工作负载潜在地卸载到网络设备上,并且有理由这样做,特别是当端到端处理延迟成为问题时。特别是,当处理神经网络的全连接层时,CPU速度受到内存访问时间的限制。因此,大量的CPU计算能力会浪费在停滞的周期上。将这些层的执行卸载到网络设备上可以提高整个基础设施的效率,为更计算密集的工作负载释放CPU。尽管如此,BaNaNa Split方法的适用性仍需要解决优化神经网络模型和网络设备架构的开放性挑战。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Magisk hide/Denylist 核心原理分析 ROOT隐藏的实现浅论

前言 当手机安装magisk后,全局的挂载空间会受到变更,magisk给我们挂载上了一个su二进制,这就是我们能够访问到su命令的原因 无论是Magisk hide还是Denylist,我们都可以将它们的工作分成两个部分,第一个部分是如何监控…

vue2中引入天地图及相关配置

前言 项目中需要引入特殊用途的地图,发现天地图比高德地图、百度地图要更符合需求,于是看了看天地图。 正文 vue2项目中如何引入天地图并对相关的配置进行修改使用呢?官方给的4.0版本的使用说明。 引入: 进入到public/index.html中…

使用逻辑回归LogisticRegression来对我们自己的数据excel或者csv数据进行分类--------python程序代码,可直接运行

文章目录 一、逻辑回归LogisticRegression是什么?二、逻辑回归LogisticRegression进行分类的具体步骤二、逻辑回归LogisticRegression进行二分类的详细代码三、逻辑回归LogisticRegression的广泛用途总结 一、逻辑回归LogisticRegression是什么? 逻辑回…

小白白也能学会的 PyQt 教程 —— QRadioButton 介绍以及基本使用

文章目录 一、QRadioButton快速入门1. QRadioButton简介2. QRadioButton快速上手 二、响应单选按钮点击事件1、信号和槽机制:2、创建槽函数来响应单选按钮点击:3、示例:执行特定操作或显示相关内容: 三、单选按钮的常用功能和属性…

三维形体投影面积

🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之&#…

petalinux 生成SDK报错排除

AAA: 在项目文件下新建Qt5文件夹文件夹内新建文件并且设置对应参数 文件夹路径: project-spec/meta-user/recipes-qt/qt5 新建文件 vim ./qt5/qt3d_%.bbappend vim ./qt5/qtquickcontrols2_%.bbappend vim ./qt5/qtserialbus_%.bbappend 文件内容 qt3d_%.bbap…

完美解决Non-terminating decimal expansion; no exact representable decimal result.异常

我们在使用BigDecimal进行精确计算时常常会出现Non-terminating decimal expansion; no exact representable decimal result.异常。 出现这个异常的原因在于 BigDecimal 是不可变的、任意精度的有符号十进制数,所以可以做精确计算。但在除法中,准确的商…

ernie-layout笔记

1: 识别文档中文字以及准确的对这些文字排序是必须的一步骤 采用 OCR技术识别文字以及对应的图像坐标信息,光栅扫描以生成输入序列按照从左到右,从上到下的顺序;但是以上方法针对复杂的结构就会出现问题;因此文章使用了Document-P…

Spring源码核心剖析 | 京东云技术团队

前言 SpringAOP作为Spring最核心的能力之一,其重要性不言而喻。然后需要知道的是AOP并不只是Spring特有的功能,而是一种思想,一种通用的功能。而SpringAOP只是在AOP的基础上将能力集成到SpringIOC中,使其作为bean的一种&#xff…

算法程序设计 之 循环赛日程表(2/8)

一、实验目的: 理解并掌握分治算法的基本思想和设计步骤。 二、实验内容 设有n个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2&#xff0…

HOOPS Web SDK 2023 Crack

在 HOOPS WEB 平台上释放 3D 的力量 HOOPS Web 平台加速 Web 应用程序开发,提供先进的 3D Web 可视化、准确快速的 CAD 数据访问和 3D 数据发布软件开发工具包 (SDK)。 构建 3D WEB 应用程序 借助 HOOPS Web 平台,快速构建适用于…

值得收藏的 10个 Android 手机恢复丢失文件的工具榜单

尽管我们尽可能避免这种情况,但有时我们还是会不小心删除 Android 设备上的重要文件。无论是照片、视频、文档还是任何其他形式的数据,数据丢失都会带来巨大的痛苦。不幸的是,Android 设备没有内置恢复工具。但是,有一些第三方恢复…

里程碑式突破!关键的薛定谔猫编码能带来更好的量子比特

​ 薛定谔的猫编码插图(图片来源:网络) 来自瑞士洛桑联邦理工学院(EPFL)的科学家提出了一种突破性的量子计算容错方案,称为“关键的薛定谔猫编码”。这种新颖的系统在混合状态下运行,具有强大的…

容灾与备份区别、灾备技术、容灾体系规划

1.容灾备份的区别 容灾 (Disaster Tolerance):就是在上述的灾难发生时,在保证生产系统的数据尽量少丢失的情况下,保持生存系统的业务不间断地运行。 容错 (Fault Tolerance):指在计…

激光显示技术路线之争:超级全色激光技术ALPD5.0更先进

5月以来,智能投影市场爆发的激光显示技术路线之争愈演愈烈,各厂家带领自有的技术路线你方唱罢我登场,犹如一出愈演愈烈的大戏,吸引了业内外各界的目光。 从极米在5月10日2023春季新品发布会上率先向三色激光技术发难,再到坚果投影首席产品官在朋友圈发文炮轰极米的技术路线,随…

MarkDown常用功能

快捷键 撤销:Ctrl/Command Z 重做:Ctrl/Command Y 加粗:Ctrl/Command B 斜体:Ctrl/Command I 标题:Ctrl/Command Shift H 无序列表:Ctrl/Command Shift U 有序列表:Ctrl/Command Shif…

【二叉树part01】| 二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代遍历

目录 ✿二叉树的递归遍历❀ ☞LeetCode144.前序遍历 ☞LeetCode145.二叉树的后序遍历 ☞LeetCode94.二叉树的中序遍历 ✿二叉树的迭代遍历❀ ☞LeetCode144.前序遍历 ☞LeetCode145.二叉树的后序遍历 ☞LeetCode94.二叉树的中序遍历 ✿二叉树的统一迭代遍历❀ ☞Lee…

CTFshow-pwn入门-前置基础pwn32-pwn34

FORTIFY_SOURCE FORTIFY_SOURCE(源码增强),这个其实有点类似与Windows中用新版Visual Studio进行开发的时候,当你用一些危险函数比如strcpy、sprintf、strcat,编译器会提示你用xx_s加强版函数。 FORTIFY_SOURCE本质上一种检查和替换机制&am…

算法程序设计 之 矩阵连乘(3/8)

一、实验目的: 理解动态规划算法的基本思想和设计步骤; 掌握动态规划算法的典型应用范例——矩阵连乘。 二、实验内容 矩阵连乘 给定n个可乘的数字矩阵A1,…,An,以及矩阵的阶p0* p1, p1* p2,…, pn-1* pn,求给定矩阵链的最优计算次序使得所需…

JavaWeb之文件的上传和下载

文章目录 文件的上传基本介绍文件上传的HTTP协议的说明commons-fileupload.jar 常用API介绍说明fileupload类库的使用 文件的下载基本介绍和使用说明中文名乱码问题解决方案 文件的上传和下载,是非常常见的功能。很多的系统中,或者软件中都经常使用文件的…