首页 >后端开发 >C++ >为什么循环顺序对于 8192x8192 矩阵的高效处理至关重要?

为什么循环顺序对于 8192x8192 矩阵的高效处理至关重要?

DDD
DDD原创
2024-12-06 16:03:16235浏览

Why is Loop Order Crucial for Efficient Processing of an 8192x8192 Matrix?

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;
    }
}

通过更改循环顺序,顺序内存保持访问,消除与非顺序访问相关的性能损失。

性能比较:

互换的循环结构显着提高了性能:

原始代码:

  • 8191: 1.499 秒
  • 8192:2.122秒
  • 8193:1.582秒

交换循环:

  • 8191:0.376秒
  • 8192: 0.357秒
  • 8193: 0.351 秒

此修改可确保高效的内存管理并解决循环 8192 个元素时性能缓慢的问题。

以上是为什么循环顺序对于 8192x8192 矩阵的高效处理至关重要?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn