gta 发表于 2007-01-25 20:14

cpu的两个问题

cpu在cache中取指或取数时,若未命中,就会去读内存。请问读内存时,是只读需要的数据呢,还是和读磁盘一样也要进行预读?另外,586以上的cpu,其cache是不是采用哈佛结构,有代码和数据两个cache。谢谢

mingyanguo 发表于 2007-01-26 08:31

我记得cache的读取是按块读的,或者叫做cacheline吧。
ia32似乎是指令/数据cache分开的,不过不知道是不是叫做哈佛结构。

gta 发表于 2007-01-26 10:00

谢谢mingyanguo 兄。

[ 本帖最后由 gta 于 2007-1-26 10:07 编辑 ]

mingyanguo 发表于 2007-01-26 10:07

原帖由 gta 于 2007-1-26 10:00 发表于 3楼
谢谢mingyanguo 兄。再问一下,pentium的cache line是多大呢
不客气。
这个大小我记不住,找找手册看看吧。
手头资料不方便。

mik 发表于 2007-01-27 11:26

AMD64 的 cache 是这样的:

Cache 的结构就像一个矩阵。
行为 set , 列为 way
一个 4 way 的 cache 组织中,一个 set 有 4 个 cache line 组成
每个 cache line 由 3 个部分组成: tag 域、data 域 和 other information 域
每个 cache line 为 64 bytes。

mik 发表于 2007-01-27 11:33

虚拟地址经过 MMU 处理后的物理地址,为分为三个部分。

index 域:得出 cache 的 set 值,如上图所求,从 index 得出 set 为 2
tag 域:物理地址的 tag 分别与 set 中的每个 way 的 cache line 的 tag 进行比较,直到匹配(hit)。在每个 way 进行搜索是通过一个 n:1 的乘法器得出每个 way 的地点。
offset 域:当 hit 时,通过 offset 域索引出 cache line 中 data 域的具体数据。

mik 发表于 2007-01-27 12:10

Intel 提供了4条 cache 预读指令:
prefetchnta、prefetcht0、prefetcht1 以及 prefetch2

AMD 增加了两条指令:
prefetch 和 prefetchw,这两条是 AMD 自已的 3D NOW 指令。

下面是示例代码:

c code:
#define num 65536
#define ARY_SIZE (num * 8)

double array_a
double array_b
double array_c

int i;
for ( i = 0; i < num; i++) {
       array_a = array_b * array_c;
}


汇编码:
   mov edx, (-num)                        ; Use biased index.
       mov eax, OFFSET array_a          ; Get address of array_a.
       mov ebx, OFFSET array_b          ; Get address of array_b.
       mov ecx, OFFSET array_c         ; Get address of array_c.
loop:
       prefetchw                ; Four cache lines ahead                  
       prefetch                   ; Four cache lines ahead
       prefetch                      ; Four cache lines ahead

       fld QWORD PTR                       ; b
       fmul QWORD PTR                   ; b * c
       fstp QWORD PTR                   ; a = b * c
       fld QWORD PTR                   ; b
       fmul QWORD PTR                 ; b * c
       fstp QWORD PTR                 ; a = b * c
       fld QWORD PTR                 ; b
       fmul QWORD PTR             ; b*c
       fstp QWORD PTR             ; a = * c
       fld QWORD PTR                 ; b
       fmul QWORD PTR             ; b * c
       fstp QWORD PTR             ; a = b * c
       fld QWORD PTR                 ; b
       fmul QWORD PTR             ; b * c
       fstp QWORD PTR             ; a = b * c
       fld QWORD PTR                 ; b
       fmul QWORD PTR             ; b * c
       fstp QWORD PTR             ; a = b * c
       fld QWORD PTR                 ; b
       fmul QWORD PTR             ; b * c
       fstp QWORD PTR             ; a = b * c
       fld QWORD PTR                ; b
       fmul QWORD PTR                ; b * c
       fstp QWORD PTR                ; a = b * c

       add edx, 8                                                                      ; Compute next 8 products
       jnz loop                                                                        ; until none left.


代码中将数据装载进 cache 的 4 个 set
4 way 结构,每个 cache line 为 64 bytes,   4 * 64 byte 共 256 bytes。

[ 本帖最后由 mik 于 2007-1-27 12:11 编辑 ]
页: [1]
查看完整版本: cpu的两个问题