【发布时间】:2012-09-18 12:46:45
【问题描述】:
我有一个库,其中包含一些图像处理算法,包括感兴趣区域(裁剪)算法。使用 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 是感兴趣区域的顶部
【问题讨论】:
-
我不确定我是否正确理解了您的问题。您想将该循环标记为不被矢量化或重组它以获得更好的性能?对我来说似乎很矛盾。但在性能方面:这两个范围可以重叠吗?如果不是:您是否在指针上使用
__restrict以使编译器清楚这一点? Pointeraliasing 是优化的一大亮点。此外:您是否考虑过将std::copy用于您的内部循环?这可能会得到更好的优化,并使您的代码更短。 -
这似乎是一个矛盾,但这就是想法。向量化目前会降低性能,因此我可以想到为此循环禁用它或改进代码是两个选项!我会限制并复制一下。
-
您可能想在您的问题中提到,在这种情况下,作物的表现会恶化。就目前而言,我假设 Crop 算法的性能通过矢量化保持不变。如果您还不知道,
-ftree-vectorizer-verbose=n标志可能会帮助您获得关于优化器在做什么以及为什么做的更具体的信息。
标签: c++ gcc crop vectorization roi