cpu的两个问题
cpu在cache中取指或取数时,若未命中,就会去读内存。请问读内存时,是只读需要的数据呢,还是和读磁盘一样也要进行预读?另外,586以上的cpu,其cache是不是采用哈佛结构,有代码和数据两个cache。谢谢 我记得cache的读取是按块读的,或者叫做cacheline吧。ia32似乎是指令/数据cache分开的,不过不知道是不是叫做哈佛结构。 谢谢mingyanguo 兄。
[ 本帖最后由 gta 于 2007-1-26 10:07 编辑 ] 原帖由 gta 于 2007-1-26 10:00 发表于 3楼
谢谢mingyanguo 兄。再问一下,pentium的cache line是多大呢
不客气。
这个大小我记不住,找找手册看看吧。
手头资料不方便。 AMD64 的 cache 是这样的:
Cache 的结构就像一个矩阵。
行为 set , 列为 way
一个 4 way 的 cache 组织中,一个 set 有 4 个 cache line 组成
每个 cache line 由 3 个部分组成: tag 域、data 域 和 other information 域
每个 cache line 为 64 bytes。 虚拟地址经过 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 域的具体数据。 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]