SIMD を使用して atoi を実装するには?
問題:
atoi を書いてみたいSIMD 命令を使用した実装。RapidJSON に含まれます。私が思いついたアルゴリズムは次のとおりです。
私のアルゴリズムは正しいですか?もっと良い方法はありますか? SIMD 命令セットを使用した atoi のリファレンス実装はありますか?
答え:
アルゴリズムは正しく、完全です。これは、MIN_INT=-2147483648 から MAX_INT=2147483647 まで、および MIN_UINT=0 から MAX_UINT=4294967295 までの int と uint に対して機能します。
Intel 構文を使用して GNU Assembler で書かれたリファレンス実装が提供されています。
これのプロパティコードは次のとおりです。
アルゴリズムのアプローチは次のとおりです:
PHADDD を追加しています。 2(PSHUFD PADDD)
Intel-IACA スループットの結果Haswell 32 ビットの分析:
スループット分析レポートブロック スループット: 16.10 サイクル スループットのボトルネック: 反復間N - リソースの競合によって遅延が発生したポート番号またはサイクル数、DV - ディバイダー パイプ (ポート 0 上)
D - データ フェッチ パイプ (ポート 2 および 3 上)、CP -クリティカル パス
F - 前の命令とのマクロ融合発生しました
命令 micro-ops がポートにバインドされていません
^ - Micro Fusion が発生しました
@ - SSE 命令が AVX256 命令に続いた場合、数十サイクルのペナルティが発生します期待
! - 命令はサポートされていません。分析では考慮されていません
|の数 | サイクル内のポート圧力 | |
| 0* | | | | | | | | | | xor eax、eax
| 0* | | | | | | | | | | xor ecx, ecx
| 0* | | | | | | | | | | xor edx、edx
| 1 | | 0.1 | | | | | 0.9 |
以上がSIMD 命令を使用して atoi を効率的に実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。