使ってるやつから軽くピックアップ。Intel Core 2 から Skylake アーキテクチャーまで一覧として見れるものがなかったので作成。cpuid は未掲載のものもあるかも。不正確な情報や,追加して欲しいものがあったら連絡くれれば随時追加します。
Sandy Bridge が一つの大きな境目とみなせると思いますし,その前後で別実装を用意するのもアリかもしれません。それ以前だと MMX の方が早いとかもあるかも。
以下のページの4番の PDF を引くことを推奨。AMD, Intel, VIA の CPU に関するものが全てまとめてあります。
1. SSE
1.1 _mm_add/sub_ps (ADD/SUBPS)
| レイテンシー | スループット | |
|---|---|---|
| Yonah (06_0E) | ||
| Conroe, Allendale, Merom (06_0F) | 3 | 1 |
| Wolfdale, Penryn, Yorkfield (06_17) | ||
| Nehalem (06_1A, 06_1E, 06_1F, 06_2E) | ||
| Westmere (06_25, 06_2C, 06_2F?) | ||
| Sandy Bridge (06_2A, 06_2D) | ||
| Ivy Bridge (06_3A, 06_3E) | ||
| Haswell (06_3C, 06_45, 06_46, 06_3F) | ||
| Broadwell (06_3D, 06_47, 06_56) | ||
| Skylake (06_4E, 06_5E) | 4 | 0.5 |
| Bulldozer | 5-6 | 0.5 |
| Piledriver | ||
| Steamroller | 5-6 | 1 |
| Excavator | ||
| Bobcat | 3 | 1 |
| Jaguar | ||
| Ryzen | 3 | 0.5 |
1.2 _mm_mul_ps (MULPS)
| レイテンシー | スループット | |
|---|---|---|
| Conroe, Allendale, Merom (06_0F) | 4 | 1 |
| Wolfdale, Penryn, Yorkfield (06_17) | ||
| Nehalem (06_1A, 06_1E, 06_1F, 06_2E) | ||
| Westmere (06_25, 06_2C, 06_2F?) | ||
| Sandy Bridge (06_2A, 06_2D) | 5 | 1 |
| Ivy Bridge (06_3A, 06_3E) | ||
| Haswell (06_3C, 06_45, 06_46, 06_3F) | 5 | 0.5 |
| Broadwell (06_3D, 06_47, 06_56) | 3 | 0.5 |
| Skylake (06_4E, 06_5E) | 4 | 0.5 |
| Bulldozer | 5-6 | 0.5 |
| Piledriver | ||
| Steamroller | ||
| Excavator | 5 | 0.5 |
| Bobcat | 2 | 2 |
| Jaguar | 4 | 2 |
| Ryzen | 3 | 0.5 |
1.3 _mm_div_ps (DIVPS)
最新アーキテクチャーだと Newton Raphson による逆数より DIV 使った方が早いかもですね。ただ,実質 AVX が使える環境になるので,Sandy Bridge を境目にするなら VEX エンコーディングで書き出す環境向けコードとそうでないコードで分けると綺麗な気がします。
| レイテンシー | スループット | |
|---|---|---|
| Conroe, Allendale, Merom (06_0F) | < 21 | < 16 |
| Wolfdale, Penryn, Yorkfield (06_17) | < 21 | < 14 |
| Nehalem (06_1A, 06_1E, 06_1F, 06_2E) | < 16 | < 12 |
| Westmere (06_25, 06_2C, 06_2F?) | ||
| Sandy Bridge (06_2A, 06_2D) | 14 | 14 |
| Ivy Bridge (06_3A, 06_3E) | 10-14 | 14 (6) |
| Haswell (06_3C, 06_45, 06_46, 06_3F) | < 13 | 6 |
| Broadwell (06_3D, 06_47, 06_56) | < 11 | 3 |
| Skylake (06_4E, 06_5E) | 11 | 3 |
| Bulldozer | 9-24 | 4.5-9.5 |
| Piledriver | 9-27 | 5-10 |
| Steamroller | 9-17 | 4-6 |
| Excavator | 8-22 | 4-8 |
| Bobcat | 38 | 38 |
| Jaguar | 19 | 19 |
| Ryzen | 10 | 3 |
1.4 _mm_min/max_ps (MIN/MAXPS)
Intel は ADD/SUB と同じ
| レイテンシー | スループット | |
|---|---|---|
| Conroe, Allendale, Merom (06_0F) | 3 | 1 |
| Wolfdale, Penryn, Yorkfield (06_17) | ||
| Nehalem (06_1A, 06_1E, 06_1F, 06_2E) | ||
| Westmere (06_25, 06_2C, 06_2F?) | ||
| Sandy Bridge (06_2A, 06_2D) | ||
| Ivy Bridge (06_3A, 06_3E) | ||
| Haswell (06_3C, 06_45, 06_46, 06_3F) | ||
| Broadwell (06_3D, 06_47, 06_56) | ||
| Skylake (06_4E, 06_5E) | 4 | 0.5 |
| Bulldozer | 2 | 0.5 |
| Piledriver | ||
| Steamroller | ||
| Excavator | ||
| Bobcat | 2 | 2 |
| Jaguar | 2 | 1 |
| Ryzen | 1 | 0.5 |
1.5 _mm_andnot/and/or_ps (ANDN/AND/OR)
| レイテンシー | スループット | |
|---|---|---|
| Conroe, Allendale, Merom (06_0F) | 1 | 1 OR: 0.33 |
| Wolfdale, Penryn, Yorkfield (06_17) | 1 | 0.33 |
| Nehalem (06_1A, 06_1E, 06_1F, 06_2E) | ||
| Westmere (06_25, 06_2C, 06_2F?) | ||
| Sandy Bridge (06_2A, 06_2D) | 1 | 1 |
| Ivy Bridge (06_3A, 06_3E) | ||
| Haswell (06_3C, 06_45, 06_46, 06_3F) | ||
| Broadwell (06_3D, 06_47, 06_56) | ||
| Skylake (06_4E, 06_5E) | 1 | 0.33 |
| Bulldozer | 2 | 0.5 |
| Piledriver | ||
| Steamroller | ||
| Excavator | ||
| Bobcat | 1 | 1 |
| Jaguar | 1 | 0.5 |
| Ryzen | 1 | 0.25 |
1.6 _mm_xor_ps (XOR)
AMD は ANDN/AND/OR に同じ。
| レイテンシー | スループット | |
|---|---|---|
| Conroe, Allendale, Merom (06_0F) | 1 | 0.33 |
| Wolfdale, Penryn, Yorkfield (06_17) | ||
| Nehalem (06_1A, 06_1E, 06_1F, 06_2E) | ||
| Westmere (06_25, 06_2C, 06_2F?) | ||
| Sandy Bridge (06_2A, 06_2D) | ||
| Ivy Bridge (06_3A, 06_3E) | 1 | 1 |
| Haswell (06_3C, 06_45, 06_46, 06_3F) | ||
| Broadwell (06_3D, 06_47, 06_56) | ||
| Skylake (06_4E, 06_5E) | ||
| Bulldozer | 2 | 0.5 |
| Piledriver | ||
| Steamroller | ||
| Excavator | ||
| Bobcat | 1 | 1 |
| Jaguar | 1 | 0.5 |
| Ryzen | 1 | 0.25 |
1.7 _mm_sqrt_ps (SQRTPS)
| レイテンシー | スループット | |
|---|---|---|
| Conroe, Allendale, Merom (06_0F) | < 32 | < 27 |
| Wolfdale, Penryn, Yorkfield (06_17) | < 21 | < 14 |
| Nehalem (06_1A, 06_1E, 06_1F, 06_2E) | < 20 | < 16 |
| Westmere (06_25, 06_2C, 06_2F?) | ||
| Sandy Bridge (06_2A, 06_2D) | 14 | 14 |
| Ivy Bridge (06_3A, 06_3E) | 14 | 14 (7) |
| Haswell (06_3C, 06_45, 06_46, 06_3F) | 13 | 7 |
| Broadwell (06_3D, 06_47, 06_56) | ||
| Skylake (06_4E, 06_5E) | ||
| Bulldozer | 14-15 | 4.5-12 |
| Piledriver | 13-15 | 5-12 |
| Steamroller | 12-13 | 4-9 |
| Excavator | 13 | 4 |
| Bobcat | 48 | 48 |
| Jaguar | 21 | 21 |
| Ryzen | 9-10 | 4-5 |
1.8 _mm_rcp/rsqrt_ps (RCP/RSQRTPS)
| レイテンシー | スループット | |
|---|---|---|
| Conroe, Allendale, Merom (06_0F) | 3 | RCP: 1 RSQRT: 2 |
| Wolfdale, Penryn, Yorkfield (06_17) | 3 | 2 |
| Nehalem (06_1A, 06_1E, 06_1F, 06_2E) | 3 | 2 |
| Westmere (06_25, 06_2C, 06_2F?) | ||
| Sandy Bridge (06_2A, 06_2D) | 5 | 1 |
| Ivy Bridge (06_3A, 06_3E) | ||
| Haswell (06_3C, 06_45, 06_46, 06_3F) | ||
| Broadwell (06_3D, 06_47, 06_56) | ||
| Skylake (06_4E, 06_5E) | 4 | 1 |
| Bulldozer | 5 | 1 |
| Piledriver | ||
| Steamroller | ||
| Excavator | RCP: 5 RSQRT: 4 | 1 |
| Bobcat | 3 | 2 |
| Jaguar | 2 | 1 |
| Ryzen | 5 | 1 |
1.9 _mm_unpackhi/lo/shuffle_ps(UNPCKH/L/SHUFPS)
| レイテンシー | スループット | |
|---|---|---|
| Conroe, Allendale, Merom (06_0F) | 2 | 1 |
| Wolfdale, Penryn, Yorkfield (06_17) | 1 | 1 |
| Nehalem (06_1A, 06_1E, 06_1F, 06_2E) | ||
| Westmere (06_25, 06_2C, 06_2F?) | ||
| Sandy Bridge (06_2A, 06_2D) | ||
| Ivy Bridge (06_3A, 06_3E) | ||
| Haswell (06_3C, 06_45, 06_46, 06_3F) | ||
| Broadwell (06_3D, 06_47, 06_56) | ||
| Skylake (06_4E, 06_5E) | ||
| Bulldozer | 2 | 1 |
| Piledriver | ||
| Steamroller | ||
| Excavator | ||
| Bobcat | 1 | 1 |
| Jaguar | 2 | 0.5 |
| Ryzen | 1 | 0.5 |