2017-11-12 6 views
0

私は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

+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をわずかに打ち負かすことができるかもしれないと思われます)。

関連する問題