关于数组的预取

发布于 2022-09-18 10:58:50 字数 268 浏览 36 评论 0

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

老街孤人 2022-09-25 10:58:50

list_head 的prefetch是如何做的?

想念有你 2022-09-25 10:58:50

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

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

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

我ぃ本無心為│何有愛 2022-09-25 10:58:50

原帖由 heixia108 于 2009-12-21 23:27 发表
要把预取的时间算准,其他的原因就不知道了~

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

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

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

哑剧 2022-09-25 10:58:50

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

瑾兮 2022-09-25 10:58:50

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

冰火雁神 2022-09-25 10:58:50

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

回忆躺在深渊里 2022-09-25 10:58:50

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

半世蒼涼 2022-09-25 10:58:50

有OS吗?运算量很大?

叹梦 2022-09-25 10:58:50

有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 编辑 ]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文