矩阵转置中的性能异常:512x512 与 513x513
处理不同大小的方阵时会出现某些性能模式,从而导致有趣的结果现象:转置维度为 2^n 的矩阵与维度为 2^n 1 的矩阵(例如 513x513)相比,(例如 512x512)始终表现出较慢的执行时间。
深入研究机制
性能源于数据访问模式和缓存功能之间复杂的相互作用。具体来说,缓存被组织成集合和行:
数据地址使用以下方式映射到特定集合一个公式。重叠的地址范围可能会导致对设置占用的争用,从而导致缓存未命中。
关键步幅
这个等式中的一个关键因素是“关键步幅”,它测量有效竞争缓存行的内存位置之间的距离。当数据元素以等于关键步长的间隔存储时,会触发称为“假别名”或“人工步长”的缓存冲突。
512x512 僵局
一个512x512的矩阵,每组占用4行,行大小为64字节的缓存,遇到这个陷阱。此配置的关键步长是 2048 字节(4 行 * 64 字节),与矩阵中的每第四行对齐。
在转置期间,访问列中的连续元素会导致第一个操作中的缓存行被驱逐。因此,后续行中关键跨步间隔的元素会遭受缓存未命中,从而降低性能。
513x513 Escape
相反,513x513 的矩阵,一个奇怪的维度,扰乱了关键的一步。元素不再以关键步幅间隔排列,从而降低了缓存冲突的风险。这会提高转置期间的性能。
结论
与 2^n 1 维度相比,2^n 维度的矩阵转置速度较慢的现象源于缓存特性。了解关键的一步以及数据对齐对缓存利用率的影响对于优化代码执行时间至关重要。
以上是为什么 512x512 矩阵的矩阵转置比 513x513 矩阵慢?的详细内容。更多信息请关注PHP中文网其他相关文章!