请教mips上pref指令的用法
我的程序要对一个大小为16的short数组进行操作,然后将结果在写回这个数组。我现在想用pref指令进行数据预取,我在lh语句前加入pref语句,hint值选用4,可性能没有提高。我想请教各位如何高效的运用pref指令。。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我的程序要对一个大小为16的short数组进行操作,然后将结果在写回这个数组。我现在想用pref指令进行数据预取,我在lh语句前加入pref语句,hint值选用4,可性能没有提高。我想请教各位如何高效的运用pref指令。。。。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(7)
预取指令要在实际内存操作之前一点才能有效隐藏内存访问的延迟。你可以把 pref 再提前放一点。另外,过多的 pref 也可能影响性能;理想的情况下为每条 cache line 只需要用一条 pref。再者,如果 CPU 支持硬件预取而你的内存操作样式会触发它,pref 是根本不必要的。
谢谢你的回答。
我现在对pref的hint不是很理解,我把load streamed换成了load retained好像效果更好一点。还有那个reserved,文档上说为以后使用,好像和cache锁定还不同吧,能解释一下嘛???
Streamed 和 retained 对应两种应用的情况。Streamed 适用于串行化一过性的处理,比如 memcpy、在文本流中进行字符替换等等,预取会尽量减少缓存污染,因为将处理过的东西继续放在缓存里会恶化性能。Retained 适用于需要用满缓存的复杂操作,也是计算机默认的使用缓存的方式。
举个例子,如果要实现一个数字滤波器,输入的数据应当用 load streamed,而滤波器的各项系数则应当用 load retained。
另外,这只是针对预取指令的 hint,CPU 有选取不同实现的自由。某些 CPU 可能对两种 hint 使用同样的实现,甚至都视作 nop,反正不会影响程序的正确性。
恩,我输入的数组就是通过一个滤波公式来处理的,一共处理4次,所以我选择了streamed。我的数组大小为16个short,我只要把数组的首地址传进去就可以把整个全部数据预取到一个cache line了。那么d-cache每次都会从新的cache line添数据吗。比如一行cache line 大小为32B,它一次取了33B,那就占用了两行cache line。那以后再有数据要cache的时候它就会从第三行开始填数据,还是接着填满第二行数据呢
这可说来话长了,要牵涉到缓存对内存的映射方式,你可以参考体系结构的教材。不过,缓存的单位从来都是一整条 cache line,不会出现缓存了 33 字节的情况;要么 32 字节,要么 64 字节。
哦,了解
那我能用reserved来达到cache锁定的功能吗。我有一个数组,从头到尾都会用到,如果能锁定在cache里那就好了···
如果我有一个512大小的char数组,并且有一个循环随机取其中的数据,那样的话是不是cache miss会增加?如果要提高效率是否得将整个数组全部预取到cache里呢
[ 本帖最后由 RUNONMIPS 于 2009-12-21 15:23 编辑 ]