繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM