答案 What are _mm_prefetch() locality hints? 详细说明了提示的含义。
我的问题是:我 想要 哪一个?
我处理一个被重复调用数十亿次的函数,其中包含一些 int
参数。我做的第一件事是使用该参数(它的低 32 位)作为 4GB 缓存的键来查找一些缓存值。根据调用此函数的算法,我知道该键通常会从一次调用加倍(左移 1 位)到下一次调用,所以我正在做:
int foo(int key) {
uint8_t value = cache[key];
_mm_prefetch((const char *)&cache[key * 2], _MM_HINT_T2);
// ...
目标是在下次调用此函数时将此 value
放入处理器缓存中。我正在寻求确认我对两点的理解:
_mm_prefetch
的调用不会延迟紧随其后的指令的处理。 该函数使用了一个包含 128 个 128 位值(总共 2 KB)的查找表。有没有办法“强制”缓存它?该查找表的索引按顺序递增;我也应该预取它们吗?我可能应该使用另一个提示来指向另一个级别的缓存?这里最好的策略是什么?
最佳答案
正如我在评论中指出的那样,预取错误地址存在一些风险 - 有用的地址将从缓存中逐出,从而可能导致缓存未命中。
那说:_mm_prefetch
编译成 PREFETCHn
指令。我在 AMD 发布的 AMD64 Architecture Programmer's Manual 中查找了指令。 (请注意,所有这些信息都必须是特定于芯片组的;您可能需要找到 CPU 的文档)。
AMD 说(我的重点):
这似乎意味着,如果您在 AMD 上运行,则该提示将被忽略,并将内存加载到缓存的所有级别中——除非提示它是 NTA(非临时访问) ,尝试以最小的缓存污染加载内存)。
这是说明的完整页面
我认为最后,指导就是另一个答案所说的:头脑 Storm 、实现、测试和衡量。您在这里处于性能的最前沿,并且不会有一个一刀切的答案。
另一个可以帮助您的资源是 Agner Fog's Optimization manuals ,它将帮助您针对特定 CPU 进行优化。
关于c++ - 了解 `_mm_prefetch`,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/65604355/