
2025.02.18
AIが「嘘のデータ」を返してしまう アルペンが生成AI導入で味わった失敗と、その教訓
リンクをコピー
記事をブックマーク
msyksphinz氏(以下、msyksphinz):ここからはいくつかQEMUの高速化テクニックを紹介していきます。最初がTCG Block Chainingです。QEMUは命令を変換するんですが、1命令ずつではなくて、ある程度のブロックでまとめて変換します。そのブロックがいわゆるコンパイラなどで出てくるベーシックブロックというもので、おしりが分岐になるまでが基本の変換ブロックです。
例えばRISC-VのBEQ、ブランチにぶつかって分岐に来たら1回実行を制御モードに戻して、分岐先をもう1回制御側で1回フェッチし直して、次の命令をデコードしてジャンプするということを行っています。
1回分岐にぶつかると、どうしても制御を戻さないといけなくなるのですが、だいたいこういう分岐命令の場合は、1回ジャンプ先が決まってしまうと、そのジャンプ先がstaticに決まってしまうので、一度目の実行で次のジャンプ先のブロックが判明すると、そこからはそこに直接飛べばいいということで、予めスタブが入れられています。
この分岐が成立した場合は、ジャンプ命令が入っていて、最初はオフセット0で入っているんですが、この次のブロックがオフセットのところを埋めて、次に分岐が成立した場合は制御を戻さずに直接次のブロックに飛んでくださいという変更を行います。そうすると、次のループからは制御を戻すことなく、分岐成立時は直接次のブロックにジャンプすることができるようになります。
このTCG Block Chainingという技術を私の自作QEMUにも導入して、速度向上結果を測ってみました。結果がこの赤いグラフです。初期実装版に比べると、まぁまぁ速くなったかなと思っています。
これはRustの性能解析ツールを使って、どこが遅くなっているのかをいろいろ調査した結果です。この結果が合っているのかどうかはだいぶ眉唾なんですが、はっきりわかるのは実際にエミュレーションモードで動いている時間はかなり短くて、それ以外のフェッチやデコードなどでかなり時間を取られてしまったというのがわかりました。
なのでQEMUもそうですが、なるべくエミュレーションの状態を維持して、制御を戻すことを防ぐのが、エミュレータの高速化の肝になるのではないかなと思いました。
QEMUの高速化テクニックその2、TCG Lookup and Jumpです。これは一般的な用語ではなくて、私が勝手に作りました。さっきの方法は、ジャンプ先がstaticに決まっていないと使えない技で、例えばレジスタ間接ジャンプとかでは使えません。
レジスタ間接ジャンプはどうするかというところですが、例えばRET命令でレジスタを読むと、ジャンプ先のアドレスが決まった段階で小さなテーブルをもっていて、そのテーブルにこのジャンプ先のブロックはどこにありますかとサーチしに行きます。
ブロックが生成済みであることがテーブルヒットすると、そのアドレスをテーブルから引っ張ってきて、そこにジャンプします。アドレスが決まった段階でテーブルをサーチしに行って、見つかれば即ジャンプというかたちで、これも制御が戻ることを防いでいるテクニックです。
これも同じく実装してみました。自作QEMUにこのテクニックを実装すると、もうちょっと速くなりました。Dhrystoneがだいたい2秒ぐらいにまで向上できました。ただQEMUに比べるとまだぜんぜん速くはなくて、倍以上の差をつけられています。
QEMUはこれ以外にいろいろな高速化テクニックが導入されています。今回、私の実装では実装できなかったんですが、いろいろな最適化方式があります。
QEMUのすごいところは、中間表現のTCGでいろいろな最適化を適用してしまうというところで、いくつか紹介します。例えばレジスタ依存があって、全部に依存がある命令列があったとして、よく見てみると実は起点がx0レジスタ、つまり即値で、この書き込みレジスタの値は実は実行前にすべて計算できるというものになっています。
このような依存関係もQEMUは事前に解析して、x86の命令を出す時は全部即値命令に置き換えてしまうことで高速化を図っています。
下の例は、次の命令がレジスタをすぐに使う場合ですが、普通にx86の命令を生成すると、1回どこかからレジスタの値をx86のレジスタに引っ張ってきて、計算してストアして引っ張ってきて計算してとなるんですが、次の命令で即その値を使うのであれば、1回ストアすることは必要ありません。明らかに不要なメモリアクセスですね。
そういう中間の格納を全部スキップして、実行する命令数を減らすということが行われています。こんな感じでいろいろなテクニックが融合して、QEMUは高速に実行できているということがわかりました。
こんな感じでいろいろとQEMUについて勉強したんですが、Rustを使ってよかったかどうかというのは、完全に個人的な私見です。
Rustを使うとこういうエミュレータでも安全に実装できるだろうと思っていました。Rustがなぜ安全なのかというと、コンパイラがx86のアセンブラを出す時に、安全になるRustのアセンブラを出してくれるみたいな、配列外アクセスを検出するものを出してくれるみたいな、そういうところでコンパイラのちからが大きいなというところが見えてきました。
なので、コンパイラのまかり知らぬことを書くといくらRustでも安全ではないということになってしまいます。例えば今回実装した中で、TCG Block Chainingのところでジャンプのオフセットを無理矢理書き換えるみたいなことをしました。
そうすると、メモリにゴリゴリにアクセスするみたいなことを書かないといけなくて、無理矢理書き換えるunsafeなものを大量に作る必要が生じて、「Rustを使ったけど、この大量のunsafeはどうだ」みたいなことになってしまいました。
エミュレータはバイナリを生成するのが目的で、コンパイラはどんなバイナリが作られるかなんてまかり知らないところなので、コンパイラの知らないところに行ってしまうと、それはいくらRustでも知らんとなってしまうというのがちょっと今回の反省点ですね。
なので、単純にQEMUで実装されていることをRustで書き直せばよいというわけではなくて、RustならRustにあった書き方をしないときっと良いプログラム、良いコードは書けないんだなという月並みの反省を最後に書いて私の発表を終わります。ご清聴ありがとうございます。
司会者:ありがとうございました。質疑の時間があります。「エミュレータとシミュレータの違いってよくわかっていないなぁ」というコメントがありましたが、機械屋さんからすると、ここって何か使い分けがありますか?
msyksphinz:私も「いったいどっちが正しいんだろう」という疑問をもちつつ、この資料を書いていたので、正直定義は私もわかりません。ハードウェア屋さんからしてみると、一般的にはCPUのコアのみを見るのを、シミュレータと言っているのかなという気がします。システム全体を模擬すると、エミュレータになるのかなというザックリな印象ですね。そんな感じで非常に曖昧に使っています。
司会者:ありがとうございます。もう1点、「昔々QEMUは遅いと言われていたイメージがあるけど、いつから速いというポジションになったのか」。この発表を見たみなさんも、「QEMU速い!」となっていますが、そういう話は聞いたことがありますか?
msyksphinz:実は私もQEMUは非常に初心者で、QEMUの勉強を始めたのが2020年の終盤なので、ごめんなさい、QEMUが遅い時代は私も知らなくてですね。私がQEMUをいじり出したのは、それこそRISC-VのLinuxブートとかで、公開されているシミュレータとQEMUで同じLinuxを立ち上げるとQEMUがダントツに速かったので、QEMUは速いという前提から入ってしまいました。
司会者:これで時間は以上ですね。ありがとうございました。
2025.02.13
“最近の新人は報連相をしない”という、管理職の他責思考 部下に対する「NG指示」から見る、認識のズレを防ぐコツ
2025.02.13
AIを使いこなせない人が直面する本当の課題 元マッキンゼー・赤羽雄二氏が“英語の情報”を追い続ける理由
2025.02.14
報連相ができない部下に対するコミュニケーションの取り方 「部下が悪い」で終わらせない、管理職のスキル向上のポイント
2025.02.12
マネージャーは「プレイング3割」が適切 チームの業績を上げるためのマネジメントと業務の比率
2025.02.13
上司からは丸投げ、部下からはハラスメント扱い、業務は増加…プレイングマネジャーを苦しめる「6つの圧力」とは
2025.02.12
何度言っても変わらない人への指示のポイント 相手が主体的に動き出す“お願い”の仕方
2025.02.13
「みんなで決めたから」を言い訳にして仲良しクラブで終わる組織 インパクトも多様性も両立させるソース原理
2025.02.06
すかいらーく創業者が、社長を辞めて75歳で再起業したわけ “あえて長居させるコーヒー店”の経営に込めるこだわり
2025.02.10
32歳で「すかいらーく」を創業、75歳で「高倉町珈琲」で再起業 「失敗したからすかいらーくができた」横川竟氏流の経営哲学
2025.01.07
1月から始めたい「日記」を書く習慣 ビジネスパーソンにおすすめな3つの理由
限られた時間で成果を上げるドイツ式仕事術
2025.01.21 - 2025.01.21
着想から2か月でローンチ!爆速で新規事業を立ち上げる方法
2025.01.21 - 2025.01.21
新人の報連相スキルはマネージメントで引きあげろ!~管理職の「他責思考」を排除~
2025.01.29 - 2025.01.29
【手放すTALK LIVE#45】人と組織のポテンシャルが継承されるソース原理 ~人と組織のポテンシャルが花開く「ソース原理」とは~
2024.12.09 - 2024.12.09
『これで採用はうまくいく』著者が語る、今こそ採用担当に届けたい「口説く」力のすべて
2024.11.29 - 2024.11.29