Hint intrinsic
Hint
intrinsic を使用すると、Burst の最適化に役立つ情報をコードに追加できます。これには、以下のメソッドが含まれています。
Unity.Burst.CompilerServices.Hint.Likely
: Boolean 条件が true になる可能性が高いことを Burst に伝えます。Unity.Burst.CompilerServices.Hint.Unlikely
: Boolean 条件が true になる可能性が低いことを Burst に伝えます。Unity.Burst.CompilerServices.Hint.Assume
: Boolean 条件が true になると想定できることを Burst に伝えます。
Likely intrinsic
Likely
intrinsic は、どの分岐条件が高い確率で true になるかを Burst に伝えるのに最も役に立ちます。つまり、Burst が最適化のためにその分岐に専念できます。
if (Unity.Burst.CompilerServices.Hint.Likely(b))
{
// ここにあるコードは、こちらがおそらく実行されるという想定で Burst によって最適化されます。
}
else
{
// 一方ここにあるコードは、オプティマイザーの対象から除外されます。
}
Unlikely intrinsic
Unlikely
intrinsic は、Likely
intrinsic と反対の情報、つまりその条件が true になる確率は低く、他の条件で最適化する必要があることを Burst に伝えます。
if (Unity.Burst.CompilerServices.Hint.Unlikely(b))
{
// ここにあるコードは、オプティマイザーの対象から除外されます。
}
else
{
// ここにあるコードは、こちらがおそらく実行されるという想定で Burst によって最適化されます。
}
Likely
および Unlikely
intrinsic は、Burst がバイナリ形式の分岐条件の後に実行される確率が最も高いコードを配置できるようにするためのものです。つまり、それが命令キャッシュ内に含まれる可能性の高いコードになります。また Burst は、確率の高い分岐のコードを最適化することに長い時間をかけ、確率の低いコードにかける時間は比較的短くすることができます。
確率の低い分岐の例に、割り当ての結果が有効かどうかをチェックするというものがあります。割り当てはほとんどの場合有効なので、その前提でコードを高速化しつつ、フォールバック用のエラーケースも必要だからです。
Assume intrinsic
Assume
intrinsic は強力です。特定の条件が常に true になることを Burst に伝えるため、慎重に使用してください。
Warning
Assume
を使用すると、Burst は値が true であると想定し、実際に true かどうかはチェックしません。
Unity.Burst.CompilerServices.Hint.Assume(b);
if (b)
{
// Burst には b が常に true であることが示されているので、常にこの分岐が選択されます。
}
else
{
// b が常に true なので、ここにあるコードはプログラムから除外されます。
}
Assume
intrinsic を使用すると、Burst には何かが true であることを任意に伝えることができます。例えば Assume
を使用して、ループが常に 16 の倍数で終わることを想定するよう Burst に伝えることができます。つまり、そのループのスカラーを漏らすことなく完全にベクトル化できます。また、それを使用して、Burst に値が NaN
ではないことや負の値であることを伝えることもできます。