LoginSignup
2
2

More than 1 year has passed since last update.

AVX/AVX2による論理演算

Last updated at Posted at 2021-12-12

はじめに

YMMレジスタに対して,256ビットの論理演算(and, or, xor, andnot)を行います.
整数だけでなく,浮動小数点のfloat/doubleに対しても論理演算が用意されています.

not演算は用意されておらず,否定が必要な場合には,andnot演算が代わりにあります.
一見,見間違えますが,andnotはnandのことではありません.
以下に,対応するC言語(C++)のコードを示します.

ope c-code
and a&b
or a|b
xor a^b
andnot (~a)&b
-------- --------
not ~a  
nand ~(a&b)

また,not演算は,比較演算とxorを使って作ることもできます.
しかしながら,比較の条件を入れ替えるなどをすれば,notがそもそも必要なくなる場合も多く,この4つの論理演算だけで計算が閉じるようにコードを最適化することも重要です.

なお,AVX512からvpternlogd命令で任意の論理演算が可能です.

_mm256_and|or|xor|andnot_ps|pd (AVX/AVX2)

__m256i _mm256_and_ps (__m256 a, __m256 b)
asm: vandps ymm, ymm, ymm //and
__m256i _mm256_and_pd (__m256d a, __m256d b)
asm: vandpd ymm, ymm, ymm //and

__m256 _mm256_or_ps (__m256 a, __m256 b)
asm: vorps ymm, ymm, ymm //or
__m256 _mm256_or_pd (__m256d a, __m256d b)
asm: vorpd ymm, ymm, ymm //or

__m256 _mm256_xor_ps (__m256 a, __m256 b)
asm: vxorps ymm, ymm, ymm //xor
__m256 _mm256_xor_pd (__m256d a, __m256d b)
asm: vxorpd ymm, ymm, ymm //xor

__m256i _mm256_andnot_ps (__m256 a, __m256 b)
asm: vandnps ymm, ymm, ymm //andnot
__m256i _mm256_andnot_pd (__m256d a, __m256d b)
asm: vandnpd ymm, ymm, ymm //andnot

動作

作成中

CPI, Uops

Architecture Latency Throughput Uops
Alderlake 1 0.33 -
Icelake 1 0.33 1
Skylake 1 0.33 1
Broadwell 1 1 1
Haswell 1 1 1
Ivy Bridge 1 1 1
Sandy Bridge 1 1 1
Zen3 1 0.25 1
Zen2 1 0.25 1
Zen 1 0.5 2

説明

浮動小数点に対する256ビット演算を行います.

_mm256_and|or|xor|andnot_si256 (AVX2)

__m256i _mm256_and_si256 (__m256i a, __m256i b)
asm: vpand ymm, ymm, ymm //and

__m256i _mm256_or_si256 (__m256i a, __m256i b)
asm: vpor ymm, ymm, ymm //or

__m256i _mm256_xor_si256 (__m256i a, __m256i b)
asm: vpxor ymm, ymm, ymm //xor

__m256i _mm256_andnot_si256 (__m256i a, __m256i b)
asm: vpandn ymm, ymm, ymm //andnot

動作

作成中

CPI, Uops

Architecture Latency Throughput Uops
Alderlake 1 0.33 -
Icelake 1 0.33 1
Skylake 1 0.33 1
Broadwell 1 0.33 1
Haswell 1 0.33 1
Zen3 1 0.25 1
Zen2 1 0.25 1
Zen 1 0.5 2
  • Haswell, Broadwellは浮動小数点のビット演算よりもスループットが高いです.

説明

整数に対するビット演算を行います.
どのサイズに対する命令であっても1ビット単位の処理であるため型によらず共通です.

2
2
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
2
2