2011-03-12 44 views
7

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

更确切地说:我们在内存中有一个malloc化的连续单页区域,操作系统在我们的实验期间不会调出这个区域。一个线程将写入数组,一个线程将从数组中读取。阵列很小,但比你的cpu的原子写入能力还要大(这样就需要一个单独的锁)

“最快”:有效速度:不只是假设字节码的长度很重要,考虑到关于周围代码的锁定和分支行为的缓存行为。

它具有上的x86-32和/或工作的x86-64

它必须在最上层的(或后代)工作的Windows XP以来,Linux的内核以来2.2,或MAXOS X(用户-模式)。

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

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

邮政不仅是你的2线LOCK + CMPXCHG比较&交换,但我们展示你如何在一个线程读取指令和其他写指令整合它。

如果您喜欢,请解释您对缓存最优化的调整,以及如果分支目标依赖于(1)是否获取锁定(2)较大的第一个字节-read是。

如果您喜欢区分多重处理和任务切换:如果线程不是在2 cpus上执行,而是只保留一个,您的代码将如何执行?

+0

@Ken白:哈哈好笑。或者你是认真的?如果是这样的话:看看我使用的术语和我已经回答的问题。 – 2011-03-12 16:54:10

+0

@Ken - 我会对把这种类型的问题作为家庭作业的学校非常感兴趣。 – linuxuser27 2011-03-12 16:55:38

+0

@eznme,我读了使用的术语。它看起来像直接从教科书中出来的东西。 “不仅仅是发布你的2线......而是展示”。没有任何意图 - 它看起来并不像一个典型的问题所包含的东西。 @ linuxuser27,你看过MIT或RIT的任何高级课程吗? – 2011-03-12 17:00:48

回答

1

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

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

-1

如果锁定性能很重要,那么你做错了什么。

+0

是的,我大多数人都同意。如果工作块足够大,则分摊锁定成本。 – 2011-03-13 23:22:44

2

真的,答案是“这取决于”。你阵列的使用模式是什么?大部分是阅读?它是否更新 - 主要是,你可以摆脱不精确的结果阅读(使用每个CPU数组)?更新非常少,以至于RCU可以提高性能。

有很多权衡这里,看到了保罗麦肯尼的书:Is Parallel Programming Hard, And, If So, What Can You Do About It?