32 ビットのループ カウンタを 64 ビットに置き換えると、Intel CPU の _mm_popcnt_u64 で大幅なパフォーマンスの偏差が発生する可能性があります
この問題は次の理由で発生します。誤ったデータ依存関係、具体的には、
_mm_popcnt_u64 命令には宛先レジスタに対する誤った依存関係があり、宛先レジスタの準備ができるまで実行前に待機することになります。この依存関係はループ反復間で引き継がれる可能性があり、プロセッサが異なるループ反復を並列化することが困難になります。
ループ変数のタイプ (符号なしか uint64_t) の選択は、レジスタ アロケーターに影響します
これはレジスタを変数に割り当てるため、レジスタ割り当ての違いと、 _mm_popcnt_u64 命令。
サイズ変数の前に static キーワードを挿入すると、
レジスタ割り当てが変更され、誤った依存関係の連鎖が切断される可能性があります。場合によっては、宛先レジスタに対する繰り返し間の依存関係が解消され、パフォーマンスが向上する可能性があります。
この問題を軽減し、一貫したパフォーマンスを実現するには:
以上がループ カウンターのビット幅を変更すると、Intel CPU の _mm_popcnt_u64 のパフォーマンスに影響するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。