モバイル&ワイヤレスブロードバンドでインターネットへ

gwaw.jp
 
GPU COMPUTE BENCHMARK #3

WebGPUで協調計算は速くなるか
— エージェント市場のバブルと、GPUの同期コスト

スレッドが互いに影響し合う「協調計算」。多数の投資家エージェントが売買し、価格が創発する市場をWebGPUで実装した。バブルは見事に創発したが、ベンチマークは独立並列・行列演算とは様相が違った。そして同じコードが、Pixel と iPad で全く異なる速度を示した。

WebGPU協調計算エージェントベース アトミック集計創発同期コスト

01独立並列・行列演算から協調計算へ

このシリーズでは、計算の「質」を変えながらWebGPUの実力を測ってきた。#1(モンテカルロ)では独立並列——各スレッドが完全に独立した計算——を扱い、「小規模ではGPUが最速とは限らない」と分かった。#2(行列積)では行列演算——出力が多数の入力に依存する計算——を扱い、タイル化とメモリ階層が性能を決めることを見た。

今回は第3の質、協調計算(cooperative computation)だ。これまでと決定的に違うのは、スレッド同士が影響し合い、各ステップで結果を共有しながら進む点である。

独立並列:スレッドAの計算にスレッドBは不要
協調計算:全スレッドの結果を集約 → 共有 → 次のステップへ

題材として、多数の投資家エージェントが売買して価格が決まる「エージェントベース市場」を選んだ。これは協調計算の典型であり、しかも「なぜ市場でバブルや暴落が起きるのか」を見せてくれる、面白い題材でもある。

02何を計算するのか — エージェント市場の創発

普通のシミュレーションでは、価格は数式(幾何ブラウン運動など)で与える。だがこのモデルでは違う。価格は誰も決めない。多数のエージェントの売買の結果として、自然に決まる(創発する)。価格は入力ではなく出力だ。

市場参加者を、行動原理の異なる3タイプに分けた。

① ファンダ(逆張り)
適正価格を信じる。高ければ売り、安ければ買い。価格を引き戻す安定化の力。
② トレンド(順張り)
流れに乗る。上がれば買い、下がれば売り。動きを増幅する力。
③ ノイズ(ランダム)
気まぐれに売買。市場に揺らぎを与える。

各ステップで、全エージェントが「買いたい量・売りたい量」を表明する。その合計(超過需要)に応じて価格が動く。買いが多ければ上昇、売りが多ければ下落。価格が動けば、それを見てエージェントがまた判断を変える——このフィードバックループが回り、価格の軌跡が生まれる。

03創発の観察 — バブルはなぜ起きるか

タイプの比率を変えて市場を走らせると、市場の性格ががらりと変わった。適正価格100から始めた500ステップの価格推移がこれだ。

縦軸は対数。トレンド優位(橙)は10〜1000を周期的に振動し、バブルと暴落を繰り返す。ファンダ優位(緑)は適正値100でほぼ水平。

トレンドフォロワーが多いと、上昇が買いを呼び、その買いがさらに上昇を呼ぶ。正のフィードバックで価格は適正値から大きく乖離する(バブル)。やがてファンダの売り圧が勝って急落(暴落)、また反転——という振動が、誰も指示していないのに自律的に生まれる。比率を変えてスキャンすると、トレンド比率が約50%を超えた瞬間に、安定から不安定へ相転移することも分かった。

KEY FINDING 01 誰も暴落させていないのに、暴落が創発する。 個々のエージェントは単純なルールで動くだけ。だが多数が相互作用すると、バブルと暴落という市場全体の現象が、上から与えられることなく下から立ち上がる。トレンド追随者が一定割合(約50%)を超えると市場が不安定化する——複雑系の相転移が、シンプルなモデルから現れた。これが「協調計算」が生む創発の面白さだ。

04協調計算をGPUでどう実装したか

GPU実装の核心は超過需要の集計にある。これまで(#1#2)は「各スレッドが独立に結果を書くだけ」だったが、協調計算では全スレッドの注文を1つの数に集めて、それを全員に配り直す必要がある。

各ステップ:① 需要計算(全スレッド) → ② 集計(1つに集約)
→ ③ 価格更新 → 次ステップへ(新価格を全員が参照)

集計にはアトミック加算を使った。WGSLのアトミック操作は整数のみなので、各エージェントの注文(小数)を大きな整数にスケールしてから加算する(#1で得たアトミックの知見の応用)。そして、この①②③を500ステップ分くり返す。つまりGPUへのディスパッチを反復し、ステップごとに同期する——この反復構造が、#1#2の「一発で計算」と根本的に違う点だ。実装の詳細は別途「実装編」で扱う。

正しさは、CPU版と同じ挙動になるかで確認した。協調計算は乱数や並列順序で数値が分岐しやすいが、両デバイスとも「トレンド優位でバブル・ファンダ優位で安定」という挙動が一致し、アトミック集計が正しく機能していることを確かめた。

05ベンチマーク — 協調計算でGPUは効くか

エージェント数を1000〜10万まで変え、500ステップの実行時間を測った。まず iPad mini A17 Pro の結果から。

▍ iPad mini (A17 Pro)
KEY FINDING 02 小規模ではCPUが圧勝。協調のオーバーヘッドが効く。 1000エージェントでは GPU 48ms に対し CPU 7ms(0.1×)。協調計算は各ステップでGPUと同期(500回のディスパッチと集計クリア)が必要で、この固定コストが小規模では支配的になる。独立並列(#1)よりもGPUが不利になりやすい構造だ。iPadでは2万体あたりで逆転し、10万体で 8.2× に達した。

さらにもう一つ、iPad の結果には妙な特徴があった。GPUの時間が、エージェント数を100倍にしてもほぼ変わらない(48ms→28ms)。CPUがエージェント数に比例して重くなる(7ms→229ms)のと対照的だ。協調計算の律速が「エージェント数」ではなく「ステップ数×同期コスト」だからである。並列度に余裕があり、エージェントが増えても1ステップの計算時間に吸収される。

06デバイス依存という発見

ところが、同じコードを Google Pixel 10 Pro で走らせると、まったく違う結果になった。

▍ Google Pixel 10 Pro

Pixel では、GPUは10万体でようやくCPUに並ぶ程度(1.2×)。しかも iPad のように一定ではなく、エージェント数とともにGPU時間が増えている(144→258ms)。創発する価格推移は両デバイスでそっくりだったのに、速度特性は別物だ。2デバイスを並べると違いが際立つ。

▍ 高速化倍率の比較(CPU比、高いほどGPU有利)
KEY FINDING 03 協調計算は、GPUアーキテクチャへの依存が極端に強い。 同じコードで iPad は 8.2×、Pixel は 1.2×。#2(行列演算)では最適タイルサイズが両デバイス共通(32)で、最適化に移植性があった。だが協調計算では、GPU優位そのものがデバイスで大きく違う。鍵はCPU-GPU間の同期コストだ。協調計算は500回の同期を伴うため、Apple GPU(ユニファイドメモリで同期が軽い)が圧倒的に有利で、Pixel(Adreno) では同期のたびのコストが積み上がる。計算そのものより、反復同期のオーバーヘッドがデバイス間の差を生む

07結論 — 協調計算で見えたこと

協調計算をWebGPUで実装し、2機種で測って分かったことは3つ。

第一に、創発はデバイスを問わず再現した。バブルと暴落は、個々の単純なルールから自律的に立ち上がる。これは計算の正しさの証でもあり、行動ファイナンスの現象がGPU上で再現できることを示す。

第二に、協調計算の律速は並列度ではなく同期回数だ。独立並列(試行数が律速)、行列演算(行列サイズが律速)と違い、協調計算は「何ステップ同期するか」で時間が決まる。エージェントを増やしてもGPU時間が一定だった iPad の結果が、それを端的に示す。

第三に、そして最も重要なのは、協調計算がGPUアーキテクチャに強く依存することだ。同じコードが iPad で 8.2×、Pixel で 1.2×。行列演算の最適化が移植可能だったのとは対照的に、協調計算では「どのGPUか」が結果を左右する。CPU-GPU間の同期コストという、計算の中身とは別の要因が支配的になるからだ。

「GPUは万能ではなく、計算の規模と質で優位が決まる」——シリーズを貫くこの主題に、協調計算は新たな次元を加えた。規模・質に加えて「同期の頻度」と「実行するGPU」までもが、優位を左右する。並列化すれば速い、という素朴な期待から最も遠いのが、この協調計算だった。

『WebGPUで協調計算は速くなるか — エージェント市場のバブルとGPUの同期コスト』を公開しました。