2
SSEを使用してイメージのピクセルに対してビット単位のNOT演算を実行しています。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++;
}
ループアンローリングを試しましたか? – Mehrdad
実際にコンパイルする関数でこれをラップすることができるので、コンパイラの出力を見ることができますか? –
'_mm_set1_epi16(65535)'だけを使って、コンパイラにデータの取得方法を心配させてみませんか? (ヒントでは、スタック上のローカル配列に格納してそこからロードするよりもうまくいくでしょう。すべてのもののレジスタは、 'pcmpeqw same、same'を使ってオンザフライで生成することができ、CPUはそのイディオムをxor-zeroingのように古い値とは無関係ですが、コンパイラではこれを行います) –