我对微调缓存意识的数据结构(例如参见Michael Spiegel's dissertation或Herlihy等人的hopscotch hashing中的无锁跳跃树)以及防止例如false sharing(例如,在并发阵列处理期间。我已经知道如何通过“sun.arch.data.model”属性找到JVM指针大小,但是我一直无法找到确定L1缓存中的高速缓存行大小的方法。因为我可以继续使用L1行大小的保守估计值(在精确调整缓存意识的数据结构时为64字节,或者防止错误共享时为256字节);因此,这些信息并不重要。但是,如果很容易获得L1缓存属性,那么我也可以使用它。如何从Java进程中找到L1缓存行的大小?
5
A
回答
1
0
你可以做的是一个简单的循环,在给定的步幅从内存中读取单个字节。如果步幅为1(字节),那么每次迭代都需要支付一次线获取罚款。如果你加倍跳过,你可以预期性能的一半,因为你现在每次迭代获取一行两次。
一旦你的步伐达到缓存线的大小,你应该会看到perf的退化停止,因为你会达到你每次迭代获取一次线的水平,并且再次加倍步幅不会改变它,只是跳过线。其中一个问题是,你可能会在你的CPU中触发一个HW流预取程序,并且在某些较低的缓存级别上提前等待你的线路,所以我期望看到斜率减小,但不能完全拉直。在高速缓存行大小的两倍的情况下,这可能会消失,因为你可以通过比它们更快的速度来摆动某些流预取器(还可以有跨步预取器“帮助”你,但影响应该小得多)。
另外请记住,你的代码应该运行在比上一级缓存更大的数据集(比如一个数组)上,几MB应该就足够了。
相关问题
- 1. 如何查找L1和L2缓存?
- 2. 测量L1和L2高速缓存的大小和顺序
- 3. 查找缓存L1和L2带宽
- 4. 查找缓存块大小
- 5. Java DNS缓存大小
- 6. L1缓存与主内存
- 7. 如何看到L1缓存未命中/命中python分析?
- 8. 数据结构缓存对齐如何在L1缓存行中失效
- 9. 如何从java堆转储中找到缓存的对象
- 10. 如何在运行后找到Java堆的最大大小?
- 11. 什么是缓存大小和缓存行大小?
- 12. 从L1缓存驱逐L2驱逐
- 13. CUDA编程 - L1和L2高速缓存
- 14. 高速缓存行大小
- 15. 如何增加Berkeley DB Java版中的缓存大小
- 16. L1数据缓存配置
- 17. L1/2缓存问题
- 18. 进程跳转内核时是否刷新了L1缓存?
- 19. 的Java缓存系统 - 寻找地图的大小
- 20. 如何从java中的pid中找到进程名称?
- 21. Java进程占用的内存大于其最大堆大小
- 22. 查找组件 - 缓存大小
- 23. Prefetcher最大缓存大小达到
- 24. 从Java中查找进程
- 25. 如果找到/存在实例,只使用Redis进行缓存?
- 26. 如何找到sql查询行大小
- 27. 如何增加java高速缓冲存储器的堆大小
- 28. 在Java Applet中进行缓存
- 29. 如何从数组中找到最大的gameobject大小?
- 30. 进程内存大小solaris
我认为这个(非常有趣,我甚至会说令人兴奋的)任务会花费太多的时间来实现。我会在这里做懒惰的事情:为CPU模型硬编码缓存大小,并确定 - 因为它可能会更容易。但是,如果JVM运行在某种隐藏实际CPU型号的虚拟机内,那么这可能会出错,而您的解决方案将使用该场景的正确大小...... – ppeterka
行大小是行大小;在什么情况下它有64 **和** 256? –
@OliCharlesworth如果我不知道精确的线条大小,那么我会根据我想要完成的工作使用不同的估计值,例如,如果我正在微调一个缓存意识的数据结构,那么我将使用64字节的较低估计值,因为如果实际行大小大于64字节,那么数据结构仍然会运行良好,如果我防止虚假共享,那么我将使用256字节的更高估计值,因为如果实际行大小小于256字节,这仍然会表现良好。 –