我有一个类,我使用_mm_prefetch()
预先请求包含类成员的类成员的高速缓存行:
class MyClass{
double getDouble(){
return dbl;
}
//other members
double dbl;
//other members
};
_mm_prefetch()
签名是:
void _mm_prefetch (char const* p, int i)
但是当我这样做时:
_mm_prefetch((char*)(myOb.getDouble()), _MM_HINT_T0);
海湾合作委员会抱怨:
错误:从'double'类型无效转换为'char *'
那我该如何预取这个班级成员?
答案 0 :(得分:4)
如果您从与之关联的网站上阅读_mm_prefetch()
的说明,请执行以下操作:
void _mm_prefetch (char const* p, int i)
将包含地址p的内存中的数据行提取到由locality hint i指定的缓存层次结构中的位置。
所以你需要传递你想要的变量的地址。为了让你这样做,你需要将函数传递给类成员的引用地址或指向它的指针。
最简单的解决方案是更改getDouble()
以返回引用,然后您可以使用:
_mm_prefetch((char*)(&myOb.getDouble()), _MM_HINT_T0);
答案 1 :(得分:0)
_mm_prefetch
将内存地址的缓存行加载到缓存中。尝试将双精度转换为指针不起作用,因为它们不是兼容类型。此外,你不能简单地在getDouble的返回值的地址上调用_mm_prefetch
,因为它不会是你正在寻找的实例的地址,它将是本地或临时的地址(可能已经与处理器“接近”了。此外,简单地调用getDouble的行为将加载地址,因为您正在访问函数内的成员。
最有可能的是,您最好的选择(取决于MyClass
的大小和目标的缓存行大小)是将整个对象加载到缓存中,如下所示:
_mm_prefetch(&myOb, _MM_HINT_T0);
当您在内存地址上执行的操作之前可以进行预取时,预取通常也是最有效的。例如,做:
_mm_prefetch(&myOb, _MM_HINT_T0);
myObj.getDouble();
不会对性能有益(事实上,它可能会伤害它)。