プログラミング
Video2NAND – ビデオコーデックを悪用して計算能力を引き出す
Video2NAND – Abusing video codecs for great computational power (sharedobject.blog)
要約
この記事では、ビデオコーデック、特にVP8の予測メカニズムを悪用して、組み合わせ論理回路をシミュレートする方法を探求しています。これにより、トランジスタではなく、ビデオコーデックという異質な基盤上でNANDゲートを構築し、任意の論理回路を組み立てるための「ガジェット」のセットを構築することが目標です。
全文翻訳
Video2NAND 2026年7月11日
NANDゲートをコンピュータに変換することについては多くのことが書かれていますが、これらのNANDゲートの構築方法についての知識はそれほど一般的ではありません。これはトランジスタや電気工学の領域にあると思われるかもしれませんが、私たちはより異質な基盤、すなわちビデオコーデックを探求します。具体的には、VP8ビデオコーデックと、その予測メカニズムを悪用して組み合わせ論理をシミュレートする方法について説明します。私たちの目標は、任意の論理回路を構築できる「ガジェット」のセットを構築することです。
ビデオコーデックについて少し
ビデオコーデックは、ビデオ(一連の画像)をあるビットストリームにエンコードする方法と、そのビットストリームを元のビデオにデコードする方法を記述する標準です。ビデオのエンコード方法を正確に規定するのではなく、通常は一般的な構造と、ビデオのエンコードに使用できる一連のプリミティブを定義します。そのため、異なるビデオエンコーダーの実装(あるいは同じエンコーダーでも設定が異なれば)は同じビデオを異なる方法でエンコードする可能性がありますが、すべてのデコーダーは、いずれにしてもビデオを再構築できることが期待されます。VP8、私たちが選択したビデオコーデックの内部構造全体を説明するのではなく、私たちの目的に関連するサブセットに焦点を当てます。さらに、以下の説明は、前提知識を本質にまで簡略化するための試みであり、完全に正確ではありません。ビデオコーデックについてさらに学びたい場合は、驚くほど読みやすいTheora仕様を読むことをお勧めします。また、省略された詳細を説明するこのフォローアップ投稿を読むこともできます。
ある意味で、ビデオは単なる画像の連続です。ビデオコーデックの専門用語では、これらの画像は「フレーム」と呼ばれ、各フレームはピクセルのグリッドです。フレームは一般的に2種類に分けられます:キーフレームとインターフレーム。8x8ピクセルブロックに分割されたフレーム
キーフレームは、他のフレームとは独立してエンコードされるフレームです。画像を再構築するために必要なすべてのデータは、それを表すフレーム内に含まれています。ピクセルデータはフレームに直接エンコードされるか、イントラフレーム予測を使用して予測される場合があります。イントラフレーム予測により、エンコーダーは、画像の特定のブロックが近くの別のブロックから予測できると述べることができます。VP8はこれらのブロックを左上から右下に向かって行ごとにデコードするため、提供されるイントラフレーム予測プリミティブは、上の行、左の列、およびそれらの間の左上のピクセルを使用してブロックを予測することを可能にします。
top
top[0] top[1] top[2] top[3]
left[0]
left[1]
left[2]
left[3]
ブロックと予測に使用されるピクセル
インターフレームは、後続のフレームがあまり変化しないという事実を利用し、以前にデコードされたフレームに基づいてピクセルブロックを予測することを可能にします。これらはキーフレームと同じエンコーディングプリミティブを提供するだけでなく、インターフレーム予測も可能にします。これは、前のフレームのブロックを参照することによってブロックを記述することです。キーフレームのみを使用して組み合わせ回路を構築します。これは、組み合わせ論理とシーケンシャル論理の意味論がキーフレームとインターフレームによくマッピングされること、そして限定されたツールキットの追加の課題がより興味深いことによる部分があります。
ワイヤーとゲート
組み合わせ回路は、入力、出力、ワイヤー、ゲートから構築されます。私たちのケースでは、電気的電流が真と偽を表す代わりに、フレーム内の各ブロックは完全に白い(すべてのピクセル値が255に設定されている)か完全に黒い(すべてのピクセル値が0に設定されている)のいずれかになります。そして、H_PREDとV_PRED予測モードを使用して、右または下に向かうワイヤーをモデル化します。H_PREDは「水平予測」を表し、ブロック内のすべてのピクセル値が左のピクセルの値をコピーすることによって予測されることを意味します。同様に、V_PREDは「垂直予測」を表し、代わりに上の値からコピーします。
H_PRED V_PRED
フレームをブロックのグリッドとして描画:配線例
入力は、定数値(完全に白いか完全に黒い)に設定された非予測ブロックとして表されます。出力は単純にラベル付けされたワイヤーブロックです:
A ? OUT B
入力と出力
この時点で、論理ゲートのみが残ります。私たちのシステムが機能的に完全であるためには、つまり任意の真理値表を記述できるためには、2つのゲート:NOTとANDを構築するだけで十分です。NANDのみのような別の機能的に完全なゲートセットを選択することもできましたが、これらのゲートが構築するのは簡単であることがわかります。どちらのゲートも、TM_PRED予測モードを使用します。これは「True Motion予測」を表し、これまで見てきた予測モードよりもわずかに複雑です。TM_PREDブロックでは、各ピクセルの値は、上の行の対応するピクセルと左の列の対応するピクセルの合計から、左上のピクセルの値を引いたものとして計算されます。したがって、行iと列jのピクセルについては、値はleft[i] + top[j] - top_leftになります。
top left
top[0] top[1] top[2] top[3]
left[0]
left[1]
left[1] + top[2] - top_left
left[2]
left[3]
TM予測計算(ブロックセル(2,1))
私たちのブロックはすべて均質です。つまり、完全に黒か白です。これは、top[0] = top[1] = top[2] = ...であり、同様にleft[0] = left[1] = left[2] = ....となることを意味します。これにより、TM_PREDブロックの計算が簡略化されます:left + top - top_left:
top left
top left
left + top - top_left
簡略化されたTM予測
ピクセル値は0から255の間にクランプされるため、NOTゲートは255 - INPUTの式に相当します(INPUTを0または255のいずれかに代入して自分で確認してください)。この式をTM_PREDブロックを使用して表すことができます。入力が左上のピクセルであると仮定し、上の行をすべて255に、左の列をすべて0に設定します(またはその逆)。ゲートの出力は、TM_PREDブロックの右側と下側であり、上記で説明したワイヤーブロックを使用してさらに伝播できます。
INPUT 255 0
TM OUT
NOTゲート
同様に、左上を255に、最初の入力を上の行に、2番目の入力を左の列に設定することにより、ANDゲートを構築できます。このようなセットアップのTM_PREDブロックは、A + B - 255という式を表します。AとBのすべての可能な入力値を代入すると、出力が正確にANDゲートであることがわかります:
A 255 B
TM OUT
ANDゲート
これで基本的なガジェットをすべて構築したので、それらを組み合わせて、有名なNANDを含むさまざまな他のゲートや回路を作成できます:
A 255 B
TM 255 0
TM OUT
NANDゲート
まとめ
この分野を横断する旅を楽しんでいただき、ビデオコーデック、組み合わせ論理、または奇妙なマシンについて何か学んでいただけたことを願っています。私たちは表面をかすめたにすぎません。未解決の質問や方向性はまだたくさんあります。ガジェットをより小さく最適化できるでしょうか?これらのアイデアを合成ツールに統合し、VerilogをVP8フレームに合成できるようにする可能性はどうでしょうか?あるいは、シーケンシャル論理を探求し、インターフレームを使用してそれを実装する方法はどうでしょうか?