2016-10-21 5 views
0

C++로 코딩 된 문자열 일치 알고리즘에서 일부 SSE4.2 intruction을 사용하려고합니다.작은 패턴의 SSE4.2 명령 PCMPESTRM 사용

작은 패턴과 일치시키기 위해이 지침을 사용하는 방법을 이해하지 못하고 누군가가 나를 도와 줄 수 있기를 바랍니다.

코드 예제에서 나는 포장 된 문자열 "antelope"내에서 패턴 "ant"를 찾으려고합니다. 나는 sse4.2 지침을 포함 nmmintrin.h에 대한 #INCLUDE을 가지고이 지금 내 코드를 8.

인덱스에 1을 제외하고 모두 0으로 설정 마스크로 결과에 대한 희망 :

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

초기화 함수가 더 적은 인수를 허용하지 않기 때문에 모든 0을 추가했습니다. 이것이 잘못되었다는 것을 알지만 어떻게해야할지 모르고 몇 가지 절실한 시도를했습니다.

어쨌든 이것은 내가 컴파일하는 방법입니다 : g ++ -g sse4test.cpp -o sse4test -std = C++ -msse4.2

(11)이 내 출력 :

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 

하는 I 정말 이해가 안돼. (마지막 줄).

도움이 될 것입니다.

답변

2

코드에 두 가지 문제점이 있습니다. 첫째, _mm_cmpestrm 전화에서 소스가이고 패턴이 인 경우가 취소되었습니다. 두 번째로 마지막 인수에 0을 지정합니다.이 인수는 작동 모드를 지정하는 플래그 세트입니다.

제로의 모드는 모드가 _SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_ORDERED | _SIDD_BIT_MASK로 지정해야합니다 검색 문자열의 경우 For each character c in A, determine whether any character in B is equal to c.

설명, _SIDD_CMP_EQUAL_ANY로 나온다.

이러한 변경을 수행하면 출력이 "0 1"즉 9 번째 문자의 일치가됩니다.

BTW : _mm_set_epi8 대신 _mm_loadu_si128((__m128i*)(str));을 사용하여 문자열에서로드 할 수 있습니다.