预取双等级成员需要转换为char *?

时间:2015-06-08 12:05:07

标签: c++ performance optimization x86 prefetch

我有一个类,我使用_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 *'

那我该如何预取这个班级成员?

2 个答案:

答案 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();

不会对性能有益(事实上,它可能会伤害它)。