我的理解是 CPU 与 CPU 缓存(L1 等)一起进行数学运算,如果操作所需的值尚未在缓存中,则需要从 RAM 中获取页面,然后才能执行计算. 因此,似乎有理由认为,托管堆 RAM 比操作系统设法在广阔的非托管堆栈 RAM 中的某个地方找到的任何旧漏洞更适合存放 Vector 数据。我这样说是因为我假设托管内存比非托管内存更紧密地结合在一起,因此数学运算的向量 (x, y, z) 更有可能存储在加载到缓存中的相同页面中;而作为堆栈上的结构的向量可能是分开的页面。任何人都可以从这个角度解释基于类而不是基于结构的向量类的优缺点吗?
问问题
232 次
2 回答
2
CPU缓存完全由CPU管理。最近访问的内存由相对较大的块(即访问位置周围的 128 个字节)缓存。
操作系统管理进出物理内存的分页。如果您的应用程序经常访问该进程(即您的数据大小比物理 RAM 大得多),那么您还有其他问题需要担心外部 CPU 缓存行命中和未命中。
从这个角度来看,堆栈和堆之间基本上没有区别。唯一有意义的区别是下一条要使用的数据与最近使用过的数据的接近程度。
在大多数情况下,数学类(向量/矩阵/点)存储在连续的内存块中,用于托管和本机实现。因此,缓存行为可能是可比较的,除非明确地进行一些奇怪的分配以使各个元素在内存中相距很远。
总结:如果性能非常重要,请确保分析您的代码并保持数据紧凑。
尝试并测量跨数组的不同迭代顺序。即,如果每次迭代都会越过缓存线,它可能会变慢 - 当必须在大多数数组访问中重新填充缓存时,在 2d 数组中首先按行或按列遍历可能会显示足够大的数据集的可测量差异......
于 2012-09-19T05:19:25.340 回答
0
这里的堆栈更快,这是一个更详细地介绍它的站点。
于 2012-09-19T04:46:20.673 回答