gpt4 book ai didi

c++ - 预取大量引用数据的实际限制

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:02:44 24 4
gpt4 key购买 nike

我正在考虑做以下事情:

  • 编写一个守护进程,创建大约 50KB 的引用数据并将其存储在共享内存中的数组中。
  • 守护进程将其亲和性设置为套接字上的一个核心,并将定期调用 __builtin_prefetch() 引用数据的每 64 个字节的地址,以将所有引用数据保存在在同一套接字上的其他内核上运行的所有进程的 L3 缓存。
  • 每秒多次,应用程序进程将索引到数组中以检索他们当时需要的任何引用数据。由于数据会在三级缓存中,访问时间会比较快。

我想我不是第一个提出这种想法的人。有人可以就我可能遇到的限制提供建议吗?例如,在守护进程中考虑以下伪代码,用于将引用数据保存在缓存中:

for (size_t i = 0; i < sizeof(referenceData); i += 64) {
__builtin_prefetch(i + (void*)&referenceData);
}

对于 50KB 的引用数据,上述循环将快速连续调用 __builtin_prefetch() 800 次。这样做会不会导致问题,例如当其他应用程序尝试访问内存(引用数据除外)时出现延迟峰值?如果是这样,我可以在 for 循环中插入一个 sleep 语句:

for (size_t i = 0; i < sizeof(referenceData); i += 64) {
__builtin_prefetch(i + (char*)&referenceData);
if (i % (64*10)) { // sleep every 10th time around the loop
sleep_briefly();
}
}

欢迎提供相关文档来源的建议和链接。

编辑以根据评论添加额外信息:

  • 引用数据将保持不变。其他进程将访问一个应用程序级事件中的一小部分数据:可能大约数据中有 7 个索引,每个索引检索 4 个字节,因此每个事件检索大约 28 个字节。

  • 我认为无法预测哪些数据条目最有可能被访问,因此我希望将整个引用数据保留在缓存中,而不仅仅是其中的一小部分。

  • 如果延迟无关紧要,那么就不需要缓存的引用数据,因为每个应用程序都可以根据每个事件的需要重新计算它需要的任何内容。但是,响应事件的延迟确实很重要。

  • 我还没有开发所有应用程序代码,但我希望在没有此优化的情况下“响应事件”时间少于 200ns。如果这种优化效果很好,那么它可能会将“响应事件”时间减少到不到 100 纳秒。

  • 事件的发生频率可能​​高达每秒几百次,也可能很少发生,每几秒一次。所以我担心的是,如果引用数据没有主动在缓存中保持温暖,偶尔它会因为不用而被冲出缓存。

最佳答案

更好和更简单的解决方案是让引用数据的用户在他们认为合适的时候提前加载/缓存该数据。

您的进程占用 CPU 缓存似乎根本不合理。

在 Intel 上你可以使用 Cache Allocation Technology为您的应用保留一定数量的 L3 缓存。

关于c++ - 预取大量引用数据的实际限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56648121/

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