2016-10-21 7 views
0

C++でコード化された文字列一致アルゴリズムでSSE4.2命令を使用しようとしています。SSE4.2命令の使用小さなパターンのPCMPESTRM

私はこれらの指示を使用してより小さいパターンにマッチさせる方法を理解しておらず、誰かがそれを助けてくれることを望んでいました。

コード例では、パックされた文字列「i am an antelope」内のパターン「ant」を検索しようとしています。私は、SSE4.2命令を含めることnmmintrin.hための#includeを持っている。これは、今、私のコードをある8

たインデックスに1を除くすべてゼロに設定されたマスクであることが結果を望んでいるだろう:

void print128_num(__m128i var) 
{ 
    uint8_t *val = (uint8_t*) &var; 
    printf("Text: %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i %i \n", 
      val[0], val[1], val[2], val[3], val[4], val[5], 
      val[6], val[7], val[8], val[9], val[10], val[11], 
      val[12], val[13], val[14], val[15]); 
} 

int main(){ 

    __m128i s = _mm_set_epi8('e','p','o','l','e','t','n','a',' ','n','a',' ','m','a',' ','i'); 
    __m128i p = _mm_set_epi8(0,0,0,0,0,0,0,0,0,0,0,0,0,'t','n','a'); 

    print128_num(s); 
    print128_num(p); 

    __m128i res = _mm_cmpestrm(s, 16, p, 3, 0); 
    print128_num(res); 

    return 0; 
} 

初期化関数で引数を少なくすることができないため、すべてのゼロを追加しました。私はこれが間違っていることを認識していますが、それをどうやって行うのか分からず、いくつかの非常に必死の試みをしました。

とにかく、これは私がコンパイルする方法である:G ++ -g sse4test.cpp -o sse4test -std = C++ 11 -msse4.2

と、これは私の出力である:

I
Text: 105 32 97 109 32 97 110 32 97 110 116 101 108 111 112 101 
Text: 97 110 116 0 0 0 0 0 0 0 0 0 0 0 0 0 
Text: 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

本当に分かりません。 (最後の行)。

ご協力いただければ幸いです。

答えて

2

コードには2つの問題があります。まず、_mm_cmpestrmの呼び出しで、ソースパターンが逆転しています。次に、最後の引数に0を指定します。これは、動作モードを指定するフラグのセットです。部分文字列の場合はFor each character c in A, determine whether any character in B is equal to c.

として記述

ゼロのモードが_SIDD_CMP_EQUAL_ANYとして出てくる、検索モードは_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_BIT_MASKとして指定する必要があります。

これらの変更を行うと、出力は「0 1」、つまり9文字目で一致します。

BTW:_mm_set_epi8の代わりに_mm_loadu_si128((__m128i*)(str));を使用して文字列から読み込むことができます。