나는 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
관련 게시물 : https://stackoverflow.com/questions/40915243/find-the-first-instance-of-a-character-using-simd – Jimbo
최적화 된 컴파일 중입니까? 예 : -O3? – Brian
대부분의 시스템에서는'strchr'과 같은 표준 함수를위한 소스를 얻을 수 있습니다. 또는 적어도 생성 된 기계어 코드를 검사 할 수는 있습니다. 소스 (또는 기계 코드)를 연구하여 그 기능을 확인해 보는 것이 좋습니다. 내 추측에 따르면 40 년이 넘게 기능이 존재하여 꽤 많이 조정되고 최적화되었습니다. –