LoginSignup
1
1

More than 1 year has passed since last update.

AVX/AVX2による256ビットストア命令

Last updated at Posted at 2021-12-06

はじめに

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から対応しています.

レイテンシが長いのは,ベンチマーク時にキャッシュに乗っていないため,メモリからの操作になっているからです.

メモリからのロードはすべての演算の効率化を台無しにすることがここからよくわかります.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1