8192 个元素的缓慢循环:了解性能损失
提供的代码通过计算九个元素的平均值来处理矩阵 img每个非边界元素的周围单元格并将结果存储在矩阵 res 中。当矩阵大小为 8192x8192 时,程序表现出显着的性能下降。
这种减慢归因于与超级对齐相关的内存管理问题。编译器会对齐内存中的数据结构以提高性能,在这种情况下,矩阵布局可能会导致内存访问效率低下。
要解决此问题,应互换平均操作中的循环顺序。循环不应按列迭代,而应按行迭代。
以下是修改后的代码:
for(j=1;j<SIZE-1;j++) { for(i=1;i<SIZE-1;i++) { res[j][i]=0; res[j][i] += img[j-1][i-1]; res[j][i] += img[j ][i-1]; res[j][i] += img[j+1][i-1]; res[j][i] += img[j-1][i ]; res[j][i] += img[j ][i ]; res[j][i] += img[j+1][i ]; res[j][i] += img[j-1][i+1]; res[j][i] += img[j ][i+1]; res[j][i] += img[j+1][i+1]; res[j][i] /= 9; } }
通过更改循环顺序,顺序内存保持访问,消除与非顺序访问相关的性能损失。
性能比较:
互换的循环结构显着提高了性能:
原始代码:
交换循环:
此修改可确保高效的内存管理并解决循环 8192 个元素时性能缓慢的问题。
以上是为什么循环顺序对于 8192x8192 矩阵的高效处理至关重要?的详细内容。更多信息请关注PHP中文网其他相关文章!