没有合适的资源?快使用搜索试试~ 我知道了~
3420使用长SIMD指令的高效直接卷积0位于西班牙加泰罗尼亚巴塞罗那的巴塞罗那超级计算中心,巴塞罗那,加泰罗尼亚,西班牙,alexandre.delimassantana@bsc.es0Adrià Armejach0位于西班牙加泰罗尼亚巴塞罗那的巴塞罗那超级计算中心,巴塞罗那,加泰罗尼亚,西班牙,adria.armejach@bsc.es0Marc Casas0位于西班牙加泰罗尼亚巴塞罗那的巴塞罗那超级计算中心,巴塞罗那,加泰罗尼亚,西班牙,marc.casas@bsc.es0摘要本文证明了在支持SIMD指令的架构上计算卷积的最先进提案在长SIMD长度下性能不佳,原因是频繁的缓存冲突丢失。首先讨论了如何将最先进的SIMD直接卷积适应使用长SIMD指令的架构,并分析了增加SIMD长度对算法公式的影响。接下来,我们提出了两种新的算法方法:有界直接卷积(BDC),通过限制暴露给硬件的计算量来减轻缓存丢失,以及多块直接卷积(MBDC),通过重新定义激活内存布局来改进内存访问模式。我们在一个具有16,384位SIMD寄存器的架构上,使用ResNet卷积评估了BDC、MBDC、最先进技术和专有库。我们的结果显示,对于ResNet-101,BDC和MBDC相对于最先进技术的加速比分别为1.44×和1.28×,相对于专有库的加速比分别为1.83×和1.63×。0CCS概念:• 计算理论→算法设计和分析;•计算机系统组织→单指令多数据。0关键词:高性能卷积,软件优化,SIMD架构,向量架构0未经费用许可,允许个人或课堂使用本作品的全部或部分数字或硬拷贝,前提是不得制作或分发以获取利润或商业优势,并且复制件上必须带有本通知和第一页的完整引文。必须尊重ACM拥有的本作品组件的版权。允许带有信用进行摘要。要进行其他复制,或重新发布,或发布到服务器上,或重新分发到列表上,需要事先具体的许可和/或费用。请向permissions@acm.org申请权限。PPoPP'23,2023年2月25日至3月1日,加拿大蒙特利尔,魁北克省,加拿大©2023年计算机协会。ACM ISBN 979-8-4007-0015-6/23/02...$15.00https://doi.org/10.1145/3572848.357743503430PPoPP '23,2023年2月25日至3月1日,加拿大蒙特利尔,魁北克省,加拿大Alexandre de Limas Santana,Adrià Armejach和Marc Casas0•证明了在SIMD架构上运行卷积工作负载的最先进方法在长SIMD架构的背景下性能不佳。0•提出了有界直接卷积(BDC)算法,该算法在不停顿功能单元的情况下,明智地限制了暴露给硬件的计算量,以减少数据缓存冲突丢失。0•提出了改善内存访问模式的多块直接卷积(MBDC)算法,通过重新定义张量的内存布局。0•在SX-Aurora[30]处理器上评估了BDC、MBDC和最先进方法的性能,SX-Aurora是一种具有16,384位SIMD寄存器的架构。我们的分析包括vednn[22]中的卷积算法,这是一个经过高度调优的供应商专有库。我们的结果表明,对于ResNet-101工作负载,BDC和MBDC相对于最先进方法的加速比分别为1.44×和1.28×,相对于vednn的加速比分别为1.83×和1.63×。02卷积原语二维卷积在计算机视觉模型[11,25,28]中被广泛使用,它是一个函数,涉及三个秩-4张量操作数:两个张量描述源(�)和目标(�)激活,最后一个张量(�)表示滤波器权重。激活张量(�和�)的维度表示:小批量大小(�),输入或输出特征映射的数量(��和��),激活高度(��和��)和宽度(��和��包含输入(��)和输出(��)特征映射以及感知域高度(��)和(��)的维度。在本文中,我们使用元组来描述这些张量形状,遵循最先进的惯例[1,15]。我们将�和�表示为(�,��,��,��)和(张量表示为(��,��,��,��)。�张量在前向卷积期间在�张量上滑一系列在它们共享维度上的形状为(��,��,��)的3D交叉点。每叉点通过交叉区域内的逐元素乘法的求和来生成一个输出元素。该例程在�张量的空间域中扫描,然后在小批量中的不同��索引和图像之间重复,最终组成�张量的数据。额外的卷积参数,步长(����)和填充(����),决定如何通过跳过激活或在空间域考虑零填充来移动�张量。训练DNN模型需要另外两个传递:后向数据和后向权重。在后向数据方向中,�张量在�张量上滑动并计算关于�张量操作数的偏导数。后向数据输出一个新张量�����前向卷积相同0算法1 Naive卷积0输入: � , � , � ��� , � ��� 输出: �01: for � = 0 , � do02: for �� = 0 ,�� do 3:for �� = 0 , �� do04: for �� = 0 ,�� do05: for �� = 0 ,�� do06: for �� = 0 , �� do07: ih = oh * � ��� + kh - � ���08: for �� = 0 , �� do09: iw = ow * � ��� + kw - � ���010: � [n,oc,oh,ow] += � [n,ic,ih,iw] * � [oc,ic,kh,kw]0形状与�相同,并将其传播回先前的模型层,在该层被称为� ��� �,即输出张量的梯度。在反向权重传递过程中,算法对� ��� �和�张量进行卷积,计算权重梯度或� ��� �,然后将其应用于�张量以调整权重。尽管不同的方向改变了张量的角色,但这些变化并不会深刻影响计算的方式。实际上,该算法在所有方向上共享相同的结构和优化,只有一些例外情况涉及大型滤波器和非单位步长[10],这在计算机视觉工作负载中不是标准的。算法1显示了一个简单的二维前向卷积,突出显示了包含单个融合乘加(FMA)操作的七个嵌套循环。循环和底层张量内存布局可能会发生变化,但是只要保持内存偏移量的计算一致,输出就保持不变。反向权重和反向数据方向使用类似的循环结构,在哪个张量是输出方面有所不同,即在反向数据传递期间为�张量,在反向权重期间为�张量。02.1 高性能卷积0每个卷积输出元素是独立的,适合于SIMD并行执行模型。前向、反向数据和反向权重方向分别包含� ∙ �� ∙ �� ∙ ��、� ∙ �� ∙ �� ∙ ��和�� ∙ �� ∙ �� ∙��个独立的输出元素,定义了卷积的高度并行性。实际上,高效的卷积算法主要依赖于将并行资源正确映射到卷积循环和增加各个内存级别的数据重用策略[4,27]。卷积可以转化为GEMM[2, 5,29]和FFT[19]问题,并使用高度优化的数学内核库进行求解。加速卷积的其他技术包括使用量化和降低精度的数据类型[3,17],这些技术在减少模型精度的同时减少了张量内存占用。3440使用长SIMD指令的高效直接卷积 PPoPP '23, 2023年2月25日-3月1日,加拿大蒙特利尔0表1. 应用于SIMDCPU的架构分析模型。假设为32位浮点数据类型。0架构 � ���� � � �� E0Intel Skylake 16 2 5 160 NEC SX-Aurora 5123 8 1228802.2 SIMD直接卷积算法直接卷积算法通过使用缓存阻塞和循环重新排列等优化来加速计算。之前的研究为配备SIMDISA的CPU提出了高效的卷积算法[8, 10,31],对于一些ResNet[11]层,AVX512处理器可以达到90%的理论峰值性能。这些提案制定了SIMD直接卷积算法,避免了FFT和GEMM的解决方案所需的im2col转换的内存开销[5,19]。尽管存在一些细微的差异,但是所有的SIMD直接卷积变体都应用了一组由分析架构模型[12,18]驱动的优化。这些模型指导了注册阻塞因子等优化变量的定义。现代数值内核库,如oneDNN[15]和VEDNN[22],包含SIMD直接卷积算法的实现,支持Tensorflow[1]、Caffe[16]和PyTorch[23]等软件工具。本文后面的第5节将展示,将最大SIMD长度与优化变量不必要地关联在一起会削弱该技术在具有长SIMD寄存器的架构上的性能。03 架构分析模型0我们使用在高性能GEMM[18]和卷积[31]内核的优化工作中采用的分析SIMD机器模型来解释我们的算法设计选择。该模型考虑了SIMD架构的以下硬件特性:SIMD寄存器:SIMD指令从/到SIMD寄存器中消耗和产生数据,每个寄存器的SIMD长度为�����个元素。SIMD指令可以访问的逻辑向量寄存器总数为FMA单元:这些单元支持SIMD融合乘加(FMA)指令,延迟为����个周期。硬件将SIMDFMA指令调度到����个独立的FMA处理单元。每个FMA单元都可以通过每个周期发出指令来完全进行流水线处理。当所有����个量FMA单元都被完全使用时,SIMD架构可以实现理论峰值性能。要保持这种性能,需要对架构暴露多个独立计算(E)。公式1表达了模型架构变量之间的关系,以避免寄存器依赖停顿,并充分利用CPU的深度SIMD流水线。0E ≥ ����� ∙ ���� ∙ ���� (1)0表1显示了SX-Aurora[30]和IntelSkylake[9]架构的�����、����和����以及E参数的值。如表所示,长SIMD架构(如SX-Aurora)要求并行算法相对于IntelSkylake等512位架构需要暴露出数量显著更大的独立FMA计算E。这种差异不仅源于更大的向量长度(�����),还源于增加的FMA单元(����)和FMA延迟(����)。04 在长SIMD架构上的直接卷积本节介绍如何将最先进的技术[8, 10,31]应用于长SIMD架构上的直接卷积。我们在第5节中使用这个公式来揭示在长SIMD架构上显现的缺点。我们的提案在第6节中通过将某些算法方面适应更长的SIMD长度来改进这个公式。除非另有说明,本节讨论的卷积都是指前向数据方向,当需要时会提供必要的评论。第8节评估了所有方向,证明了我们的贡献对所有方向都有益处。04.1 使用SIMD指令和寄存器阻塞使用SIMD指令允许CPU利用数据级并行性,这对应于公式1的贡献。寄存器阻塞优化为所有FMA单元提供了独立的计算,以防止由于指令之间的数据依赖而导致CPU停顿。变量A和B代表公式1中的SIMDFMA单元的数量和延迟。我们使用SIMD指令在特征图维度(��)上运行计算,遵循当前的做法[8, 10,31]。我们通过因子���和���对输出张量的空间维度(��和��)进行寄存器阻塞。由于E = ���� ∙ ��� ∙�����,并根据公式1,阻塞因子必须满足公式2,在约束条件���� ∙ ��� <������下,创建���� ∙ ���个独立的累加链,每个链包含�����个元素。0A��� ∙ A�� ≥ A�� ∙ A�� (2)0在反向数据传播中,输出张量是A����,我们在A��维度上使用SIMD指令,并将A��和A��维度应用寄存器阻塞。在反向权重传播期间,输出张量是A����,我们选择最大的特征图方向(A�或A�)进行矢量化,因为两者都可用。我们对较小的特征图维度应用寄存器阻塞,使用单个寄存器阻塞因子(A���)。3450PPoPP '23年2月25日至3月1日,加拿大蒙特利尔 Alexandre de Limas Santana,Adrià Armejach和Marc Casas0宽度0I 0,0 I 0,1 I 0,2 I 0,3 … I 0,w-101 I h-1,2 … I h-1,w-10I 1,0 I 1,1 I 1,2 I 1,3 … I 1,w-1 I 0,0 I 0,1 I 0,2 I 0,3 … I 0,w-10 I h-1,2 … I h-1,w-10I 1,0 I 1,1 I 1,2 I 1,3 … I 1,w-1 I 0,0 I 0,1 I 0,2I 0,3 … I 0,w-10I h-1,0 I h-1,1 I h-1,2 … I h-1,w-10I 1,0 I 1,1 I 1,2 I 1,3 … I 1,w-1 I 0,0 I 0,1 I 0,2I 0,3 … I 0,w-10I h-1,0 I h-1,1 I h-1,2 … I h-1,w-10I 1,0 I 1,1 I 1,2 I 1,3 … I 1,w-10特征0映射0高度0N vlen0图1.SIMD直接卷积中使用的高性能激活张量内存布局。箭头表示连续内存位置中的数据元素。请注意,特征图块交错了相邻空间点的数据。04.2 张量内存布局0最先进的卷积实现[15]使用了一种张量内存布局,通过单位步幅的SIMD加载/存储指令,使得部分和可以在寄存器和内存之间移动。图1描绘了这种内存布局,通过使用黑色箭头来指示单位步幅访问,将其应用于激活张量。该内存布局通过以A���和A��特征图维度为块,块尺寸为A�����,将块拉到内存中的最内度来构建。以下元组表示我们考虑的张量�,�和�的内存布局,从外到内的维度顺序为:(�,A�/A���,A�,A�,A���),(�,AA���)和(A�/A���,A�/A���,A��,A�,A���,A���)。A���� ��时,��循环进行矢量化,��循环接收寄存器阻塞优化并并行执行。04.4长SIMD架构的直接卷积算法我们在算法2中展示了在长SIMD架构上计算前向直接卷积的算法。我们在第1-2行设置了动态缓存阻塞因子。第3-4行驱动寄存器阻塞,如4.1节所述。接下来,第5行为所有SIMD指令设置了工作的SIMD长度。以下代码行指定了(i)调度循环,出现在第6-10行;和(ii)微内核,包括第11-19行。调度循环组织子卷积的顺序,而微内核指的是计算密集区域。后一段在第11,15和18行具有完全展开的循环,这些循环通常由即时(JIT)汇编器[8,10]或静态编译技术和手动调整的代码段的集合[14,32]生成。1011021031043460高效使用长SIMD指令的直接卷积 PPoPP '23年2月25日至3月1日,加拿大蒙特利尔056x56,64 28x28,128 14x14,256 7x7,5120ResNet 3x3卷积0内存占用(KB)0512位1024位02048位16384位0图2.SIMD直接卷积算法微内核区域的内存占用,考虑使用不同矢量长度的架构进行3x3卷积。0最内层的卷积循环(第13行)包含对共享的A操作数(第14行)的矢量加载以及一系列标量加载(第16行)和SIMDFMA指令(第17行)。我们在第17行使用了一个标量乘法操作A�,A,它被所有主要的新兴矢量ISA支持,如RISC-V V[6],ARM SVE [26]和NEC SX-Aurora[30]。在此FMA操作中,CPU隐式地广播标量元素,形成一个临时矢量操作数,而无需使用专用矢量寄存器。05 直接卷积的不足05.1 微内核内存占用过大 卷积微内核的内存占用由 � , � 和 �子张量驱动。�子张量在算法2的第14行中被访问,由于它应用于所有空间输出点(�.�.,第9和第10行的循环)。因此,应将其保留在缓存层次结构中,直到第8行的循环的下一次迭代。将卷积微内核区域的内存占用限制在最后一级缓存(LLC)大小足以满足此条件,并避免在第14行进行不必要的片外内存访问。微内核区域加载 �� � ∙ ��� ∙ �� ∙ �� 权重元素,�� � ∙ ��� ( �� � + ��, �� ) ∙ ��� ( �� � + ��源张量元素,并将 �� � ∙ �� � ∙ �� �元素移动到/从目标张量。由于参数 �� � 和 �� � 都与 � ����相关联,正如我们在4.2节中解释的那样,架构向量长度的增加会使权重子张量大小呈二次增长。这个问题主要影响具有大型滤波器的卷积,其中 �� 和 ��循环的迭代次数进一步加剧了这个问题。图2描述了VGG[25]和ResNet[11]模型中的3x3卷积的内存占用,其中在具有16384位向量的架构中,内存占用可以达到9兆字节。x轴以激活空间大小和特征图通道数来描述卷积层。05.2 内存访问模式显示高缓存缺失率0描述在支持长SIMD指令的CPU上,激活内存布局(第4.2节)和寄存器块优化定义了一种标量内存访问模式,导致频繁的L1数据缓存冲突缺失。图3说明了前向传播过程中 �张量上的此内存访问模式。黑色箭头表示具有 � ����步长的访问的动态顺序,与特征图块因子相匹配。此模式还在反向数据和权重方向的�张量中表现出来。当使用长SIMD指令时,一系列步长等于SIMD长度(�����)的内存访问仅在累积偏移循环到达缓存寻址空间时访问了一小部分缓存集。� ���� 与缓存行大小(� �����)之间的关系通常遵循� ����� =2 � ∙ � ����� 且 � ≥0的规则,导致访问相同序列的缓存集,与缓存关联性无关。最终,如果此类访问的系列足够大,以至于循环到达总缓存大小之前,第一个缓存行可能会在在下一个卷积循环中访问时被替换。公式3指定了一个不等式,指示直接卷积中的缓存冲突缺失何时出现。该公式依赖于(i)L1缓存大小(� 1����);(ii)构成卷积步长参数(� ���)和激活张量特征图块因子(��)之间的空间点之间的距离;以及(iii)在重复之前访问先前访问的缓存行的空间点的数量(由寄存器块优化定义为 �� � ∙ ���)。激活张量特征图块因子 � � 可以是�� �或���,具体取决于算法使用标量指令访问的张量。0� 1 ���� < � � ∙ �� � ∙ �� � ∙ � ��� (3)0具有32KBL1缓存和16384位宽向量寄存器的架构(例如SX-Aurora[30])要求一个组合的寄存器块因子( �� � ∙ �� �)为24,以避免数据依赖停顿,根据公式2和表1的数据。假设卷积中 � ��� 为1,� � 为16384(� ����),由于不可解的不等式(16 > ��� ∙ �� � 且 24 < �� � ∙ �� �),不可能同时满足公式2和3的不等式。冲突缺失严重削弱了第4.1节和第4.2节中描述的优化的有效性,使得无法充分利用计算,要么是因为寄存器文件被闲置,导致流水线依赖停顿,要么是因为SIMD通道因等待来自L1的数据依赖而饥饿。我们在第8节的评估中验证了这一现象在SX-Aurora上的存在。0,0,20,1,20,2,20,3,20,4,20,5,20,6,20,0,10,1,10,2,10,3,10,4,10,5,10,6,10,0,00,1,00,2,00,3,00,4,00,5,00,6,0… 1,0,21,1,21,2,21,3,21,4,21,5,21,6,21,0,11,1,11,2,11,3,11,4,11,5,11,6,11,0,01,1,01,2,01,3,01,4,01,5,01,6,0… 3470PPoPP ’23, 2023年2月25日至3月1日,加拿大蒙特利尔,Alexandre de Limas Santana,Adrià Armejach和Marc Casas0特征图0块0( RBw = 7 ) 寄存器块高度0( RBh = 2 )0首次访问0图3. 前向传播过程中SIMD直接卷积对 �张量的内存访问模式示例。当使用长SIMD指令时,此访问模式对少数缓存集进行了强调,从而导致冲突缺失。06 使用长SIMD指令的高效直接卷积0本节描述了我们的算法解决方案,以有效地使用长SIMD指令运行直接卷积操作。第6.1节描述了一种方法,动态地减少卷积微内核的内存占用,并解决了第5.1节中讨论的问题。第6.2节和第6.3节介绍了两个提案,通过巧妙限制向SIMD单元暴露的计算量以及调整激活张量内存布局来减少缓存冲突缺失的数量。06.1 动态调整微内核内存占用0我们提出了一种方法,可以自动适应包括长向量的多个SIMD架构的卷积微内核的内存占用。我们的方法结合了两种策略:循环重新排序和循环调整,实现了一个动态自动调整算法。循环重新排序:减少卷积的内存占用最简单的方法是将权重空间域上的循环(�� 和 ��)从微内核移动到子卷积调度区域。然而,这种技术不适用于1x1卷积,并且会降低常规卷积上 �张量的L1缓存重用,需要对 �张量激活进行额外的遍历。循环调整:另一种策略是减少微内核循环在输入特征图块上的迭代次数(算法2第13行中的最后一个循环迭代器)。通过将此循环的迭代次数从 �� � 减少到 � ,内存占用降低相同的比例,同时仍然访问所有带入L1缓存的数据。我们在此进行了反映0此外,我们还对权重张量的内存格式进行了改进,其中我们将 � 张量的 �� 维度阻塞因子与 �� � 关联起来,将 �张量元组表示从 ( �� / �� � , �� / �� � , ��, ��, �� � ,�� � ) 改为 ( �� / �� � , �� / � ����� , ��, ��, � ����� ,�� � )。0算法3 自动调整算法0输入: ��, ��,��,��, ��, ��, ��,�� 架构变量: � ���� , � ����� , ��� ���� 输出: �� � , �� � , �� �01: �� � = �� 2: �� � = �� 3: �� � = ��04: �� � = ��� ( ��, � ���� ) 5: ��� = ��� ( ��, �� � + �� � − 1 ) 6: ��� = ��� ( ��, �� � + �� � − 1 ) 7: � ���= �� � ∙ �� � ∙ �� � ∙ �� � 8: � ��� = �� � ∙ �� � ∙ �� �9: � ��� = �� � ∙ ��� ∙ ���010: while � ��� + � ��� + � ��� > ��� ���� do 11: if �� � > 2 � � ����� then012: �� � = �� � / 2013: else if �� � > 1 then014: �� � = 1015: �� � = ��017: else if �� � > 1 then018: �� � = 1019: �� � = ��020: ��� = ���(��, �� �)021: � ��� = �� � ∙ �� � ∙ �� � ∙ �� �022: � ��� = �� � ∙ �� � ∙ �� �023: ∙ ���0return ( �� � ,�� � ,�� � )0我们通过一种算法来应用上述策略,该算法优先考虑循环调整而不是循环重新排序。该算法通过使用张量大小和以下架构参数作为输入,找到适合缓存的最大 �子张量大小:(i)向量长度(� ����),(ii)缓存行大小(������),以及(iii)LLC存储容量(�������)。该算法在算法2的第13行生成块因子 �� �,�� � 和 �� �,根据卷积问题和目标架构在运行时决定它们的大小。算法3显示了此过程。该方法最初假设在卷积微内核区域的权重子张量上具有最高可能的循环值(第1-3行)。首先在第4-9行计算 � , � 和 �张量的内存占用量,然后在第10行将其与LLC大小进行比较。该例程在第11-12行应用循环调整策略,减小 ��循环大小,除非此减小会使其小于缓存大小。3480通过长SIMD指令实现高效直接卷积 PPoPP ’23,2023年2月25日至3月1日,加拿大蒙特利尔 Alexandre de Limas Santana,Adrià Armejach和Marc Casas0循环重新排序回退策略发生在第13-16行和17-20行,通过将��和��的循环迭代次数设置为1来实现。在这些安排之后,程序重新计算微内核的内存占用(第21-23行),并在第10行开始另一次迭代。算法3在第8、9、22和23行将激活张量的内存占用乘以线程数以适应具有共享缓存的多核系统。06.2有界直接卷积有界直接卷积(BDC)算法通过较不激进的下限来减少 �� � 和 �� 优化变量的缓存冲突缺失,并采用我们在第6.1节中描述的方法将微内核的内存占用适应缓存层次结构。我们根据以下观察,放宽了式(2)的不等式:支持长SIMD指令的CPU架构是加载/存储机器,因此需要用于加载FMA标量操作数和更新内存偏移量以供将来的标量加载的标量代码。这些标量指令位于SIMD FMA指令之间,并在依赖SIMDFMA之间创建一些距离。我们还使用式(3)来设置寄存器块因子的上限,以防止内存访问模式引发缓存冲突缺失。我们将这两种方法结合起来,制定了�� � 和 �� �优化变量的值范围,描述在式(4)中,避免数据依赖停顿和缓存冲突缺失。0� � �� ∙ � � ��/� ��� ≤ �� � ∙ �� � < � 1 ����/� �0式(4)引入了一个新的变量 � ���,它是直接卷积微内核区域中连续SIMDFMA之间的最小指令距离。经验证明,针对RISC-V“V”[6]和SX-Aurora[30]ISA的编译器在向量FMA指令之间使用两个标量指令:(i)标量加载将值带入寄存器,(ii)加法更新 �张量内存指针。因此,在这种情况下,� ���的距离为三,因为后续的SIMDFMA前进了三个指令。在SX-Aurora中,将 �� �设置为三允许寄存器块因子低至8,与先前的最小值24相比。06.3多块直接卷积多块直接卷积(MBDC)算法重新定义了特征张量内存布局的块因子,改善了卷积微内核的内存访问模式,并减少了缓存冲突缺失。�张量内存访问模式在� ���� = ������时不会引起冲突缺失,因为�� � 和�� � 也变为������,即在这种情况下对�张量的访问间隔只有一个缓存行,意着所有缓存集都被压力测试。0算法4 MBDC ( � ��� =1, � ��� =0)0输入:源激活 �,权重张量 � 输出:输出激活 � 架构变量:� ����,� ����,� �����优化变量:�� �,� ���,�� �01: �� � = ����� 2: �� � = ����� 3: �� � = ���(� �����,��)04: �� � = ���((� ����� - �� �)/��, 1) 5: ��� = ����_�������(��,��, � �����) 6: �� = ���(��, � ����) � 向量长度07: for � = 0, � do 8: for �� =0,��/��� do09: for �� = 0, ��/��� do010: for �� = 0,��/�� � do011: for �� = 0,��/��� do012: for ��� = 0, ��/�� � do013: for ��� = 0, ��/��� do014: for ( �,� ) = ( 0 : �� � , 0 : �� � ) do � 展开循环015: �� �,� = �������(�[�][��][�� + �][�� + �][0], ���, ��)016: for ( ��,��,� ) = ( 0 : �� � , 0 : �� � , 0 : �� � ) do017: �� = �����(�[�][�/���][��][��][�%���][0], ��)018: for ( �,� ) = ( 0 : �� � , 0 : �� � ) do � 展开循环019: �� �,� = �[�][���][��� + �� + �][��� + �� + �][�]020: �� �,� = ����(�� �,� , �� �,� , ��, ��)021: for ( �,� ) = ( 0 : �� � , 0 : �� � ) do � 展开循环022: ������� ( �� �,� , �[�][��][�� + �][�� + �][0] , ���, �� )0根据这个观察,我们建议通过 � ����� 来阻塞 � 和 � 张量,而不是 � ����。这种改变将架构向量长度与优化变量 �� � 和 �� � 分离,以改善 �张量标量访问模式的局部性。我们提出的减少 �� � 和 �� � ,从 � ���� 到 � �����,将特征图尺寸划分为散布在激活张量内存布局中的较小块。由于内部尺寸小于 � ����,使用单元跨度向量加载/存储(即算法2中的第12和19行)无法一次移动一个完整的矢量寄存器的特征图数据。因此,我们在算法2的第12和19行使用粗粒度的聚集/散射指令来支持我们提出的内存布局。算法4描述了 MBDC。�� � ,�� � 和 �� �的值由我们在第6.1节中描述的动态方法确定。第15行和第22行的聚集/散射操作替换了涉及算法2中的 �张量的矢量加载/存储。在第5行计算索引,并在方程5中定义32位元素。3490PPoPP ’23,2023年2月25日至3月1日,加拿大蒙特利尔,魁北克,加拿大 Alexandre de Limas Santana,Adrià Armejach和Marc Casas0尺寸 � ����� 形成大小为 �� ∙ �� ∙ � �����的子张量,导致32位元素的块之间的距离为 � /( � ����� / 4 ) ∙ 字节。我们注意到第9行和第16行中的循环的迭代次数,这些循环利用了由自动调整器动态确定的微内核计算粒度。0� [ � ] = ��� [( � /( � ����� / 4 ) ∙ �� ∙ �� + � % ( � ��0从内存到寄存器的聚集操作和从寄存器到内存的分散操作通常会导致显著的性能损失。新兴的SIMD指令集通过支持不同类型的聚集/分散操作来降低这种损失,包括连续和非连续内存访问的组合。例如,RISC-V V1.0[6]支持每个索引聚集/分散的元素多达128位,可以看作是四个连续的32位字块。ARM SVE[26]支持组合聚集/分散操作,通过为每个索引返回两个连续元素来减少单独的内存请求次数。SX-Aurora[30]支持二维向量加载/存储,模拟整个128字节缓存行的矢量聚集/分散。我们利用粗粒度聚集/分散操作来加载/存储非连续的 � ����� 块,并减少CPU发出的内存请求次数。06.4 总结表2总结了本节和我们的设计贡献,显示了原始的针对512位SIMD指令的直接卷积,其适应长SIMD架构(第4节),以及我们的两个新算法贡献:(i) BDC和(ii)MBDC。激活块列显示了每个算法用于 �� � 和 �� �变量的值,该值定义了激活张量的内存布局。权重块列显示了权重张量的分块因子,该因子还负责定义权重张量的内存布局。调度粒度定义了卷积微内核区域内 ��块循环的最小迭代次数。寄存器块列定义了不同算法的组合寄存器块大小的值范围。该表突出了我们提案的主要要点:(i)BDC上的新寄存器块大小约束,以及(ii)MBDC上的激活内存布局的重新定义。06.5 实现0我们按照oneDNN[15]库的设计方式阐述我们的贡献,其中内核的实例化遵循一个两步过程,包括:(i)初始问题声明和(ii)内核执行。算法3在问题声明期间接收架构变量和卷积参数,包括张量形状,并计算所有优化变量。这些信息被编码为0在数据结构中维护并转发到代码生成器引擎,可以是JIT汇编器或一组静态调优函数。代码生成器返回与卷积微内核区域相对应的函数指针。稍后,在内核执行期间,卷积调度循环调用微内核函数指针。07 实验方法0卷积工作负载:我们考虑了ResNet[11]
下载后可阅读完整内容,剩余1页未读,立即下载
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/default.jpg!1)
cpongm
- 粉丝: 4
- 资源: 2万+
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
会员权益专享
最新资源
- 京瓷TASKalfa系列维修手册:安全与操作指南
- 小波变换在视频压缩中的应用
- Microsoft OfficeXP详解:WordXP、ExcelXP和PowerPointXP
- 雀巢在线媒介投放策划:门户网站与广告效果分析
- 用友NC-V56供应链功能升级详解(84页)
- 计算机病毒与防御策略探索
- 企业网NAT技术实践:2022年部署互联网出口策略
- 软件测试面试必备:概念、原则与常见问题解析
- 2022年Windows IIS服务器内外网配置详解与Serv-U FTP服务器安装
- 中国联通:企业级ICT转型与创新实践
- C#图形图像编程深入解析:GDI+与多媒体应用
- Xilinx AXI Interconnect v2.1用户指南
- DIY编程电缆全攻略:接口类型与自制指南
- 电脑维护与硬盘数据恢复指南
- 计算机网络技术专业剖析:人才培养与改革
- 量化多因子指数增强策略:微观视角的实证分析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)