问题描述
与Understanding `_mm_prefetch`有关。
我知道 _mm_prefetch()
会导致请求的值被提取到处理器的缓存中,并且我的代码将在同时预取的东西被执行。
但是,我的 VS2017 分析器指出 5.7% 花费在访问我的 cache
的行上,而 8.63% 花费在 _mm_prefetch
行上。分析器有误吗?如果我正在等待获取数据,我需要它做什么?当我需要它时,我可以在下一个函数调用中等待......
另一方面,总体时间显示了预取调用的显着优势。
那么问题是:数据是异步获取的吗?
其他信息。
我有多个缓存,用于不同的密钥宽度,最多 32 位密钥(我目前正在分析)。对缓存和预取的访问被提取到单独的 __declspec(noinline)
函数中,以将它们与周围的代码隔离。
uint8_t* cache[33];
__declspec(noinline)
uint8_t get_cached(uint8_t* address) {
return *address;
}
__declspec(noinline)
void prefetch(uint8_t* pcache) {
_mm_prefetch((const char*)pcache,_MM_HINT_T0);
}
int foo(const uint64_t seq64) {
uint64_t key = seq64 & 0xFFFFFFFF;
uint8_t* pcache = cache[32];
int x = get_cached(pcache + key);
key = (key * 2) & 0xFFFFFFFF;
pcache += key;
prefetch(pcache);
// code that uses x
}
分析器显示 int x = get_cached(pcache + key);
行为 7.22%,prefetch(pcache);
为 8.97%,而周围代码显示每行 0.40-0.45%。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)