ものがたり(旧)

atsushieno.hatenablog.com に続く

Mono.Simd on .NET does not make sense

id:kaminarioyaji:20081202:1228210788

Mono.Simd.dllはクラスライブラリですが、.NET Frameworkで実行しても意味がありません。動作はするでしょうが、SIMDでは実行されません。

結局のところ、Mono.SimdのコードをSIMD命令に置き換えるのはJITの仕事なのです。Mono.Simdのサポートは、実のところruntimeハッカーが作り出したもので、主要なコードはJIT (mini)上に存在します。MiguelがPDCでディスアセンブリx86命令まで見せていたポイントもそこにあります。

Mono.Simdの仕組みをごく簡単に説明すると(というか僕はごく簡単にしか知らないのですが)、

  • ユーザがMono.Simdを使ったコードを(C#で)書いて実行する
  • Mono.Simdをmonoランタイム (mono/mono/metadata) が解釈し、CILメタデータJIT (mono/mono/mini) に渡す
  • miniは(simd最適化が有効になっていたら)そのCILがMono.Simdのものでないかどうかチェックして、SIMDサポートのコードであれば、それを単なるx86命令ではなくSIMD命令として出力する
  • JITted codeが実行される

という流れになります。これはmonoランタイムでなければ起こらないことなのです。

今回はSIMDサポートということで話題になりましたが、他のCPUで特に高速化命令を実装したいということになれば、それらはmini JIT上に最適化オプションとして実装することができるでしょう。.NET FrameworkでこういったJITのカスタマイズが可能であるか、可能になるかは、僕にはわかりません。