WebGPU(WGSL?)で遺伝的プログラミングをするにあたっての制約
2023/7/11 13:30:00
- 一つのBufferが128MBまでしか作れない。
- Deviceの取得時にmaxBufferSizeとか設定すれば限定解除できそうな雰囲気があるが、やり方がわからない
- というかやってみたけど(RequiredLimitsを設定)Deviceが取得できなくなった
- Deviceの取得時にmaxBufferSizeとか設定すれば限定解除できそうな雰囲気があるが、やり方がわからない
- Shaderの中で宣言したarrayは添え字が定数でしか取得できない
for(var i=0u; i<10u; i++ ){let val = arr[i]}
みたいなことができない- 正気か?
- 関数の再帰呼び出しは不可
- 「SIMDやぞ」ということで、まあわからなくはない
- 「Stackを作って関数の再帰呼び出しをfor文で再現」と思うも、「Shaderの中で宣言したarrayは添え字が定数でしか取得できない」
- 関数型がなさそう
- 「配列に関数を入れて処理を出しわける」みたいなことができない
- 無理やりやるとif文のお化けになってしまう
- SIMDでif文めっちゃ使うのはなんかヤダ
然るに
- 遺伝的プログラミングで生成したProgramを構成するNode群を実行できない
- NodeからNodeを呼び出したい
- → 「関数の再帰呼び出しは不可」
- Node群を入力側から順次実行し、Nodeの出力値をNodesOutputみたいなarrayに格納
- → 「Shaderの中で宣言したarrayは添え字が定数でしか取得できない」
- StorageBufferは変数の添え字が使えるので、それでNodesOutputを作る
- → 「一つのBufferが128MBまでしか作れない」
- 並列処理の数だけNodesOutputが必要なので、1GBぐらいほしい
- 手元にある1070 TiはCUDA Coreが2432基あるので
- 並列処理の数だけNodesOutputが必要なので、1GBぐらいほしい
- → 「一つのBufferが128MBまでしか作れない」
- 並列処理したい数だけStorageBufferを作る(シェーダーを自動生成する)
- → 処理が複雑過ぎて3日もたてば何やってるかわからないコードになる
- NodeからNodeを呼び出したい
- どれか一つでも制約をなんとかできれば遺伝的プログラミングはできそう。
きえええええええええええええぇぇぇぇぇ
GPGPUあるあるの制約なのかもしれないが、世の機械学習ライブラリはこういう制約をどう御しているのか。
なぜこんな古生代みたいな制約があるのか。令和やぞ。
一部WGSLの制約かもしれない。