繁体   English   中英

预取大量参考数据的实际限制

[英]Practical limits on prefetching a lot of reference data

我正在考虑执行以下操作:

  • 编写一个守护进程,创建大约 50KB 的参考数据并将其存储在共享内存中的数组中。
  • 守护进程将其亲和性设置为套接字上的一个内核,并将定期调用__builtin_prefetch()对每 64 个引用数据字节的地址,以将所有引用数据保存在 L3 缓存中,以便在其他内核上运行的所有进程在同一个插座上。
  • 每秒多次,应用程序进程将索引到数组中以检索他们当时需要的任何参考数据。 由于数据会在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 上,您可以使用缓存分配技术为您的应用程序保留一定数量的 L3 缓存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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