平板电脑对比平台测试鼠标性能的网页2023年11月21日

Mark wiens

发布时间:2023-11-21

  以上优化办法的结果能够经由过程 CPE 来襟怀,在 Intel Core i7 Haswell 的测试成果以下……

平板电脑对比平台测试鼠标性能的网页2023年11月21日

  以上优化办法的结果能够经由过程 CPE 来襟怀,在 Intel Core i7 Haswell 的测试成果以下。从测试成果来看:

  以上优化不依靠于目的机械的任何特征,只是简朴地低落了历程挪用的开消,和消弭一些 “阻碍优化的身分”,这些身分会给编译器优化带来艰难。要停止进一步优化,需求理解一些硬件特征。下图是 Intel Core i7 Haswell 的硬件构造的后端部门:

  要写出高机能的代码,起首需求对编译器有根底的理解,缘故原由在于当代编译器有很强的优化才能,但有些代码编译器不克不及停止优化。对编译器有了根底的理解,才气写出编译器友爱型高机能代码。

  MegCC 中完成了很多高机能的深度进修算子,卷积和矩阵乘法是典范的计较麋集型的算子,同时卷积也能够借助矩阵乘法来完成 (im2col/winograd 算法等)测试鼠标机能的网页。

  可是 combine3 比拟 combine2 并没有机能提拔,缘故原由是因为轮回中的别的操纵的耗时能够袒护挪用 get_vec_element 的耗时,之以是能够袒护,得益于 CPU 撑持分支猜测和乱序施行,本文的前面会简朴引见这两个观点。

  提早界线:任何须须根据严厉次第完成combine运算的函数所需求的最小 CPE,即是功用单位的提早。

  这些算术运算的提早、发射工夫和容量会影响上述combine函数的机能,我们用 CPE 的两个界线来形貌这类影响。吞吐界线是实际上的最优机能。

  MegCC 在 ARM 平台撑持了 NEON DOT 和 I8MM 指令完成的矩阵乘和卷积测试鼠标机能的网页。一条DOT指令可完成 32 次乘加运算 (16 次乘法和 16 次加法运算);一条I8MM指令可完成 64 次乘加运算 (32 次乘法和 32 次加法运算)。这就是 SIMD 手艺可以加快计较的道理。

  一个法式起首要包管准确性,在包管准确性的根底上,机能也是一个主要的考量。要编写高机能的法式,第一,必需挑选适宜的算法和数据构造;第二,该当编写编译器可以有用优化以转换成高效可施行代码的源代码,要做到这一点,需求理解编译器的才能和限定;第三,要理解硬件的运转方法,针对硬件特征停止优化。本文偏重睁开第二点和第三点。

  凡是 for 轮回会占有法式施行的大部合作夫,下图是combine4的 for 轮回对应的数据流图。此中箭头唆使了数据的流向。能够将存放器分为四类:

  容量:某种施行单位的数目。从上图能够看出,在EUs中,有 4 个整数加法单位 (INT ALU)、1 个整数乘法单位 (INT MUL)、1 个浮点数加法单位 (FP ADD) 和 2 个浮点数乘法单位 (FP MUL)。

  因为combine函数需求 load 数据,故要同时遭到加载单位的限定。因为只要两个加载单位且其发射工夫为 1 个周期平板电脑比照平台,以是整数加法的吞吐界线在本例中只要 0.5 而非 0.25。

  轮回:这些存放器既作为源值,又作为目标,一次迭代中发生的值会被下一次迭代用到,本例中的%rdx和%xmm0。因为两次迭代之间无数据依靠,以是对此类存放器的操纵凡是是法式机能的限定身分。

  上图中,次要存眷施行单位 (EUs),施行单位由多个功用单位构成。功用单位的机能能够由提早、发射工夫和容量来襟怀。

  combine1的实如今轮回测试前提中重复挪用了函数vec_length,在此场景下,屡次挪用vec_length会返回一样的成果,以是能够改写为combine2的完成停止优化。在极度状况下平板电脑比照平台,留意制止重复挪用返回一样成果的函数是更有用的。比方,若在轮回完毕前提中挪用测试一个字符串长度的函数,该函数工夫庞大度凡是是O(n),若明白字符串长度不会变革,重复挪用会有很大的分外开消。

  分支猜测:当碰到分支时,硬件会猜测分支的走向,假如猜测胜利则可以放慢法式的运转,可是猜测失利的话则需求把提早施行的成果抛弃,从头 load 准确指令施行,会带来比力大的猜测毛病处罚。

  SIMD是别的一种行之有用的机能优化手腕,差别于指令级并行,其接纳数据级并行。SIMD 即单指令大都据,一条指令操纵一批向量数据,需求硬件供给撑持。X86 架构的 CPU 撑持 AVX 指令集,ARM CPU 撑持 NEON 指令集。在我们开辟的一款深度进修编译器 MegCC 中,就普遍利用了 SIMD 手艺。MegCC 是旷视天元团队开辟的深度进修编译器,其承受 MegEngine 格局的模子为输入,输出运转该模子所需的一切 kernel,便利模子布置,具有高机能和轻量化的特性。为了便利用户将别的格局的模子转换为 MegEngine 格局模子,旷视天元团队同时供给了模子转换东西 MgeConvert,您能够将模子转换为onnx,然后利用 MgeConvert 转换为 MegEngine 格局模子。同时假如您想测试您装备上某条指令的吞吐和提早,以指点您的优化,能够利用 MegPeak。

  上面经由过程一个例子引见几个优化法式机能的手腕。起首界说一个数据构造 vector 和一些帮助函数,vector 利用一个持续存储的数组完成,可经由过程typedef来指定元素的数据范例data_t平板电脑比照平台。

  为了阐发在当代处置器上施行的机械级法式的机能,我们引入数据流图,这是一种图形化暗示办法,展示了差别操纵之间的数据相干是怎样限定它们的施行次第的。这些限定构成了图中的枢纽途径,这是施行一组机械指令所需时钟周期的一个下界。

  颠末 combine4 将中心成果暂存到暂时变量的优化,能够看到即便利用 -O1 的编译优化,也比 combine3 -O2 的编译优化机能更好,表白即便编译器有壮大的优化才能,可是留意细节来编写高机能代码也长短常有须要的。

  在引见之前,我们先引入一个法式机能襟怀尺度每元素的周期数(Cycles Per Element, CPE),即每处置一个元素需求破费的周期数,能够暗示法式机能并指点机能优化。

  乱序施行:指令的施行次第一定和其誊写的次第分歧,可使硬件到达更好的指令级并行度。次要是经由过程乱序施行、次第提交的机制,使得可以得到和次第施行分歧的成果。

  将简化完的数据流图停止简朴地反复,能够获得枢纽途径,以下图。假如combine4入网算的是浮点数乘法,因为撑持指令级并行,浮点数乘法的的提早可以袒护整数加法 (指针挪动,图中右半边的途径) 的提早,以是combine4CPE 的实际下界就是浮点乘法的提早 5.0,与上面给出的测试数据 5.01 根本分歧。

  历程(函数)挪用会发生必然的开消,比方参数通报、clobber 存放器保留规复和转移掌握等。以是能够新增一个函数get_vec_start返回指向数组的开首的指针,在轮回中制止挪用函数get_vec_element。这个优化存在一个 trade off,一方面能够必然法式提拔法式机能,另外一方面这个优化需求晓得 vector 数据构造的完成细节,会毁坏法式的笼统,一旦 vector 修正为倒霉用数组的方法存储数据,则同时需求修正combine3的完成。

  能够显式利用__restrict润饰指针,表白不存在和被润饰的指针指向统一块内存的指针,此时编译器会将twiddle3优化为和twiddle2等效。可自行经由过程反汇编的方法察看汇编码进一步了解。

  假设增长暂时变量的个数进一步增长轮回睁开次数测试鼠标机能的网页,实际上能够进步指令并行度,终极到达吞吐界线。可是不克不及有限定地增长轮回睁开次数,一是因为硬件的功用单位有限,CPE 的下界由吞吐界线限定,到达必然水平后持续增长也不克不及进步指令并行度;二是因为存放器资本有限,增长轮回睁开次数会增长存放器的利用,利用的存放器个数超越硬件供给的存放器资本以后,则会发作存放器溢出,能够会需求将存放器的内存暂时保留到内存,利用时再从内存规复到存放器,反而招致机能的降落,以下表中轮回睁开 20 次相较睁开 10 次机能反而略有降落。荣幸的是,大大都硬件在存放器溢出之前曾经到达了吞吐界线。

  吞吐界线:功用单位发生成果的最大速度,由容量/发射工夫决议测试鼠标机能的网页。若利用 CPE 襟怀,则即是容量/发射工夫的倒数。

  combine5的枢纽途径的数据流图以下,图中有两条枢纽途径,但两条枢纽途径是能够指令级并行的,每条枢纽途径只包罗n/2个操纵,因而机能能够打破提早界线,实际上浮点乘法的 CPE 约为5.0/2=2.5。

  今朝为止,我们法式的机能只到达了提早界线,这是由于下一次浮点乘法必需等上一次乘法完毕后才开端,不克不及充实操纵硬件的指令级并行。利用轮回睁开的手艺,能够进步枢纽途径的指令并行度。

  combine1 版本差别编译优化级别测试鼠标机能的网页,-O1 的机能是 -O0 的两倍,表白开启恰当地编译优化级别是很有须要的。

  一样地,combine3 的 -O2 版本比 -O1 版本机能好许多,从汇编码能够看到,-O2 时比 -O1 每次轮回削减了一次对 (% rbx) 的读,更主要的是消弭了对 (% rbx) 写后读的访存依靠。

  因为函数f的完成能够以下,存在side effect,以是编译器不会将func1优化为func2。假如本意期望完成func2版本,则该当间接写成func2的情势,可削减 3 次函数挪用。

  Intel Core i7 Haswell 的功用单位机能数据(单元为周期数)以下,引自《深化了解计较机体系》第五章:

  为了包管法式运转的准确性,编译器不会对代码的利用处景做任何假定测试鼠标机能的网页,以是有些代码编译器不会停止优化。上面举两个比力隐晦的例子。

  在上面的完成中,轮回中每次城市去读一次写一次dest,因为能够存在memory aliasing,编译器会慎重地停止优化。上面别离是-O1和-O2优化级别时,combine3中for轮回部门的汇编代码。能够看到,开启 -O2 优化时,编译器帮我们把中心成果存到了暂时变量中(存放器 % xmm0),而不是像 -O1 优化时每次从内存中读取;可是思索到memory aliasing的状况,即便 -O2 优化,仍然需求每次轮回将中心成果保留到内存。

免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186