gpt4 book ai didi

c++ - 了解 `_mm_prefetch`

转载 作者:行者123 更新时间:2023-12-03 11:15:04 32 4
gpt4 key购买 nike

答案What are _mm_prefetch() locality hints?详细说明提示的含义。

我的问题是:我想要哪一个?

我正在处理一个被重复调用数十亿次的函数,其中包含一些 int 参数。我要做的第一件事是使用该参数(它的低 32 位)作为 4GB 缓存的键来查找一些缓存值。根据调用此函数的算法,我知道从一次调用到下一次调用,该 key 通常会加倍(左移 1 位),所以我正在这样做:

int foo(int key) {
uint8_t value = cache[key];
_mm_prefetch((const char *)&cache[key * 2], _MM_HINT_T2);
// ...

目标是在下次调用此函数时将此 保存在处理器缓存中。

我正在寻找对我对两点理解的确认:

  1. _mm_prefetch 的调用不会延迟紧随其后的指令的处理。
  2. 预取错误的位置不会受到惩罚,只是猜测正确会失去好处。

该函数使用 128 个 128 位值(总共 2 KB)的查找表。有没有办法“强制”它被缓存?该查找表的索引按顺序递增;我也应该预取它们吗?我可能应该使用另一个提示来指向另一个级别的缓存?这里最好的策略是什么?

最佳答案

如果您做任何与性能相关的事情,了解您需要什么的最佳和终极方法就是尝试一下。幸运的是,您确切地知道要尝试什么,而且只有几种可能性。

关于你的理解——是的,它是正确的。但是,任何事情都是有代价的(例如,如果您在代码中添加任何指令,处理器将浪费一纳秒的时间来执行它)。您应该通过测量前后的性能来验证您的预取想法。对于非常不规则的访问模式,它很可能会起作用。

关于预取任何顺序数据——你可能不应该打扰。缓存以 64 字节粒度保存数据,因此对于顺序数据,预取通常无济于事。此外,一些(全部?)缓存具有预测加载功能——即使没有被告知,它们也会提前预取。

关于c++ - 了解 `_mm_prefetch`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65604355/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com