gpt4 book ai didi

c# - 使用 c# 是数学向量在堆栈上还是在堆上更快?

转载 作者:太空宇宙 更新时间:2023-11-03 11:16:37 25 4
gpt4 key购买 nike

我的理解是 CPU 结合 CPU 缓存(L1 等)进行数学运算,如果运算所需的值不在缓存中,则需要在计算之前从 RAM 中获取一个页面可以执行。因此,认为托管堆 RAM 比操作系统设法在大片非托管堆栈 RAM 中找到的任何旧漏洞更适合存放 Vector 数据,这似乎是合理的。我这样说是因为我假设托管内存比非托管内存更紧密地结合在一起,因此数学运算的向量 (x, y, z) 更有可能存储在加载到缓存中的相同页面中;而向量作为堆栈上的结构可能是分开的页面。谁能从这个角度解释基于类而不是基于结构的向量类的优缺点?

最佳答案

CPU 缓存完全由 CPU 管理。最近访问的内存由相对较大的 block 缓存(即访问位置周围 128 字节)。

操作系统管理进出物理内存的分页。如果您的应用程序经常访问该进程(即您的数据大小远大于物理 RAM),那么您还有其他问题需要担心外部 CPU 缓存行命中和未命中。

从这个角度来看,栈和堆本质上没有区别。唯一有意义的区别是下一条要使用的数据与最近使用一次的数据有多接近。

在大多数情况下,数学类(向量/矩阵/点)存储在连续的内存块中,用于托管和 native 实现。因此缓存行为可能具有可比性,除非明确进行一些奇怪的分配以使各个元素在内存中相距很远。

总结:如果性能非常重要,请确保分析您的代码并保持数据紧凑。

尝试测量数组中不同的迭代顺序。 IE。如果迭代每次都穿过缓存线,它可能会更慢 - 当缓存必须在大多数阵列访问中重新填充时,在二维数组中首先按行或按列遍历可能会显示出足够大的数据集的可测量差异...

关于c# - 使用 c# 是数学向量在堆栈上还是在堆上更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12488585/

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