2016-06-02 6 views
1

私はbenchmark.jsを使って、JSとC++(node.jsバインディング)の2つのバージョンの関数を処理しています。CPU周波数を超えるベンチマーク

C++バージョンがある固有の単一のコンパイラ(2サイクルのレイテンシ+ 0.5サイクルスループット)とのforループ:

for (size_t i = 0; i < arrlen; i++) { 
#if defined(_MSC_VER) 
    (*events)[i] = _byteswap_ushort((*events)[i]); 
#elif defined(__GNUC__) 
    (*events)[i] = __builtin_bswap16((*events)[i]); 
#endif 
} 

私はそれが速いことを期待...しかし、それは私のCPUの周波数よりも高速のクロッキングいます(4.0GHz)。どのようにこれが起こっていることができますか? (私は関数は、ベンチマークスイートの外で動作することをテストしている。)

native: 17,253,787,071 elements/sec (10k elements in array * 1,725,379 calls/sec) 
JS: 846,298,297 elements/sec (10k elements in array * 84,630 calls/sec) 
// both ~90 runs sampled 
+3

ベクトル化と[スーパースカラー処理](https://en.wikipedia.org/wiki/Superscalar_processor)。 – Cornstalks

答えて

2

よりコンテキストなしで正確に言うのは難しいが、次のおそらく一つ以上:

  • コンパイラが使用しているがPSHUFBのような命令を使用して、一度に複数の要素をバイトスワップすることができます。 (PSHUFBは、AVX2をサポートするプロセッサでは、一度に最大16ワードのスワップが可能です。)

  • パイプライン効果により、プロセッサはこのループの複数の繰り返しを同時に処理できます。

  • ベンチマークに問題があり、計算全体を最適化することができません。 (おそらく言及する価値はありません)

+0

私は分解を見ないと思った。そうです、PSHUFBを128ビットレジスタで使用しています(これはbswapよりもレイテンシとスループットが優れています)。かなり驚くべき指導。 – ZachB