gpt4 book ai didi

c++ - 自动矢量化感兴趣区域(裁剪)

转载 作者:太空宇宙 更新时间:2023-11-04 14:14:26 25 4
gpt4 key购买 nike

我有一个库,其中包含一些图像处理算法,包括感兴趣区域(裁剪)算法。使用 GCC 编译时,自动矢量化器会加速很多代码,但会降低 Crop 算法的性能。是否有标记某个循环以被矢量化器忽略的方法,或者是否有更好的方法来构建代码以获得更好的性能?

for (RowIndex=0;RowIndex<Destination.GetRows();++RowIndex)
{
rowOffsetS = ((OriginY + RowIndex) * SizeX) + OriginX;
rowOffsetD = (RowIndex * Destination.GetColumns());
for (ColumnIndex=0;ColumnIndex<Destination.GetColumns();++ColumnIndex)
{
BufferSPtr=BufferS + rowOffsetS + ColumnIndex;
BufferDPtr=BufferD + rowOffsetD + ColumnIndex;
*BufferDPtr=*BufferSPtr;
}
}

在哪里SizeX 是源码的宽度OriginX 是感兴趣区域的左边OriginY 是感兴趣区域的顶部

最佳答案

我还没有发现任何关于更改循环优化标志的信息,但是根据文档,您可以在函数上使用属性 optimize (查看 herehere )来像这样覆盖该函数的优化设置:

void foo() __attribute__((optimize("O2", "inline-functions")))

如果您想为多个函数更改它,可以使用 #pragma GCC optimize 为以下所有函数 (look here) 设置它。

因此,您应该能够使用一组不同的优化标志来编译包含 crop 的函数,而忽略自动矢量化。这具有对该函数的编译标志进行硬编码的缺点,但这是我发现的最好的。

关于重组以获得更好的性能,我想到了我在评论中提到的两点(假设范围不能重叠):

  • 将指针声明为 __restrict 以告诉编译器它们没有别名(一个指针指向的区域不会被函数内的任何其他方式访问)。指针别名的可能性是优化器的一个主要绊脚石,因为如果它不知道写入 BufferD 是否会改变 BufferS< 的内容,它就不能轻易地重新排序访问.

  • 用复制调用替换内部循环:

    std::copy(BufferS + rowOffsetS, BufferS + rowOffsetS + Destination.GetColumns(), BufferD + rowOffsetD);

    copy 函数可能会得到很好的优化(可能会将参数转发给 memmove),因此这可能会使您的代码更快,同时也会使您的代码更短(总是一个加号)。

关于c++ - 自动矢量化感兴趣区域(裁剪),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12477337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com