读取小阵列的最快偏移量

问题描述 投票:1回答:1

为了提高速度,我想读取第9个寄存器中的值所引用的8个寄存器之一。我看到的最快的方法是使用3个条件跳转(在第9个中检查3位)寄存器)。与标准的偏移方式相比,这应该具有较短的延迟内存读取,但这仍然需要至少6个时钟周期(至少一项测试加上一项每位检查有条件的jmp)。

是否有任何具有内在功能的商用CPU(最好是x86 / x64)来执行“偏移寄存器读取”,延迟只有一个时钟周期?

理论上,经过优化的CPU可以通过加一动来完成此操作,因此需要两个或一个时钟周期似乎很容易...是否有一些一般原因导致架构不在乎速度偏移量读取一个小数组?

performance assembly x86 cpu-architecture intrinsics
1个回答
1
投票

如今,将CPU寄存器作为数组进行处理实际上并不常见。我知道允许使用的最后一个架构是PDP11,它在80年代后期就淘汰了。为什么不像其他阵列一样将阵列放入某个内存位置?

就是说,您可以使用以下代码将延迟减少到某些地址计算,一次跳转,一次移动和ret。要内联此代码,只需将jmp *%rax替换为call *%rax

    # select a register from r8...r15 according to the value in rdi
select:
    lea labels-4*8(%rip),%rax # rdi = 8 is the first jump table entry
    lea (%rax,%rdi,4),%rax    # pointer to the appropriate entry
    jmp *%rax                 # computed jump

    .align 4
labels:
    mov %r8, %rax
    ret

    .align 4
    mov %r9, %rax
    ret

    .align 4
    mov %r10, %rax
    ret

    .align 4
    mov %r11, %rax
    ret

    .align 4
    mov %r12, %rax
    ret

    .align 4
    mov %r13, %rax
    ret

    .align 4
    mov %r14, %rax
    ret

    .align 4
    mov %r15, %rax
    ret

尽管这可能比三个条件跳转(取决于访问模式)要快,但它肯定不会仅使用数组来击败。

© www.soinside.com 2019 - 2024. All rights reserved.