2 ポイント 投稿者 GN⁺ 2024-10-07 | 1件のコメント | WhatsAppで共有

対象読者

  • 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件のコメント

 
GN⁺ 2024-10-07
Hacker Newsのコメント
  • 特定の式を計算する簡単な方法がある。たとえば (NOT A) OR ((NOT B) XOR (C AND A)) を計算したいなら、_MM_TERNLOG_A_MM_TERNLOG_B_MM_TERNLOG_C 定数を使って式を書けばよい

    • GCC と Clang では、intrinsic ヘッダーで定義された定数を使って即座に計算できる
    • MSVC では、定数を自分で定義する必要がある
  • タイトルを見て命令が正しく動作しないという話かと思ったが、実際には動作方式を説明しているものだった

  • ハードウェアマニュアルを理解しようとして失敗した経験がある。その後、大学で計算論理の授業で A+ を取った

  • 「三項論理」は通常、3つの真理値を持つ論理を意味するが、この記事は3入力を持つあらゆる二値論理ゲートを扱うコンパイラ命令について述べている

  • 文書中の例の関数「E2」は、3入力を持つ最も基本的なブール関数で、A が B のときに C を選ぶ MUX と呼ばれる。汎用的である

  • FPGA が任意の論理関数を実装する方法と同様に、ルックアップテーブル(LUT)を使っている

  • 学部時代、離散数学の授業にかなり集中していた気がする

  • sandpile.org で VPTERNLOG を調べると、バイトおよびワードマスキング(AVX512BITALG2)に関する Intel の過去の計画を見ることができる

  • Nvidia SASS にも似た命令(LOP3.LUT)がある

  • ビット演算を整数にパックする別の例として、win32 の GDI ROP コードがある