4

私はCIL Specを見ています。付録では、「不正確な障害」について説明しています。つまり、ユーザーは、null 参照例外の正確な順序などを緩和できることを指定できます。付録では、これを JITer で使用してパフォーマンスを向上させるさまざまな方法について説明します。

私の目を引いた特定のサブセクション:

F.5.2 ループのベクトル化

通常、ループをベクトル化するには、次の 2 つのことを知る必要があります。

  1. ループの反復は独立しています

  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「最適化」) について、私が見逃している歴史の一部があるかどうかに興味があります。どちらの主要ベンダーも実際に実装していないのに、なぜ標準に含まれているのでしょうか? マイクロソフトが将来的に取り組む予定はありますか?

4

2 に答える 2

3

そのため、その付録 (およびこれについて説明しているセクション 12.6.4「最適化」) について、私が見逃している歴史の一部があるかどうかに興味があります。どちらの主要ベンダーも実際に実装していないのに、なぜ標準に含まれているのでしょうか? マイクロソフトが将来的に取り組む予定はありますか?

これは、実装を壊したり、仕様の変更を必要とせずに、ある時点でこれを実装できるようにするオプションを提供するために特別に配置されたと思われます。

しかし、実際の C# では、列挙型には NoStringInterning オプションのみがあり、他のオプションはありません

これは、NoStringInterning現時点でサポートされているオプションが のみであるためです。C# の enum は拡張可能であるため (基になる整数型にすぎません)、ランタイムの将来のバージョンは、他のオプションをサポートするように簡単に拡張できます。

VS UserVoiceサイトには、Microsoft がこの分野を改善するための提案があることに注意してください。

于 2012-04-05T18:46:06.130 に答える
1

これは、CLI 仕様を作成しなければならない人の負担です。彼は、これを実際にジッターに実装することが実用的かどうかをまだ知りません。それは後で起こります。

SIMD は問題です。かなり厳しい変数アライメント要件があります。少なくとも x86 ジッターが書き込まれた頃には、ミスアラインされた変数に SIMD 命令を適用しようとすると、ハード バス フォールトが発生しました。x64 ジッタが作成された当時の最新技術は不明ですが、現在でも非常に高価です。x86 のジッターは 4 バイト アラインメントを超えることはできず、x64 は 8 バイトを超えることはできません。16 バイト アラインメントを実際に有効にするには、次世代の 128 ビット コアが必要になる場合があります。私はそのために息を止めていません:)

于 2012-04-05T19:08:23.210 に答える