最快的x86汇编代码,用于同步对阵列的访问?

Ber*_*ann 7 x86 assembly multithreading

什么是最快的x86汇编代码来同步访问内存中的数组?

更确切地说:我们在内存中有一个malloc'ed连续单页区域,操作系统在我们的实验期间不会将该区域分页.一个线程将写入数组,一个线程将从数组中读取.数组很小,但大于你的cpu的原子写能力(因此需要一个单独的锁)

"最快":有效速度:不要只假设字节码的长度很重要,而是考虑锁的缓存行为和与周围代码有关的分支行为.

它必须在x86-32和/或x86-64上运行

它必须在XP之后(或后代)Windows,Linux自内核2.2或MaxOs X(在用户模式下)工作.

请不要"它取决于" - 回应:如果它取决于我在这里没有指定的任何东西,只需编写你自己的例子,并说明那个/那些情况下最快的.

邮政编码!(这是为了防止模糊的描述)

不仅要发布你的2行LOCK+ CMPXCHG比较和交换,还要告诉我们如何将它与一个线程中的读取指令和另一个线程中的写入指令集成.

如果您愿意,请解释您对缓存最优性的调整,以及如果分支目标依赖于(1)是否获得锁定(2)更大读取的第一个字节是什么,如何避免分支错误预测.

如果你喜欢区分多处理和任务切换:如果线程没有在2个cpus上执行但只是抓住一个线程,你的代码将如何执行?

Olo*_*ell 1

我不明白。总线锁定(锁定前缀或 xchg mem,reg 指令)和速度彼此关系不大。它是关于将 CPU 与系统中最慢的活动设备进行物理同步(可能通过 33 MHz PCI 或类似设备连接),并且您可以打赌它会比不在缓存中的 RAM 访问慢得多。因此,预计需要 300-3000 个 CPU 时钟周期,具体取决于您需要等待设备的时间。如果没有设备处于活动状态,您仍然需要等待相应的总线确认锁定。

最快的代码?忘了它。您需要接受总线锁的工作方式,或者找到不需要总线锁定的其他同步方法。