私はSIMDを勉強していて、文字を見つける際にstrchrを打つことが可能かどうかを知りたいと思っていました。 strchrは同じ組み込み関数を使用しているようですが、文字が配列内にあり、ヌルチェックを避けることを計画しているのに対して、nullをチェックすると仮定します。なぜstrchrは私のsimdコードの2倍の速さですか?
私のコードは次のとおりです。で
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は、このコードの2倍の速さで(GCCとXcodeを使用して)。理由を理解したいと思っています。
更新:gccの-std = c11を-mavx2 -mlzcnt
関連投稿:https://stackoverflow.com/questions/40915243/find-the-first-instance-of-a-character-using-simd – Jimbo
-O3など最適化をコンパイルしていますか? – Brian
ほとんどのシステムでは、 'strchr'のような標準関数のソースを得ることができます。あるいは、少なくとも生成されたマシンコードを調べることができます。ソースコード(またはマシンコード)を調べて、それが何であるかを調べることをお勧めします。私の推測では、40年以上にわたって機能が存在しており、かなり調整され最適化されているということです。 –