私はCIL Specを見ています。付録では、「不正確な障害」について説明しています。つまり、ユーザーは、null 参照例外の正確な順序などを緩和できることを指定できます。付録では、これを JITer で使用してパフォーマンスを向上させるさまざまな方法について説明します。
私の目を引いた特定のサブセクション:
F.5.2 ループのベクトル化
通常、ループをベクトル化するには、次の 2 つのことを知る必要があります。
ループの反復は独立しています
ループの反復回数は既知です。
フォルトの可能性があるチェックに対して緩和された方法では、フォルトの可能性が各ループ反復から後続のループ反復への制御依存を引き起こすため、パート 1 はしばしば偽になります。緩和された方法では、これらのコントロールの依存関係は無視できます。ほとんどの場合、緩和されたメソッドは、チェックをループから巻き上げることができるようにすることで、ベクトル化を簡素化します。それでも、このような巻き上げが不可能な場合でも、IA-32 SSE や PowerPC Altivec などの「ショート ベクター」SIMD ハードウェアのベクトル化では、フォールトによって暗示される反復間の依存関係を無視することが重要になる場合があります。
たとえば、次のループを考えてみましょう。
for (k = 0; k < n; k++) { x[k] = x[k] + y[k] * s[k].a; }
ここで、s は参照の配列です。リラックスしたコンテキストであっても、null 参照のチェックをループから引き上げることはできません。しかし、リラックスすると、「アンロール アンド ジャム」をうまく適用できます。ループを 4 倍に展開して集約反復を作成し、チェックを各集約反復の先頭に引き上げることができます。
つまり、これらの緩和されたフォールトを使用していた場合、JITer によってループが自動的に SIMD 操作に変換される可能性があることを示唆しています。仕様では、System.Runtime.CompilerServices.CompilationRelaxations 列挙型を使用して、これらの緩和された障害を設定できることが示唆されています。しかし、実際の C# では、列挙型には NoStringInterning オプションのみがあり、他のオプションはありません。System.Runtime.CompilerServices.CompilationRelaxationsAttribute を他のソースから取得したいくつかの int コードに設定しようとしましたが、生成された x86 アセンブリに違いはありませんでした。
したがって、私が知る限り、公式の Microsoft JIT はこれを実装していません。そして、Mono にはMono.Simd名前空間があることを知っているので、これも実装していないと思います。
そのため、その付録 (およびこれについて説明しているセクション 12.6.4「最適化」) について、私が見逃している歴史の一部があるかどうかに興味があります。どちらの主要ベンダーも実際に実装していないのに、なぜ標準に含まれているのでしょうか? マイクロソフトが将来的に取り組む予定はありますか?