[英]Prefetching double class member requires casting to char*?
我有一个类,我使用_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 *'类型
那么如何预取这个类成员呢?
如果您从链接到它的站点读取_mm_prefetch()
的描述,则:
void _mm_prefetch (char const* p, int i)
将包含地址p的内存中的数据行提取到由locality hint i指定的缓存层次结构中的位置。
所以你需要传递你想要的变量的地址。 为了使您能够这样做,您需要将对类成员的引用的地址或指向它的指针传递给函数。
最简单的解决方案是更改getDouble()
以返回引用,然后您可以使用:
_mm_prefetch((char*)(&myOb.getDouble()), _MM_HINT_T0);
_mm_prefetch
将内存地址的缓存行加载到缓存中。 尝试将双精度转换为指针不起作用,因为它们不是兼容类型。 此外,你不能简单地在getDouble的返回值的地址上调用_mm_prefetch
,因为它不会是你正在寻找的实例的地址,它将是本地或临时的地址(可能已经是'关闭'处理器'。 此外,简单地调用getDouble的行为将加载地址,因为您正在访问函数内的成员。
最有可能的是,您最好的选择(取决于MyClass
的大小和目标的缓存行大小)是将整个对象加载到缓存中,如下所示:
_mm_prefetch(&myOb, _MM_HINT_T0);
如果您可以在对内存地址执行的操作之前稍微进行预取,则预取通常也是最有效的。 例如,做:
_mm_prefetch(&myOb, _MM_HINT_T0);
myObj.getDouble();
不会有益于性能(事实上,它可能会伤害它)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.