了解 512x512 和 513x513 矩阵大小的矩阵转置的性能差异
不同大小的方形矩阵在涉及到时表现出独特的时间差异转置它们。有趣的是,与维度为 2^n 1 的矩阵相比,维度为 2^n 的矩阵往往具有更慢的转置时间。虽然这些差异对于较小的 n 值可能似乎微不足道,但在较大维度上它们变得显着,如 MATSIZE 512 所证明的那样.
为了理解这种性能差异的根本原因,我们深入研究了以下概念:缓存。
缓存组织和集合映射
缓存被组织成集合和行。每组包含多条可以存储数据的线。为了找到特定内存地址所属的集合,我们使用以下公式:
set = (address / lineSize) % numberOfsets
因此,内存地址以某种统一的方式映射到集合。
缓存未命中和行驱逐
访问内存位置时,缓存会检查数据是否已存在。如果没有,则发生高速缓存未命中,并从内存中读取相应的行并将其放入高速缓存中。但是,当缓存已满时,它会逐出最近最少使用(LRU)行以容纳新数据。
关键步幅
关键步幅表示间距竞争相同缓存线的变量之间。其计算方式如下:
criticalStride = numberOfSets * lineSize
由关键步幅或其倍数间隔开的变量更有可能导致缓存驱逐。
矩阵转置和关键步幅
想象一个带有 8kB 缓存和四行的 64x64 矩阵每套。每行可以容纳八个 64 位整数。此场景中的关键步长是 2048 字节,相当于矩阵的四行。
转置矩阵时,我们交换行和列。当我们处理每一行并将其与其相应的列交换时,由关键步幅(四行)分隔的元素会遇到缓存驱逐。这会导致大量缓存重新加载,从而导致转置速度变慢。
结论
512x512 和 513x513 矩阵之间的转置时间差异源于以下关系:矩阵维度和缓存的关键步长。维度不是关键步幅倍数的矩阵会减少缓存驱逐,从而加快换位时间。
以上是为什么 513x513 矩阵转置比 512x512 矩阵转置更快?的详细内容。更多信息请关注PHP中文网其他相关文章!