2026年6月22日月曜日

ループの形が落ち着いてきたのでここらへんで…

何度も書き直しつつ、再びcpy.cppに展開していたのですが、同じコードをコピペして、必要な修正を少しして、動きを見て…と繰り返すのも飽きてきたので何とかできないかと模索していました。

正直cppは今までの経験上、何とか追えるレベルなのでどうやったらいいのかさっぱりわかりません。

最初のきっかけは何だったか忘れましたが、最終的にgeminiからヒントを得て、今回も2、3回質問を投げてそこから実装が固まりました。

最初はstd::functionを使う事で、引数に処理を入れ込むことができるというところからスタートしたわけですが…書き方を知るために検索して調べるごとに「std::functionは廃止すべき!」とまで書かれている始末…一部stdに追加された直後は超絶に絶賛されていたようですが、結局のところ、実装が重すぎてcppには向かないという結論らしいです。

ラムダ式とか良く分かってない人間なので、世界観が良く分かりませんが、とりあえずstd::functionで受けてそれを実行する形で実装してみたところ…QwenImageの1step実行で今まで早くなった分を取り戻すかの如く遅くなりました…予想以上にオーバーヘッドがでかいようです。GPUにsubmitしている回数は多いのですけど、実際のボトルネックはGPU内の処理のはずなので、そこまで遅くなるとは考えていなかったのですが。意外なことにもう少し処理単位を大きくしてもGPUは余裕なのかもしれない…使用率は99.0%以上になってるんですけどね…

ちなみにgeminiさん曰く、「std::function」の実装はパフォーマンスが落ちるので、templateの実装を進められました。ただ、ここまでの会話の中で、どうもgeminiさんはstd::functionをGPUカーネル内に含ませるような感じで表現し始めてしまったので、そこまで遅くならないだろうと思っていましたが、そうでなくてもGPUへ発行する部分でもパフォーマンス低下が表面化してしまったようです。

で、実際にテンプレートを使って書き換えてみましたが…ほぼ変更することなくそのままコピペだけで対応できました。.cppに記述していた部分を.hppへ移動して少し書き換える程度…。拍子抜けです(笑)ちょっとmakeで上手くいっていないかと思ってcleanして何度かmakeしなおしたので無駄な手間をかけてしまいましたが、そんな必要もなかったようです。

実際に動かしてみると…悪くない感じです。

この形式ならソースの展開を行ってもそんなにきつくないかな?と言う感じですが、問題は…下手に手を入れるとデバッグが非常に困難になりそうなので一旦この作業は止めて他の作業に移ろうと思います。まぁこのテンプレート実装を今まで触ったソースにも波及させたいのですが…それ以前に、、、手持ちのgit内に最新の状態を最新化してllamaとかも最新化したいですかねw

最近は、localAIのチェックはおざなりだったりしますが、ggmlやllama.cppのチェックだけはしています。早くメモリー関連が収束してくれないかなと期待しているのですが…levelzeroの対応が行われているので、そちらも気になっています。

幸い、今触っている部分ではほとんど手が加えられていない状態のようなのですが…まぁだれもsyclなんて使ってなさそうな雰囲気なのが残念ですw 

0 件のコメント:

コメントを投稿