关于数组的预取
我有一个512大小的char数组,想在使用它之前先把它预取进来。在靠前一些的位置我用
#define PRE(a) ({\
asm("pref 4,0(%0)\n\t"\
::"r"(a));\
})
这个宏来做预取工作,但没有明显效果。请指教这是怎么回事,是不是pref用错了···
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
list_head 的prefetch是如何做的?
要把预取的时间算准,其他的原因就不知道了~
最好预取完了能马上使用,防止cache污染
比如:
如果预取要用 a cycle,如果插入预取指令的地方离它被使用的地方有b cycle 距离,如果是在循环中可以提前a/b个迭代预取
那我上面的写法能否把全部的数组预取到cache里?而且预取的时间怎么算,我不是很了解,能不能举个简单点具体点的例子来说明一下,有劳了···
不知道。。。 里面的流水线,乱序,多发射,不知道怎么算~
如果是在循环中使用预取,有时候,预取其实不如直接循环展开的效果更明显。
我的这个数组是个表,很多的操作都要查找这个表,所以想把它预取到cache里以减少cache miss,不知道我这样写能不能把这个数组预取到cache中呢
没用过MIPS,这个还是去问胡教主去吧。
有OS吗?运算量很大?
有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 编辑 ]