问题标签 [micro-architecture]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
144 浏览

cpu-architecture - 为什么 FADDP D-form 在 Cortex-A72 上的吞吐量高于 FADDP Q-form

我一直在根据一个粗略的经验法则进行操作,如果您有足够的数据进行操作,Q-form ASIMD 指令与 D-form 一样好或更好。因此,在阅读Cortex-A72 软件优化指南的第 3.15 节时,我很惊讶地看到FADDP,D 型的吞吐量为 2,Q 型的吞吐量为 2/3(作为参考,延迟分别为 4 和 7)。对于 D 和 Q 形式具有不同性能的所有其他指令在最坏的情况下只有很小的延迟差异(例如 3 对 4 FRINTX),并且具有相同或正好一半的吞吐量。 Cortex-A72 ASIMD 浮点指令特性

有什么特别之处FADDP在于它的吞吐量对于 Q-form 减少了三分之一,并且(如果你有前端带宽)你真的可以通过用两个 D-form 指令替换 Q-form 来增加吞吐量吗?

测试和基准测试:

我编写了几个 c++ 函数来尝试以两种方式锻炼 cortex-a72:

当使用 clang 和 -O3 编译时,它们会产生以下结果:

在我看来,那些主循环似乎没有找到任何技巧来避免计算,而且它只是一条直线 8 q-form faddp's vs 16 d-form。

使用 perf 进行基准测试时的结果如下:

这并没有完全达到文档建议的收益(q 实际上非常接近文档建议的 8192 * 8 faddp 应该采用的理论 98304 周期,d 必须遇到延迟问题,这并不令人惊讶,因为有0x400b4c 和 0x400b60 之间的依赖关系,它们之间只有 4 条指令)。但是,这些收益似乎暗示着 d-form 有一些优势。

0 投票
2 回答
234 浏览

x86-64 - 为什么循环从 Uop Cache 提供的 uops 过渡到 LSD 会导致分支未命中率激增?

所有基准测试均在 IcelakeWhiskey Lake(在 Skylake Family 中)上运行。

概括

我看到一个奇怪的现象,当循环从耗尽Uop 缓存过渡到耗尽LSD(循环流检测器)时,分支未命中会出现峰值,这可能会导致严重的性能下降。我在 Icelake 和 Whiskey Lake 上测试了一个嵌套循环,其中外部循环具有足够大的主体 st 整个东西不适合LSD本身,但内部循环足够小以适合 LSD

基本上一旦内部循环达到一些迭代计数解码似乎切换为idq.dsb_uops (Uop Cache)lsd.uops (LSD) 并且此时分支未命中 (没有相应的分支跳转)导致严重的性能下降。注意:这似乎只发生在嵌套循环中。例如, Travis Down 的循环测试不会显示分支未命中的任何有意义的变化。AFAICT 这与循环从用尽 Uop Cache过渡到用尽LSD时有关。

问题

  1. 当循环从用尽 Uop 缓存转换为用尽LSD时会发生什么,从而导致 Branch Misses出现这种峰值?

  2. 有没有办法避免这种情况?

基准

这是我能想出的最小可重现示例:

注意:如果.p2align删除语句,则两个循环都将适合 LSD,并且不会有转换。

编译gcc -O3 -march=native -mtune=native <filename>.c -o <filename>

运行 Icelakesudo perf stat -C 0 --all-user -e cycles -e branches -e branch-misses -x, -e idq.ms_uops -e idq.dsb_uops -e lsd.uops taskset -c 0 ./<filename> <N inner loop iterations>

运行威士忌湖sudo perf stat -C 0 -e cycles -e branches -e branch-misses -x, -e idq.ms_uops -e idq.dsb_uops -e lsd.uops taskset -c 0 ./<filename> <N inner loop iterations>

图表

编辑:x 标签是内循环的 N 次迭代。

下面是Branch MissesBranchesLSD Uops的图表。

一般可以看到 1) Branches中没有对应的跳转。2)增加的Branch Misses数量稳定在一个常数。3) Branch MissesLSD Uops之间有很强的关系。

冰湖图

icl-分支

威士忌湖图

skl-分支

下面是 Icelake 的Branch MissesCyclesLSD Uops的图表 ,因为性能几乎没有受到以下影响:

icl-循环

分析

下面的硬数字。

对于Icelake,从LSD开始N = 22结束于_ _ _ _ 在此期间 , Cycles也增加了2倍。对于所有分支未命中保持在1.67 x 10^7左右(大约)。对于分支继续仅线性增加。N = 27N > 27 outer_loop_NN = [17, 40]

Whiskey Lake的结果看起来不同,因为 1)N开始波动N = 35并持续波动直到N = 49。2) 对性能的影响较小,数据波动较大。话虽如此,与从由Uop Cache提供的 uops到由LSD提供的转换相对应的Branch-Misses的增加仍然存在。

结果

数据是 25 次运行的平均结果。

冰湖结果

ñ 循环 分支机构 分支未命中 idq.ms_uops idq.dsb_uops lsd.uops
1 33893260 67129521 1590 43163 115243 83908732
2 42540891 83908928 1762 49023 142909 100690381
3 50725933 100686143 1782 47656 142506 117440256
4 67533597 117461172 1655 52538 186123 134158311
5 68022910 134238387 1711 53405 204481 150954035
6 85543126 151018722 1924年 62445 141397 167633971
7 84847823 167799220 1935年 60248 160146 184563523
8 101532158 184570060 1709 60064 361208 201100179
9 101864898 201347253 1773 63827 459873 217780207
10 118024033 218124499 1698 59480 177223 234834304
11 118644416 234908571 2201 62514 422977 251503052
12 134627567 251678909 1679 57262 133462 268435650
13 285607942 268456135 1770 74070 285032524 315423
14 302717754 285233352 1731 74663 302101097 15953
15 321627434 302010569 81796 77831 319192830 1520819
16 337876736 318787786 71638 77056 335904260 1265766
17 353054773 335565563 1798 79839 352434780 15879
18 369800279 352344970 1978年 79863 369229396 16790
19 386921048 369119438 1972年 84075 385984022 16115
20 404248461 385896655 29454 85348 402790977 510176
21 421100725 402673872 37598 83400 419537730 729397
22 519623794 419451095 4447767 91209 431865775 97827331
23 702206338 436228323 12603617 109064 427880075 327661987
24 710626194 453005538 12316933 106929 432926173 344838509
25 863214037 469782765 14641887 121776 428085132 614871430
26 761037251 486559974 13067814 113011 438093034 418124984
27 832686921 503337195 16381350 113953 421924080 556915419
28 854713119 520114412 16642396 124448 420515666 598907353
29 869873144 536891629 16572581 119280 421188631 629696780
30 889642335 553668847 16717446 120116 420086570 668628871
31 906912275 570446064 16735759 126094 419970933 702822733
32 923023862 587223281 16706519 132498 420332680 735003892
33 940308170 604000498 16744992 124365 419945191 770185745
34 957075000 620777716 16726856 133675 420215897 802779119
35 974557538 637554932 16763071 134871 419764866 838012637
36 991110971 654332149 16772560 130903 419641144 872037131
37 1008489575 671109367 16757219 138788 419900997 904638287
38 1024971256 687886583 16772585 139782 419663863 938988917
39 1041404669 704669411 16776722 137681 419617131 972896126
40 1058594326 721441018 16773492 142959 419662133 1006109192
41 1075179100 738218235 16776636 141185 419601996 1039892900
42 1092093726 754995452 16776233 142793 419611902 1073373451
43 1108706464 771773224 16776359 139500 419610885 1106976114
44 1125413652 788549886 16764637 143717 419889127 1139628280
45 1142023614 805327103 16778640 144397 419558217 1174329696
46 1158833317 822104321 16765518 148045 419889914 1206833484
47 1175665684 838881537 16778437 148347 419562885 1241397845
48 1192454164 855658755 16778865 153651 419552747 1275006511
49 1210199084 872436025 16778287 152468 419599314 1307945613
50 1226321832 889213188 16778464 155552 419572344 1341893668
51 1242886388 905990406 16778745 155401 419559249 1375589883
52 1259559053 922767623 16778809 154847 419554082 1409206082
53 1276875799 939544839 16778460 162521 419576455 1442424993
54 1293113199 956322057 16778931 154913 419550955 1476316161
55 1310449232 973099274 16778534 157364 419578102 1509485876
56 1327022109 989876491 16778794 162881 419562403 1543193559
57 1344097516 1006653708 16778906 157486 419567545 1576414302
58 1362935064 1023430928 16778959 315120 419583132 1609691339
59 1381567560 1040208143 16778564 179997 419661259 1640660745
60 1394829416 1056985359 16778779 167613 419575969 1677034188
61 1411847237 1073762626 16778071 166332 419613028 1710194702
62 1428918439 1090539795 16778409 168073 419610487 1743644637
63 1445223241 1107317011 16778486 172446 419591254 1777573503
64 1461530579 1124094228 16769606 169559 419970612 1810351736

威士忌湖结果

ñ 循环 分支机构 分支未命中 idq.dsb_uops lsd.uops
1 8332553879 35005847 37925 1799462 6019
2 8329926329 51163346 34338 1114352 5919
3 8357233041 67925775 32270 9241935 5555
4 8379609449 85364250 35667 18215077 5712
5 8394301337 101563554 33177 26392216 2159
6 8409830612 118918934 35007 35318763 5295
7 8435794672 135162597 35592 43033739 4478
8 8445843118 152636271 37802 52154850 5629
9 8459141676 168577876 30766 59245754 1543
10 8475484632 185354280 30825 68059212 4672
11 8493529857 202489273 31703 77386249 5556
12 8509281533 218912407 32133 84390084 4399
13 8528605921 236303681 33056 93995496 2093
14 8553971099 252439989 572416 99700289 2477
15 8558526147 269148605 29912 109772044 6121
16 8576658106 286414453 29839 118504526 5850
17 8591545887 302698593 28993 126409458 4865
18 8611628234 319960954 32568 136298306 5066
19 8627289083 336312187 30094 143759724 6598
20 8644741581 353730396 49458 152217853 9275
21 8685908403 369886284 1175195 161313923 7958903
22 8694494654 387336207 354008 169541244 2553802
23 8702920906 403389097 29315 176524452 12932
24 8711458401 420211718 31924 184984842 11574
25 8729941722 437299615 32472 194553843 12002
26 8743658904 453739403 28809 202074676 13279
27 8763317458 470902005 32298 211321630 15377
28 8788189716 487432842 37105 218972477 27666
29 8796580152 504414945 36756 228334744 79954
30 8821174857 520930989 39550 235849655 140461
31 8818857058 537611096 34142 648080 79191
32 8855038758 555138781 37680 18414880 70489
33 8870680446 571194669 37541 34596108 131455
34 8888946679 588222521 33724 52553756 80009
35 9256640352 604791887 16658672 132185723 41881719
36 9189040776 621918353 12296238 257921026 235389707
37 8962737456 638241888 1086663 109613368 35222987
38 9005853511 655453884 2059624 131945369 73389550
39 9005576553 671845678 1434478 143002441 51959363
40 9284680907 688991063 12776341 349762585 347998221
41 9049931865 705399210 1778532 174597773 72566933
42 9314836359 722226758 12743442 365270833 380415682
43 9072200927 739449289 1344663 205181163 61284843
44 9346737669 75576​​6179 12681859 383580355 409359111
45 9117099955 773167996 1801713 235583664 88985013
46 9108062783 789247474 860680 250992592 43508069
47 9129892784 806871038 984804 268229102 51249366
48 9146468279 822765997 1018387 282312588 58278399
49 9476835578 840085058 13985421 241172394 809315446
50 9495578​​885 856579327 14155046 241909464 847629148
51 9537115189 873483093 15057500 238735335 932663942
52 9556102594 890026435 15322279 238194482 982429654
53 9589094741 907142375 15899251 234845868 1052080437
54 9609053333 923477989 16049518 233890599 1092323040
55 9628950166 940997348 16172619 235383688 1131146866
56 9650657175 957049360 16445697 231276680 1183699383
57 9666446210 973785857 16330748 233203869 1205098118
58 9687274222 990692518 16523542 230842647 1254624242
59 9706652879 1007946602 16576268 231502185 1288374980
60 9720091630 1024044005 16547047 230966608 1321807705
61 9741079017 1041285110 16635400 230873663 1362929599
62 9761596587 1057847755 16683756 230289842 1399235989
63 9782104875 1075055403 16299138 237386812 1397167324
64 9790122724 1091147494 16650471 229928585 1463076072

编辑:值得注意的两件事:

  1. 如果我在内部循环中添加填充,使其不适合 uop 缓存,我直到 150 次迭代才会看到这种行为。

  2. lfence在外循环中添加一个带有填充的 on 会将 N 阈值更改为 31。

edit2:清除分支历史的基准条件被颠倒了。应该cmove不是cmovne。对于固定版本,任何迭代计数都会以与上述相同的速率 (1.67 * 10^9)看到升高的分支未命中率。这意味着LSD本身不会导致Branch Misses,但留下了LSD以某种方式击败Branch Predictor的可能性(我认为是这种情况)。

0 投票
1 回答
50 浏览

mips - MIPS ISA 中使用的微架构是什么?

我相信 MIPS 微处理器中使用的微架构是流水线,但我可能错了?

提前感谢您的回答!

0 投票
0 回答
14 浏览

memory - 设置 NUMA 如何影响系统的性能?

  1. 系统如何感知 NUMA=4 和 NUMA=0(Interleaved memory)?
  2. 从应用程序的角度来看,性能如何受到影响?
  3. 在内核之间(或在 NUMA 节点之间)共享数据是否会对 NUMA=4 和 NUMA=0 产生影响?
  4. 为什么不能在运行时更改 NUMA?为什么它是引导选项?谢谢,
0 投票
0 回答
63 浏览

architecture - 你能在 gem5 上模拟勒索软件吗?

我希望在 gem5 上模拟勒索软件,以基本上执行微架构分析。我想模拟一个环境,勒索软件在受害者的计算机上查找文件,然后对其进行加密。如果可能的话,我还想模拟屏幕锁勒索软件,但文件加密是我的首要任务。我研究过其他模拟环境,例如 Cuckoo Sandbox,但我是勒索软件领域的新手,我不确定这些类型的沙盒软件是否可以帮助我分析指令模式、内存访问模式、调整调度程序等。所以,在总结一下,我基本上是在寻找分析勒索软件对微架构影响的方法。任何帮助表示赞赏。谢谢。

0 投票
1 回答
39 浏览

assembly - 基于索引寻址模式内存总和

我有一条指令:ADD [BX][SI] + 5FFDH, EABFH我想知道它是如何在 8086 微处理器上运行的。我已经意识到这条指令ADD [BX][SI] + 5FFDH, EABFH以这种方式工作:

  1. 2 个字节的数据从数据总线到达并进入指令队列。
  2. 指令队列中可用的数据进入指令解码器。
  3. 另外 2 个字节的数据从数据总线到达并进入指令队列。
  4. BX 和 SI 值进入 ALU 并计算BX + SI
  5. 另外 2 个字节的数据从数据总线到达并进入指令队列。
  6. BX + SI转到 ALU 的输入。
  7. 5FFDH从指令队列中弹出并进入 ALU 的输入。
  8. ALU 计算BX + SI + 5FFDH
  9. BX + SI + 5FFDH通过地址总线进入内存。
  10. BX + SI + 5FFDH的值来自内存并进入 ALU 的输入。
  11. EABFH从指令队列中弹出并进入 ALU 的输入。
  12. [BX + SI + 5FFDH] + EABFH通过 ALU 计算。
  13. ??????????

所以我的问题是在第 13 步。微处理器如何知道内存地址 ( BX + SI + 5FFDH)[BX + SI + 5FFDH] + EABFH根据空指令队列将 的值发送到内存,我们无法BX + SI + 5FFDH再次计算。

0 投票
1 回答
144 浏览

assembly - 我如何获取我的计算机的 cpu 信息,即功能单元/延迟等

我正在尝试学习组装,在我正在阅读的书中,我遇到了教科书表格中显示的功能单元及其延迟。

我想知道我的 CPU 的功能单元是什么,延迟是多少?整数加法、整数乘法、单精度加法、单精度乘法和双精度乘法。

我查看了这些链接: https ://www.amd.com/en/technologies/zen-core-3 https://en.wikichip.org/wiki/amd/microarchitectures/zen_3

但找不到有关我的处理器中的功能单元或其延迟的任何信息。

书中的延迟表示例:

书中延迟表的示例

英特尔酷睿 i7 Haswell 的功能单元信息示例:

intel core i7 Haswell 中的功能单元示例

任何帮助表示赞赏,谢谢!:)

0 投票
1 回答
69 浏览

c++ - Can programs use (significantly) less memory when compiled for different processors?

I have a C++ program I'm compiling for AMD64. Of course, different processors, despite being AMD64, support different features and instructions because they implement different microarchitectures. An easy way to optimise the program for one's own machine is to just use -march=native in Clang or GCC, but this isn't very portable for distribution's sake. A more portable solution would be to pick and choose specific target features.

This obviously affects performance (some processors support AVX-512, some don't, some support AVX2, some don't, etc.), but can this affect memory usage (heap/stack, not code size) in any significant way?

0 投票
1 回答
50 浏览

c++ - icc:在更改代码的不同且独立部分的同时增加运行时间

我有一个奇怪的问题,也许你们中的一个人知道那里发生了什么。

我正在处理的代码是一个冗长而复杂的模拟代码。我有一个函数 matrixSetup ,它在开始时被调用并且我在其中测量运行时间。在设置了我的矩阵并做了很多其他事情之后,我正在运行我的求解器等等。

现在我在求解器代码上进行了一些更改,这不应该影响矩阵设置的运行时间。但是,我看到那里从 90 秒增加到 150 秒。无需触及那段代码。为什么?如何?

这个时间差是完全可重现的。撤消求解器中的更改会返回快速矩阵设置。在求解器中进行其他更改可能会也可能不会导致运行时间的相同增加,所有这些都是可重现的。运行是在一个空的计算节点上以隔离的方式进行的,因此不会受到那里的影响。

当使用 vTune 找出运行时间增加的地方时,我最终得到了一个简单的循环(在循环嵌套中):

有人知道那里发生了什么吗?编译器生成的指令与 vTune 完全相同。我正在使用 Intel 编译器,版本 19.0.1。

我正在玩一些编译器标志。当声明 -fpic (确定编译器是否生成与位置无关的代码)时,运行时的增加消失了。但我认为,这会导致指令略有不同,因此并不能解决我面临的真正问题。

使用 Clang,我看不到(至少在这里)这种行为......

关于增加运行时间的原因有什么想法吗?我很好奇...

干杯迈克尔

0 投票
0 回答
60 浏览

next.js - 如何在微应用上下文中集中哨兵配置文件?

我目前正在构建一个应用程序,该应用程序具有多个带有 nextJS 的微应用程序,每个应用程序都具有哨兵集成。

我已将我的哨兵配置集中在所有应用程序使用的专用库中,但在微应用程序构建期间,这两个文件sentry.client.config.jssentry.server.config.js内容如下:

我宁愿避免在我的所有微应用中复制粘贴相同的文件。

有没有办法直接将参数传递给哨兵,而无需在任何不同的微应用中拥有这两个文件。