RUNONMIPS 发表于 2009-12-21 18:09

关于数组的预取

我有一个512大小的char数组,想在使用它之前先把它预取进来。在靠前一些的位置我用
#define PRE(a) ({\
      asm("pref 4,0(%0)\n\t"\
      ::"r"(a));\
})
这个宏来做预取工作,但没有明显效果。请指教这是怎么回事,是不是pref用错了···

emmoblin 发表于 2009-12-21 23:19

list_head 的prefetch是如何做的?

heixia108 发表于 2009-12-21 23:27

要把预取的时间算准,其他的原因就不知道了~

最好预取完了能马上使用,防止cache污染

比如:
如果预取要用 a cycle,如果插入预取指令的地方离它被使用的地方有b cycle 距离,如果是在循环中可以提前a/b个迭代预取

RUNONMIPS 发表于 2009-12-22 10:03

原帖由 heixia108 于 2009-12-21 23:27 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
要把预取的时间算准,其他的原因就不知道了~

最好预取完了能马上使用,防止cache污染

比如:
如果预取要用 a cycle,如果插入预取指令的地方离它被使用的地方有b cycle 距离,如果是在循环中可以提前a/b ...


那我上面的写法能否把全部的数组预取到cache里?而且预取的时间怎么算,我不是很了解,能不能举个简单点具体点的例子来说明一下,有劳了···

heixia108 发表于 2009-12-22 21:54

不知道。。。 里面的流水线,乱序,多发射,不知道怎么算~

EricFisher 发表于 2009-12-23 09:25

回复 #1 RUNONMIPS 的帖子

如果是在循环中使用预取,有时候,预取其实不如直接循环展开的效果更明显。

RUNONMIPS 发表于 2009-12-24 09:31

我的这个数组是个表,很多的操作都要查找这个表,所以想把它预取到cache里以减少cache miss,不知道我这样写能不能把这个数组预取到cache中呢

prolj 发表于 2009-12-24 22:41

没用过MIPS,这个还是去问胡教主去吧。

cjaizss 发表于 2009-12-24 23:09

有OS吗?运算量很大?

RUNONMIPS 发表于 2009-12-25 09:30

回复 #9 cjaizss 的帖子

有OS。这个表中都是0-255的数,作用是对运算结果进行clip操作

我现在对pref预取整个数组的写法有些疑惑。
1,现在已知一个512大小的char的常量数组a,我要把这个数组预取进来该怎么写呢?是直接写pref 4,0(a)呢,还是按照一个cache line大小(32B)的偏移来写呢,如pref 4,0(a);pref 4,32(a);.....pref 4,480(a)。
2,如果提供一个内存地址 int *ptr,里面也是连续的数据,我要预取这些数据,该怎么写?pref 4,0(ptr)这么写对吗?

1的两种写法我都写过了,后者在效率上要慢一点。大家能帮我先纠正一下写法吗???

[ 本帖最后由 RUNONMIPS 于 2009-12-25 16:32 编辑 ]
页: [1] 2
查看完整版本: 关于数组的预取