01独立並列・行列演算から協調計算へ
このシリーズでは、計算の「質」を変えながらWebGPUの実力を測ってきた。#1(モンテカルロ)では独立並列——各スレッドが完全に独立した計算——を扱い、「小規模ではGPUが最速とは限らない」と分かった。#2(行列積)では行列演算——出力が多数の入力に依存する計算——を扱い、タイル化とメモリ階層が性能を決めることを見た。
今回は第3の質、協調計算(cooperative computation)だ。これまでと決定的に違うのは、スレッド同士が影響し合い、各ステップで結果を共有しながら進む点である。
協調計算:全スレッドの結果を集約 → 共有 → 次のステップへ
題材として、多数の投資家エージェントが売買して価格が決まる「エージェントベース市場」を選んだ。これは協調計算の典型であり、しかも「なぜ市場でバブルや暴落が起きるのか」を見せてくれる、面白い題材でもある。
02何を計算するのか — エージェント市場の創発
普通のシミュレーションでは、価格は数式(幾何ブラウン運動など)で与える。だがこのモデルでは違う。価格は誰も決めない。多数のエージェントの売買の結果として、自然に決まる(創発する)。価格は入力ではなく出力だ。
市場参加者を、行動原理の異なる3タイプに分けた。
各ステップで、全エージェントが「買いたい量・売りたい量」を表明する。その合計(超過需要)に応じて価格が動く。買いが多ければ上昇、売りが多ければ下落。価格が動けば、それを見てエージェントがまた判断を変える——このフィードバックループが回り、価格の軌跡が生まれる。
03創発の観察 — バブルはなぜ起きるか
タイプの比率を変えて市場を走らせると、市場の性格ががらりと変わった。適正価格100から始めた500ステップの価格推移がこれだ。
縦軸は対数。トレンド優位(橙)は10〜1000を周期的に振動し、バブルと暴落を繰り返す。ファンダ優位(緑)は適正値100でほぼ水平。
トレンドフォロワーが多いと、上昇が買いを呼び、その買いがさらに上昇を呼ぶ。正のフィードバックで価格は適正値から大きく乖離する(バブル)。やがてファンダの売り圧が勝って急落(暴落)、また反転——という振動が、誰も指示していないのに自律的に生まれる。比率を変えてスキャンすると、トレンド比率が約50%を超えた瞬間に、安定から不安定へ相転移することも分かった。
04協調計算をGPUでどう実装したか
GPU実装の核心は超過需要の集計にある。これまで(#1#2)は「各スレッドが独立に結果を書くだけ」だったが、協調計算では全スレッドの注文を1つの数に集めて、それを全員に配り直す必要がある。
→ ③ 価格更新 → 次ステップへ(新価格を全員が参照)
集計にはアトミック加算を使った。WGSLのアトミック操作は整数のみなので、各エージェントの注文(小数)を大きな整数にスケールしてから加算する(#1で得たアトミックの知見の応用)。そして、この①②③を500ステップ分くり返す。つまりGPUへのディスパッチを反復し、ステップごとに同期する——この反復構造が、#1#2の「一発で計算」と根本的に違う点だ。実装の詳細は別途「実装編」で扱う。
正しさは、CPU版と同じ挙動になるかで確認した。協調計算は乱数や並列順序で数値が分岐しやすいが、両デバイスとも「トレンド優位でバブル・ファンダ優位で安定」という挙動が一致し、アトミック集計が正しく機能していることを確かめた。
05ベンチマーク — 協調計算でGPUは効くか
エージェント数を1000〜10万まで変え、500ステップの実行時間を測った。まず iPad mini A17 Pro の結果から。
さらにもう一つ、iPad の結果には妙な特徴があった。GPUの時間が、エージェント数を100倍にしてもほぼ変わらない(48ms→28ms)。CPUがエージェント数に比例して重くなる(7ms→229ms)のと対照的だ。協調計算の律速が「エージェント数」ではなく「ステップ数×同期コスト」だからである。並列度に余裕があり、エージェントが増えても1ステップの計算時間に吸収される。
06デバイス依存という発見
ところが、同じコードを Google Pixel 10 Pro で走らせると、まったく違う結果になった。
Pixel では、GPUは10万体でようやくCPUに並ぶ程度(1.2×)。しかも iPad のように一定ではなく、エージェント数とともにGPU時間が増えている(144→258ms)。創発する価格推移は両デバイスでそっくりだったのに、速度特性は別物だ。2デバイスを並べると違いが際立つ。
07結論 — 協調計算で見えたこと
協調計算をWebGPUで実装し、2機種で測って分かったことは3つ。
第一に、創発はデバイスを問わず再現した。バブルと暴落は、個々の単純なルールから自律的に立ち上がる。これは計算の正しさの証でもあり、行動ファイナンスの現象がGPU上で再現できることを示す。
第二に、協調計算の律速は並列度ではなく同期回数だ。独立並列(試行数が律速)、行列演算(行列サイズが律速)と違い、協調計算は「何ステップ同期するか」で時間が決まる。エージェントを増やしてもGPU時間が一定だった iPad の結果が、それを端的に示す。
第三に、そして最も重要なのは、協調計算がGPUアーキテクチャに強く依存することだ。同じコードが iPad で 8.2×、Pixel で 1.2×。行列演算の最適化が移植可能だったのとは対照的に、協調計算では「どのGPUか」が結果を左右する。CPU-GPU間の同期コストという、計算の中身とは別の要因が支配的になるからだ。
「GPUは万能ではなく、計算の規模と質で優位が決まる」——シリーズを貫くこの主題に、協調計算は新たな次元を加えた。規模・質に加えて「同期の頻度」と「実行するGPU」までもが、優位を左右する。並列化すれば速い、という素朴な期待から最も遠いのが、この協調計算だった。