- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个库,其中包含一些图像处理算法,包括感兴趣区域(裁剪)算法。使用 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
(查看 here 和 here )来像这样覆盖该函数的优化设置:
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/
如何使 java.nio.channels.SelectionKey 对 NO opts 感兴趣? SelectionKey#cancel() 有可能,但不太好,因为它使 key 无用。 Select
我正在寻找可以在 8 位微处理器上运行并支持动态语言的推荐虚拟机。我喜欢 VM 解决方案,因为我认为它在代码密度、可移植性和拥有更小解释器的能力方面有好处,从而为更大的程序留出更多空间。 我的目标是在
这里有一个关于在 KeyValuePair(TKey, TValue) 中重写 ToString() 的问题,这是不可能的。 我看到有一些属性类型,例如 DebuggerDisplayAttribut
我是一名优秀的程序员,十分优秀!