2017-11-12 28 views
0

나는 SIMD를 배우고 있으며 문자를 찾는 데 strchr을 이길 수 있는지 궁금합니다. strchr은 동일한 내장 함수를 사용하지만 문자가 배열에 있고 null 검사를 피할 계획 인 반면 null을 검사한다고 가정합니다.strchr이 내 simd 코드의 두 배 빠른 이유는 무엇입니까?

내 코드는 다음과 같습니다에서

size_t N = 1e9; 
bool found = false; //Not really used ... 
size_t char_index1 = 0; 
size_t char_index2 = 0; 
char * str = malloc(N); 
memset(str,'a',N); 

__m256i char_match; 
__m256i str_simd; 
__m256i result; 
__m256i* pSrc1; 

int simd_mask; 

str[(size_t)5e8] = 'b'; 


    char_match = _mm256_set1_epi8('b'); 
    result = _mm256_set1_epi32(0); 

    simd_mask = 0; 

    pSrc1 = (__m256i *)str; 

    while (1){ 
     str_simd = _mm256_lddqu_si256(pSrc1); 
     result = _mm256_cmpeq_epi8(str_simd, char_match); 
     simd_mask = _mm256_movemask_epi8(result); 
     if (simd_mask != 0){ 
      break; 
     } 
     pSrc1++; 
    } 

전체 (아직 완성 된 코드) : https://gist.github.com/JimHokanson/433e185ba53b41e49ce3ac804568ac1e

strchr과이 코드보다 두 배 빠른 (GCC와 엑스 코드를 사용하여). 이유를 이해하고 싶습니다.

업데이트 : 컴파일 사용 : GCC -std = C11 -mavx2 -mlzcnt

+0

관련 게시물 : https://stackoverflow.com/questions/40915243/find-the-first-instance-of-a-character-using-simd – Jimbo

+2

최적화 된 컴파일 중입니까? 예 : -O3? – Brian

+1

대부분의 시스템에서는'strchr'과 같은 표준 함수를위한 소스를 얻을 수 있습니다. 또는 적어도 생성 된 기계어 코드를 검사 할 수는 있습니다. 소스 (또는 기계 코드)를 연구하여 그 기능을 확인해 보는 것이 좋습니다. 내 추측에 따르면 40 년이 넘게 기능이 존재하여 꽤 많이 조정되고 최적화되었습니다. –

답변

0

내가 컴파일러 최적화 플래그를 설정하지 않았다. -O3을 설정하면 SIMD 코드는 strchr 시간의 75 % 만 사용합니다.

업데이트 : 또한 코드의 최종 작동 버전이 아님을 분명히해야합니다. 여전히 추가 점검이 있어야하며 호출을 최적화 할 수있는 방법이 있습니다 (필자는 생각합니다). 코드가 strchr의 야구장에 있지만 적어도이 시점에서. 코멘트에서 지적한 것처럼이 버전은 페이지와 결함을 넘어 읽을 수 있습니다. 마지막으로, 이것은 대부분 SIMD 학습 기회 (나 자신을위한)이고, memchr은 아마 당신의 최선의 내기 일 것이다. (비록 당신이 감시 버퍼를 가지고 있다면 memchr을 약간 이길 수 있다고 생각할지라도).