能否设计专门的汇编指令来实现内存块的移位,简化数组的插入和删除?

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

在学习数组操作时,我发现插入和删除很麻烦,需要将元素一一移位。我们是否可以设计一条专门的汇编指令,将一块内存在两个指定地址之间移动一定数量的位置(如果参数太多,则将地址和位置数量存储在专用寄存器中)?执行该指令后,CPU 将通知独立的内存移位硬件,然后该硬件可以快速完成内存移位。这种方法是否可以将数组插入和删除的复杂度降低到 O(1)?

我询问了一些AI但没有得到满意的答案

arrays memory cpu-architecture cpu-registers instruction-set
1个回答
0
投票

执行大量工作的指令(例如 x86

rep movsb
是 memmove)不会减少所需的缓存/内存带宽量。 使用专用状态机1,允许无序执行远远超过它(与实际的 Intel / AMD CPU 不同,它是微编码的,接管前端),是的,如果周围的代码,它可能会带来加速否则不会成为内存访问的瓶颈。

但是你不能说它的成本是 O(1) 时间;只有当您执行的频率足够低,以便无序执行程序与主要瓶颈并行执行时,这才是正确的。

大O复杂度模型并没有真正考虑指令级并行的可能性。 您只需计算操作并假设成本以某种方式增加。 但由于您忽略了恒定因素,这可能仍然有效。 如果副本数量是算法中比其他任何东西都大的复杂度类别,那么当

n
接近无穷大时,副本与其他工作的比率也将趋于无穷大,因此即使副本大小为小且固定。

或者,如果总副本大小除副本数量之和是一个更大的复杂性类别,那么您将再次比任何其他类型的工作拥有更多的复制工作,因此它将无法“隐藏”在其他操作。

但是,如果复制总量是比其他瓶颈更小的复杂性类别,那么由于

n
趋于无穷大,它将变得可以忽略不计。 如果您有
n^2 + n
副本和
n^2
其他工作,并行性可能会在
n
n^2
时间之间产生差异,但这些都属于
O(n^2)
复杂性类别,因为随着
n
的接近,较小的指数变得微不足道无穷大。


脚注 1:Andy Glew,英特尔 P6 微架构中的快速字符串微码架构师,后来后悔没有构建专用硬件来处理它。 (在 Pentium Pro 之前,第一个 P6 CPU,

rep
字符串操作一次只处理一个单元,就像实际上重复
movsd
一样,所以速度相当慢。如此快速的字符串微码,每 1 或 2 复制 8 个字节时钟周期(如果它命中缓存)仍然是一个很大的改进。)

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