我正在玩这个答案的代码,稍微修改一下:
BITS 64
GLOBAL _start
SECTION .text
_start:
mov ecx, 1000000
.loop:
;T is a symbol defined with the CLI (-DT=...)
TIMES T imul eax, eax
lfence
TIMES T imul edx, edx
dec ecx
jnz .loop
mov eax, 60 ;sys_exit
xor edi, edi
syscall
Run Code Online (Sandbox Code Playgroud)
没有lfence我,我得到的结果与答案中的静态分析一致.
当我介绍一个单一 lfence我期望的CPU执行imul edx, edx的序列的第k个平行于迭代imul eax, eax的下一个(的序列K + 1个)迭代.
像这样的东西(调用一个的imul eax, eax序列和d的imul edx, edx一个): …
Cortex-A57 优化指南指出,大多数对 128 位向量数据进行操作的整数指令都可以双发出(第 24 页,整数基本 F0/F1,逻辑 F0/F1,执行吞吐量 2)。
然而,根据我们的内部(综合)基准测试,即使有大量可用的指令并行性,吞吐量似乎也仅限于 1 128 位 neon 整数指令(编写基准测试的目的是测试 128 位 neon 指令是否可以是双重发行的,所以这是我们关心的事情)。当将 50% 128 位指令与 50% 64 位指令混合时,我们能够实现每个时钟 1.25 条指令(仅霓虹灯整数算术,无加载/存储)。
使用 128 位 ASIMD/Neon 指令时是否需要采取特殊措施才能获得双发出吞吐量?
谢谢,克莱门斯