| 为了更好的了解这次测试,我们首先要了解一下双核处理器系统的数据交流方式。普通处理器在处理数据时均采用从内存读取数据,处理后再返回内存的路径,但对于双核处理器,这可能会产生一些矛盾,因为当一颗处理器对数据进行运算后,另一颗有马上读取的需
求时,如果仍然通过系统总线交换数据,相比两颗核心直接交流,无疑增加了很大的延迟,极大影响处理数据的速度。
两颗核心直接交流,这决定于多核心处理器的独立性问题,因为两核心都在同一块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
AMD Athlon 64 X2
首先测试的是AMD的Athlon 64 X2 4400+处理器,工作于2.2G,每核心独占1MB二级缓存,两颗物理核心通过系统请求界面(system request interface)相连,因此我们期待该处理器的逻辑核心间不需通过系统总线即可进行数据交流。

AMD Athlon 64 X2

Pic.1: AMD Athlon 64 X2. 顺序读取未修改数据

Pic.2: AMD Athlon 64 X2随即读取未修改数据
两幅图表明决定平均读取延迟的是延迟链的长度,图1中可以看到顺序读取中数据块的大小几乎对最小延迟没有任何影响,并且比预期多了50各周期的时间。这表明数据块传输时总是需要经过系统内存,50个时钟周期也不能被看做内存延迟,这应该是由在数据请求和载入之间的预读取而引起的。
图2的随机读取中现象更加有趣,最小延迟随着数据块的减小而缩短,尽管如此,随机读取中的80个周期延迟对于从缓存读取显然是太大了。
此外,我们还可以注意到,随着延迟指令链的延长,实际延迟也呈阶梯状上升,每一级10个周期,与X2 4400+的倍频相同,这是巧合吗?后面我们可以看到答案。
从顺序读取和随机读取可以看出,AMD X2处理器在进行只读操作时始终需要经过系统内存的传输。下面再来看一下读取并修改数据的操作。

Pic.3: AMD Athlon 64 X2. 另一核心内顺序读取已修改数据

Pic.4: AMD Athlon 64 X2. 另一核心内随即读取已修改数据
从图中可以看到,结果仍然不太好,第二线程的数据读取延迟实在是太高了,因此没有可能从第一条线程直接读取数据。为了确认数据从系统总线读取,进行了更深入的试验
首先降低CPU倍频至6,此时CPU频率为1200MHz,下图读取已修改数据情况

Pic.5: AMD Athlon 64 X2, 1200MHz frequency. 另一核心随机读取已修改数据
现在每级的差距变成了6个周期,这证明了数据在CPU内部的传输仅经过内部缓存。
下面关闭第一线程中的读操作,仅让第二线程进行操作,以此来计算数据读取速度,也就是第二线程直接从内存读取数据块,测出延迟时间,然后清空缓存。

Pic.6: AMD Athlon 64 X2. 从系统内存顺序读取数据

Pic.7: AMD Athlon 64 X2. 从系统内存随即读取数据
比较后可以得知,读取在第一线程中未修改数据(图1和2)与直接从系统内存读取几乎完全重合,因此,随机读取的延迟应该是由硬件数据预读取技术决定的。
从对AMD X2的测试中我们看不到数据可以直接在两颗物理核心间交换的迹象。根据测试,最近的待处理数据总是通过系统内存读取。至于AMD为什么不采用crossbar switch交换数据,恐怕只有AMD自己明白了。
|