进入2006年,双核处理器普及的趋势已是势不可挡,各项测试均表明了双核处理器在多线程运算中的巨大优势,但在之前似乎还没有谁测试过两颗核心间的数据交换速度。
为了更好的了解这次测试,我们首先要了解一下双核处理器系统的数据交流方式。普通处理器在处理数据时均采用从内存读取数据,处理后再返回内存的路径,但对于双核处理器,这可能会产生一些矛盾,因为当一颗处理器对数据进行运算后,另一颗有马上读取的需求时,如果仍然通过系统总线交换数据,相比两颗核心直接交流,无疑增加了很大的延迟,极大影响处理数据的速度。
两颗核心直接交流,这决定于多核心处理器的独立性问题,因为两核心都在同一块die面上,如果仅通过CPU缓存而不是系统北桥总线交换数据的话,速度将大大加快。之前的一些评论也会将双核CPU的缓存看作完整的一块缓存,具体结果怎样,让我们来看一下测试结果
为了测试读取速度,我们为双核CPU准备了一个普通的数据块,进行双线程操作,每一条线程对应一颗逻辑CPU,其中一条线程对数据块进行两种操作:只读操作(数据块仅从内存传送至缓存),修改操作(数据块从内存传送至缓存后进行修改),接下来我们可以观察发生的情况,两种可能:
1.最近的待数据储存在系统内存和第二颗逻辑处理器的缓存中
2.最近的待处理数据仅储存于第二颗处理器的缓存中
因此,我们把第一条线程从内存读取数据的逻辑处理器定义为CPU1,将第二条线程的处理器定义为CPU2。
两条线程通过一条叫spin-wait的循环指令聚集起来,该指令可以保证数据传输中的最大速度并阻止其他线程的插入操作,测试中两条线程均允许在最高优先级上(THREAD_PRIORITY_REALTIME)。
为了准确测试第二条线程读操作中的延迟,我们使用了一条连接指针链:
// eax is the beginning of the data block
xor ebx, ebx // ebx <=0
xor edx,edx // edx <=0
………
and edx, eax // synchronization
mov eax, [eax+ebx]// a data read
N*{and ebx, edx} // delay to use the read data
and edx, eax // syncing the moment of use of the read data
mov eax, [eax+ebx] // using the read data; the next data read
N*{and ebx, edx}
and edx, eax
mov eax, [eax+ebx]
………
程序中N为延迟指令数值,测试中使用的数据块大小从 8KB到4094MB,因此我们可以了解从适合L1缓存大小的数据块到远远超出L1容量的数据块在数据处理中的结果。
测试对象:
AMD Athlon 64 X2
Two-Way AMD Opteron System
Intel Pentium D
Intel Pentium 4 (Prescott)
Intel Core Duo (Yonah)
Intel Conroe