我正在尝试针对在两个图像( 2000Hx3000W 和 6800Hx8500W )上执行 sobel 内核卷积的程序的几个编译器开关。有一些我无法解释的观察结果,以下是数据 - 编译器标志和以秒为单位的时间(请关注最后一列,因为它表示较大图像的 Y 轴上的卷积):
O2-march=barcelona 0.1483326 0.833264 1.6018882 28.6711242
O2-ftree-vectorize 0.1462104 0.847973 1.506708 26.628592
O2 0.1468406 0.8368156 1.5999718 20.61377564
O2-ftree-vectorize-march=barcelona 0.1441898 0.827366 1.4687354 15.2572644
考虑到我正在运行的机器是 AMD barcelona,我预计 -O2-march=barcelona 会稍微好一些。关于为什么 -O2 比 -O2 -march 更好的任何想法?
关于-ftree-vectorize,它应该能够并行运行指令,因为我的循环是无依赖的。但是,-O2-ftree-vectorize-march=barcelona 是最好的,当单独存在合理的时间差异时。
如果我能理解这种行为,那就太好了。
问候,
萨扬