はじめに
256ビットのストア命令について書きます.
_mm256_store|storeu_ps|pd|si256 (AVX)
void _mm256_store_ps (float * mem_addr, __m256 a)
asm: vmovaps m256, ymm
void _mm256_storeu_ps (float * mem_addr, __m256 a)
asm: vmovups m256, ymm
void _mm256_store_pd (double * mem_addr, __m256d a)
asm: vmovapd m256, ymm
void _mm256_storeu_pd (double * mem_addr, __m256d a)
asm: vmovupd m256, ymm
void _mm256_store_si256 (__m256i * mem_addr, __m256i a)
asm: vmovdqa m256, ymm
void _mm256_storeu_si256 (__m256i * mem_addr, __m256i a)
asm: vmovdqu m256, ymm
Architecture | Latency | Throughput | Uops |
---|---|---|---|
Alderlake | mem. dep. | 1.0 | - |
Icelake | 4/11 | 0.5(1) | 1/2 |
Skylake | 4/10 | 1 | 1/2 |
Broadwell | 5/9 | 1 | 1/2 |
Haswell | 5/9 | 1 | 1/2 |
Ivy Bridge | 5/9 | 2 | 1/2 |
Sandy Bridge | 5/9 | 2 | 1/2 |
Zen3 | 9/10 | 1 | 1 |
Zen2 | 8/9 | 1 | 1 |
Zen | 7/11 | 2 | 2 |
- AIDA64だとicelakeも1.0と出ているため,alderlakeの1は,測り方の違いなだけの可能性
- ポート数的には,icelakeと同じストア用のポートがあるため,同様の数値にならないとおかしい.
アライメントがずれた場合(AIDA64)
VMOVUPS [m256 + 4], ymm
Architecture | Latency | Throughput | Uops |
---|---|---|---|
Alderlake | mem. dep. | 2 | - |
Icelake | mem. dep. | 2 | - |
Skylake | mem. dep. | 2 | - |
Broadwell | mem. dep. | 3 | - |
Haswell | mem. dep. | 3 | - |
Ivy Bridge | mem. dep. | 4 | - |
Sandy Bridge | mem. dep. | 4 | - |
Zen3 | mem. dep. | 1 | - |
Zen2 | mem. dep. | 2 | - |
Zen | mem. dep. | 4 | - |
説明
256ビット浮動小数点や整数をストアします.
store命令は書き込みは32ビット境界にそろっている必要があります.
storeu命令はそろっていなくもてかまいません.
そろっていない場合は,低速になります.
ストアは,値をストアバッファにためて送るため,ストアした値が即時必要なレジスタスピルを頻発するような状況でもない限り,ほとんどの場合でレイテンシを考慮する必要はありません.
_mm256_stream_ps|pd|si256 (AVX)
void _mm256_stream_ps (float * mem_addr, __m256 a)
asm: vmovntps m256, ymm
void _mm256_stream_pd (double * mem_addr, __m256d a)
asm: vmovntpd m256, ymm
void _mm256_stream_si256 (__m256i * mem_addr, __m256i a)
asm: vmovntdq m256, ymm
Architecture | Latency | Throughput | Uops |
---|---|---|---|
Alderlake | mem. dep. | 0.5 | - |
Icelake | 390 | 1.03 | 1/2 |
Skylake | 358 | 1 | 1/2 |
Broadwell | 344 | 1 | 1/2 |
Haswell | 392 | 1 | 1/2 |
Ivy Bridge | 329 | 2 | 1/2 |
Sandy Bridge | 360 | 2 | 1/2 |
Zen3 | 777 | 1 | 1 |
Zen2 | 1200 | 1 | 1 |
Zen | 1250 | 2 | 2 |
- AIDA64だとicelakeはT:1.17
- Alderlakeのスループットが0.5です.
説明
256ビット浮動小数点や整数をキャッシュを介さずストアします.
メモリの32バイト境界にアライメントはそろっている必要があります.
そろっていない場合は,プログラムが落ちます.
ロードと違ってstream命令は全ての型に対して用意されています.
またロードはAVX2からの対応に対し,ストアはAVXから対応しています.
レイテンシが長いのは,ベンチマーク時にキャッシュに乗っていないため,メモリからの操作になっているからです.
メモリからのロードはすべての演算の効率化を台無しにすることがここからよくわかります.