8

__int128_tGCC が提供するような 128 ビットの整数データ型はエミュレートされているため、速度が遅いと聞いたことが あります。ただし、さまざまな SSE 命令セット (SSE、SSE2、...、AVX) が 128 ビット レジスタ用の少なくともいくつかの命令を導入したことは理解しています。私は SSE やアセンブリ / マシン コードについてあまり知らないので、__int128_t最新バージョンの GCC を使用して演算がエミュレートされているかどうかを誰かが説明してくれるかどうか疑問に思っていました。

__int128_t私がこれを尋ねている理由は、どの SSE 命令が利用されているかに応じて、GCC の異なるバージョン間でパフォーマンスに大きな違いを期待することが理にかなっているのかどうか疑問に思っているからです。

では、__int128_t算術演算のどの部分が GCC によってエミュレートされ、SSE 命令 (もしあれば) によってどの部分が実装されているのでしょうか?

4

3 に答える 3

12

私の質問で2つの異なることを混同していました。

まず、PaulR がコメントで説明したように、「SSE または AVX には 128 ビットの算術演算はありません (ビット単位の演算を除く)」。これを考慮すると、最新の x86-64 ベースのプロセッサ (AMD ファミリ 10 または Intel Core アーキテクチャなど) では 128 ビット演算をエミュレートする必要があります。これは GCC とは関係ありません。

問題の 2 番目の部分は、GCC での 128 ビット算術エミュレーションが SSE/AVX 命令またはレジスターの恩恵を受けるかどうかです。PaulR のコメントで暗示されているように、SSE/AVX には、128 ビット演算をより簡単に実行できるものはあまりありません。ほとんどの場合、これには x86-64 命令が使用されます。私が興味を持っているコードは でコンパイルできませんが-mno-sse、 で問題なくコンパイルでき-mno-sse2 -mno-sse3 -mno-ssse3 -mno-sse4 -mno-sse4.1 -mno-sse4.2 -mno-avx -mno-avx2、パフォーマンスに影響はありません。したがって、私のコードは最新の SSE 命令の恩恵を受けていません。

于 2013-05-15T17:18:11.063 に答える