対象読者
- SIMD CPUプログラミングに関心のある人
- Amigaプログラマーとして「minterm」blitter値の計算方法を知りたい人
AVX-512ビット論理三項演算命令
- AVX-512 ISA設計に関するTom Forsythの発表から着想を得たもの
- vpternlogd 命令は、3つの入力ソースを使ってビット論理演算を行う命令
- 512ビットレジスタを入力として使い、複雑な論理演算を単一命令で実行可能
- 8ビット即値を使って具体的なビット論理演算を定義する
Amigaブリッターカスタムチップ
- 1980年代のコンピューターは、グラフィックス処理のためのカスタムチップを備えていた
- Commodore Amiga 500のブリッターチップは、ビットマップグラフィックスを移動し、論理演算を実行した
- 8ビット値の「minterm」を設定して論理の組み合わせを制御する
- 多くのAmigaプログラマーは、minterm値の計算方法を知らなかった
minterm値を簡単に計算する方法
- 8ビット値を論理演算子の集合として理解する必要はない
- 単なるルックアップテーブルとして理解できる
- 例えば、3つの入力ビットのうちちょうど2つが1のときに結果が1になるよう設定する
- 8ビット値を下から上に読んで 0x68 を得る
面白い偶然
- Amigaでよく使われるminterm値 0xE2 は、マスク付き2Dスプライトレンダリングに使われる
- Intelのドキュメントで #imm8 値の例として 0xE2 が選ばれているのは、偶然の一致かもしれない
結論
- Intelのドキュメント例チームにAmigaファンがいるのかもしれない
- 少しのレトロな影響は悪くない
GN⁺の要約
- AVX-512の vpternlogd 命令は、複雑なビット論理演算を単一命令で実行できる強力なツールである
- Amigaのブリッターチップとの類似性は、歴史的観点から興味深い
- この記事は、現代のプログラミングとレトロ技術のつながりを示し、プログラマーに有用な洞察を提供する
- 類似機能を持つプロジェクトとしては、IntelのAVX-512とAMDのZenアーキテクチャがある
1件のコメント
Hacker Newsのコメント
特定の式を計算する簡単な方法がある。たとえば
(NOT A) OR ((NOT B) XOR (C AND A))を計算したいなら、_MM_TERNLOG_A、_MM_TERNLOG_B、_MM_TERNLOG_C定数を使って式を書けばよいタイトルを見て命令が正しく動作しないという話かと思ったが、実際には動作方式を説明しているものだった
ハードウェアマニュアルを理解しようとして失敗した経験がある。その後、大学で計算論理の授業で A+ を取った
「三項論理」は通常、3つの真理値を持つ論理を意味するが、この記事は3入力を持つあらゆる二値論理ゲートを扱うコンパイラ命令について述べている
文書中の例の関数「E2」は、3入力を持つ最も基本的なブール関数で、A が B のときに C を選ぶ MUX と呼ばれる。汎用的である
FPGA が任意の論理関数を実装する方法と同様に、ルックアップテーブル(LUT)を使っている
学部時代、離散数学の授業にかなり集中していた気がする
sandpile.org で VPTERNLOG を調べると、バイトおよびワードマスキング(AVX512BITALG2)に関する Intel の過去の計画を見ることができる
Nvidia SASS にも似た命令(LOP3.LUT)がある
ビット演算を整数にパックする別の例として、win32 の GDI ROP コードがある