我正在使用SSE对图像中的像素执行按位NOT操作。
我有一些问题:
- 是否可以使用OpenMP进一步优化?
- 我的算法中是否存在可以优化的瓶颈?
以下是我的代码:
unsigned int iSSE2Size = (SrcImage1.GetHeight() * (SrcImage1.GetStepBytes() >> 1)) >> 3;
__m128i *m_ucSrcPtr = (__m128i *)SrcImage1.GetWordPtr();
__m128i *m_ucDstPtr = (__m128i *)DestImage.GetWordPtr();
__m128i iMaxVal = _mm_set1_epi16(0xFFFF);
unsigned short *srcRowPtr, *dstRowPtr;
while (iSSE2Size-- > 0)
{
*m_ucDstPtr = _mm_andnot_si128(*m_ucSrcPtr, iMaxVal );
m_ucSrcPtr++;
m_ucDstPtr++;
}
a[i] = ~a[i]
可以很好地进行自动向量化。将其写成与全1异或(即~0ULL
)可能也有帮助,特别是如果你的目标是 AVX。(VPANDN
反转寄存器操作数,而不是寄存器/内存操作数)。你是针对 AVX 还是 SSE2-only 版本?AVX 可以使用 256b FP 布尔运算,这很好,因为你每个时钟周期只能维持一个向量,因为你正在将结果存回内存。你正在调整哪些微架构,并在哪些微架构上进行基准测试? - Peter CordesSrcImage1.SembufGetHeight()
返回一个float
或double
,否则你的代码不会执行任何FP操作。 - Peter Cordes