2016-05-16 3 views
2

SSEを使用してイメージのピクセルに対してビット単位のNOT演算を実行しています。SSE組み込み関数 - 論理NOT最適化

私はいくつかの質問を持っている:

  1. これは、OpenMPのを使用してさらに最適化することができますか?
  2. アルゴリズムに最適化できるボトルネックはありますか?

ここでは私のコードです:

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++; 
} 
+1

ループアンローリングを試しましたか? – Mehrdad

+1

実際にコンパイルする関数でこれをラップすることができるので、コンパイラの出力を見ることができますか? –

+1

'_mm_set1_epi16(65535)'だけを使って、コンパイラにデータの取得方法を心配させてみませんか? (ヒントでは、スタック上のローカル配列に格納してそこからロードするよりもうまくいくでしょう。すべてのもののレジスタは、 'pcmpeqw same、same'を使ってオンザフライで生成することができ、CPUはそのイディオムをxor-zeroingのように古い値とは無関係ですが、コンパイラではこれを行います) –

答えて

0
  1. はいあなたは、両方のループアンロールに試してみて、あなたのコードを最適化するためのOpenMPを使用することができます。

    #pragma omp parallel for 
    for (;iSSE2Size-=2 > 0;) 
    { 
        *m_ucDstPtr = _mm_andnot_si128(*m_ucSrcPtr, iMaxVal); 
        m_ucSrcPtr++; 
        m_ucDstPtr++; 
    
        *m_ucDstPtr = _mm_andnot_si128(*m_ucSrcPtr, iMaxVal); 
        m_ucSrcPtr++; 
        m_ucDstPtr++; 
    } 
    

    パフォーマンスを向上させるために複数回展開することができます。

  2. 提供したスニペットにボトルネックはありません。

関連する問題