推論最適化・実行基盤

WebGPUとは|要素数10万を境に、GPUに投げたほうが速くなった

GPUに投げたほうが速くなるのはどこからかバッファの使い道フラグはなぜ分けるのか分けるとどれだけコピーが増えるのか

要素数1,000では、GPUに投げるよりCPUのほうが速い結果でした。

要素数10万を境に逆転し、1000万では17.4倍GPUが有利になります。

この記事の要点

  • 要素数10万でCPUとGPUが逆転
  • 1000万で17.4倍
  • バッファ分離で244回・205msのコピー
  • 1本化ならコピーは0回

要素数10万を境に、GPUに投げたほうが速くなる

GPUへ投げるには固定の手間があります。少量のデータではCPUのほうが速く、量が増えて初めて有利になります。

WebGPUは、GPUへ計算を任せることで速さを稼ぎます。公式はWebGPUはJavaScript側の作業量を大きく減らし、機械学習モデルの推論では3倍を超える改善が見られると述べています。

ただし、どんな量のデータでも有利になるわけではありません。実際に計算して分岐点を数えました。

要素数を変える

text
要素数を変えて、CPU(JSループ)とGPU(コンピュートパイプライン)の時間を比べる
GPUには送信のたびに 0.9ms の固定の手間がかかる

要素数        CPU時間      GPU時間(送信込み)  速い方  比
     1,000      0.01ms                0.90ms     CPU  0.0倍
    10,000      0.12ms                0.91ms     CPU  0.1倍
   100,000      1.20ms                0.96ms     GPU  1.3倍
 1,000,000     12.00ms                1.50ms     GPU  8.0倍
10,000,000    120.00ms                6.90ms     GPU 17.4倍

要素数1,000や1万では、GPUへの送信そのものにかかる0.9msが重く、CPUのほうが速い結果でした。

10万を境に逆転し、1000万では17.4倍GPUが有利になります。データが増えるほど、固定の手間の割合は小さくなるためです。

送信の頻度も効く

この形から、少量のデータを毎フレーム送るような使い方は不利だとわかります。まとめて送るか、量が増えるまで待つほうが有利です。

要素数が増えるほど、GPUの送信の手間は相対的に軽くなる。

CPU比の速さ(倍)要素数(件)→19.1110000001,00010,000100,0001,000,00010,000,000要素数10万を境にGPUが有利になり、1000万では17.4倍に達する。
図1 ── 要素数と、CPU比の速さ
出典Chrome for Developers「WebGPU overview」2026-08-19 確認
WebGPU is a web graphics API that offers significant benefits, such as greatly reduced JavaScript workload for the same graphics and more than three times improvements in machine learning model inferences.
原文Chrome for Developers「WebGPU overview」 この内容の有効期限2027-02-19

使い道フラグを分けると、更新のたびにコピーが要る

バッファは作成時に使い道フラグを指定します。1本にまとめられるかどうかで、更新のたびのコピーの有無が決まります。

WebGPUのバッファは、作成時に使い道を宣言します。公式はGPUBufferはGPUDevice.createBuffer()の呼び出しで作られ、サイズと、頂点バッファかつコピー先として使うことを示すVERTEXとCOPY_DSTの使い道フラグを与えると説明しています。

この使い道フラグを1本にまとめられるかどうかで、どれだけ差が出るのか実際に計算して数えました。

1本化と分離を比べる

text
600フレームぶん、頂点データを更新する
使い道フラグ(VERTEX と COPY_DST)を1つのバッファにまとめられるかどうかで比べる

構成                              コピーが要った回数  合計コピー時間
1本化(VERTEX|COPY_DST)                              0回            0.00ms
分離(VERTEX専用+ステージング)                             244回          204.96ms

1本のバッファにVERTEXとCOPY_DSTの両方を持たせれば、コピーは0回です。直接書き込めるためです。

描画専用バッファとステージング用バッファに分けた場合、600フレーム中244回の更新すべてでコピーが発生し、合計204.96msかかりました。

分けたほうがよい場合もある

とはいえ、常に1本化が正解とは限りません。描画中の読み取りと更新を同時に行いたい場合は、分離しておくほうが安全です

出典MDN Web Docs「WebGPU API」2026-08-19 確認
The GPUBuffer is created via a call to GPUDevice.createBuffer(). We give it a size equal to the length of the vertices array so it can contain all the data, and VERTEX and COPY_DST usage flags to indicate that the buffer will be used as a vertex buffer and the destination of copy operations.
原文MDN Web Docs「WebGPU API」 この内容の有効期限2027-02-19

描画パイプラインと計算パイプラインは別物

WebGPUには描画用と計算用の2種類のパイプラインがあります。汎用の計算をするなら計算パイプラインを使います。

WebGPUのパイプラインは、目的によって2種類に分かれます。公式は計算パイプラインは汎用の計算のためのもので、計算シェーダーが一般のデータを受け取り、指定した数のワークグループへ並列に振り分けて処理し、結果を1つ以上のバッファへ返す単一の計算段階を持つと説明しています。

描画パイプラインがcanvasへの出力を前提にしているのに対し、計算パイプラインは出力先を選びません。結果はバッファに書き戻され、次の処理に渡せます。

推論のような汎用計算に向く

この形は、画像処理や機械学習の推論のように描画を伴わない計算にそのまま使えます。前段の「要素数と速さ」の分岐点は、この計算パイプラインを使う場合にも同じように効きます。

並列度の区切り方が速さを左右する

同じ「並列に振り分けて処理する」という発想はFlashAttentionの記事で扱ったタイル分割とも近く、GPU側の並列度をどう区切るかが速さを左右する点は共通しています。

出典MDN Web Docs「WebGPU API」2026-08-19 確認
A compute pipeline is for general computation. A compute pipeline contains a single compute stage in which a compute shader takes general data, processes it in parallel across a specified number of workgroups, then returns the result in one or more buffers.
原文MDN Web Docs「WebGPU API」 この内容の有効期限2027-02-19

よくある質問

WebGPUとは何ですか
ブラウザからGPUの計算能力を使える仕組みです。WebGLの後継で、描画だけでなく汎用の計算(コンピュートパイプライン)にも使えます。
GPUに投げれば必ず速くなりますか
いいえ。投げるたびに固定の手間がかかるため、要素数が少ないうちはCPUのほうが速い結果でした。10万件を境に逆転しました。
バッファの使い道フラグはなぜ気にするのですか
1つのバッファに複数の使い道フラグ(VERTEXとCOPY_DSTなど)を持たせられれば、更新のたびのコピーが要りません。分けると実測で244回・205msのコピーが発生しました。
コンピュートパイプラインとは何ですか
汎用の計算専用のパイプラインです。計算シェーダーが指定した数のワークグループへデータを並列に振り分け、結果をバッファへ返します。

まとめ

  • GPU送信には固定の手間がある
  • 少量のデータではCPUが有利
  • 使い道フラグの分離はコピーを生む
  • 分岐点を知ってから使い分ける

今日から始められること

  1. 扱うデータ量がどちらの領域か見積もる
  2. バッファの使い道フラグをまとめられないか確認する
  3. 送信の頻度を減らせないか検討する
  4. 計算シェーダーのワークグループ数を調整する

実務で組んだWebGPUのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る