01計算の、その先へ — compute だけでなく render
これまでの実験ノートは、一貫して「計算」の話だった。モンテカルロ、行列積、エージェント市場——WGSLのコンピュートシェーダーでGPUに計算させ、その結果をCPUに読み戻して、Chart.jsでグラフにしていた。GPUは強力な「計算機」として使い、絵を描くのはCPU側のライブラリの仕事だった。
だがWebGPUには、もう半分の顔がある。render(描画)だ。GPUは計算だけでなく、グラフィックスを描くための装置でもある。そして両者は同じデバイス上にあるから、計算した結果をCPUに戻すことなく、そのまま描画に渡せる。これがGPUグラフィックスの王道であり、本稿で踏み込む新しい領域だ。
読み戻しが無いことの意味は大きい。数十万の点を毎フレームCPUに転送していては、リアルタイムなアニメーションは難しい。計算結果がGPUに留まったまま描画されるからこそ、数千本の経路が滑らかに動く絵が成立する。
02何を描くのか — モンテカルロ経路とオプション価格
題材は、これまで計算してきたモンテカルロを「見せる」ことだ。株価の将来は無数に枝分かれする。その数千本のシナリオ(幾何ブラウン運動の経路)を、1本ずつ線として描く。時間とともに経路は扇状に広がり、不確実性の拡散が目に見える。
さらにオプション価格を重ねる。行使価格のラインを引き、満期にそれを超えた経路(価値を持つ=イン)を緑に、超えない経路(アウト)を暗く色分けする。無数の経路のうち、価値が出るものの集積が、オプション価格になる——金融工学の本質を、計算結果そのものの絵として示す。計算と可視化が、ひとつのGPUパイプラインの中で融合する。
03直結の核心 — 計算したバッファを、描画がそのまま読む
最大のポイントがこれだ。経路の価格を格納するストレージバッファを、1つだけ用意する。コンピュートシェーダーがそこに価格を書き込み、レンダーシェーダーが同じバッファを読んで描画する。CPUへのコピーは無い。
鍵はバッファのusage指定だ。計算で書き込むためのSTORAGEと、描画で読むためのVERTEXを、同じバッファに与える。
コンピュート側は、各スレッドが1経路を担当し、前ステップの価格から1ステップ進めてTRAJに書く(幾何ブラウン運動)。
レンダー側は、そのTRAJをそのまま読む。頂点シェーダーで頂点インデックスから(経路, ステップ)を復元し、価格を画面座標に変換する。computeが書いた値が、CPUを経由せず描画に流れ込む。
mapAsync でGPU→CPU転送し、JS配列を作り、Chart.jsに渡す——という重い往復が要る。直結ではこれがすべて無くなる。バッファはGPUメモリに留まったまま、computeパスとrenderパスを連続して流すだけ。数千本×数百ステップの点を、毎フレーム描き直せる。
04軌跡をどう描くか — line-strip と primitive restart
各経路は、ステップを結んだ折れ線として描く。トポロジはline-strip(連続した点を線で繋ぐ)。だが素朴にやると問題が起きる。全頂点を1本のline-stripで繋ぐと、経路の終わりと次の経路の始まりまで線で繋がってしまう。
かといって経路ごとにdraw()を呼ぶと、経路数ぶんのドローコールが要る。数千〜数万本では、このドローコール過多が描画のボトルネックになる。
解決策がprimitive restartだ。インデックスバッファに「ここで線を切れ」という特別な値(0xFFFFFFFF)を挟むと、GPUがそこでline-stripを区切る。経路の区切りごとにこの値を入れれば、1回のドローコールで、繋がらない数千本の線を描ける。
05計算を色にする — 満期判定とブレンド
オプションのイン/アウトは、レンダーシェーダーの中で判定する。各経路の満期価格(最終ステップの値)を読み、行使価格と比較して色を決める。計算結果が、そのまま色になる。
色は加算ブレンドで重ねる。経路が密集する価格帯ほど色が積み重なって明るくなり、光の濃淡が確率密度を表す。中央が白く輝くのは、そこが最も経路の通る=起こりやすい価格帯だからだ。静的なヒストグラムが示す確率分布が、無数の経路の重なりとして生きた光になる。
最後に、オプション価格の集計だけはCPUを使う。満期列の価格を一度読み戻し、ペイオフの平均を割り引く。これは1回きりの集計なので、毎フレームの描画とは切り離せる。描画は毎フレームGPU直結で高速に、価格集計は満期到達時に1回だけCPUで——役割分担だ。
06試してみる
下のデモは、ここまで解説したパイプラインがそのまま動いている。再生すると、computeが経路を生成し、renderが直結で描画する。数千本の経路が扇状に広がり、行使価格を境に色が分かれる様子を見てほしい。経路数を変えても、primitive restart のおかげでドローコールは常に1回だ。
07結論 — 計算と描画が融合するとき
これまでの実験ノートは「計算」だけを見てきた。GPUは速い計算機で、絵を描くのはCPUの仕事——そう切り分けていた。だがWebGPUの本質は、計算と描画が同じ装置の上で地続きであることだ。計算結果をCPUに戻さず、そのまま頂点として描く。それだけで、数千本の経路がリアルタイムに動く絵が生まれる。
そして、その絵はただ美しいだけではない。モンテカルロの確率分布が光の濃淡として、オプション価格が緑の経路の集積として、計算の意味そのものを語っている。「計算が見える」とは、数字が絵になることではなく、計算の構造が視覚の構造と一致することだ。
compute だけを追ってきたシリーズに、render が加わった。計算の速さを測る旅から、計算を見せる旅へ。WebGPUの両輪が揃ったとき、ブラウザは「その場で計算し、その場で描く」場所になる。手のひらの中で、無数の未来が光になる——それがこの技術の到達点だ。