クラスVectorMask<E>
- 型パラメータ:
E-ETYPEのボックス版、ベクトルの要素型
VectorMaskは、順序付けられた不変のboolean値のシーケンスを表します。
同じ「要素型」 (ETYPE)およびshapeのVectorMaskおよびVectorには同じ数のレーンがあるため、(具体的には、そのvector speciesには互換性があります)との互換性があります。
ベクトル演算の中には、入力ベクトルのレーン要素の選択と演算を制御する(compatible)マスクを受け入れるものがあります。
順序内の値の数は、VectorMask lengthと呼ばれます。 長さは、VectorMaskレーンの数にも対応します。 レーン索引N (0(これを含む)、長さ(これを含まない))のレーン要素は、順序内のN + 1のth値に対応します。
レーン要素がtrueの場合、レーンはsetと呼ばれます。それ以外の場合、レーン要素がfalseの場合、レーンはunsetと呼ばれます。
VectorMaskは、単項、二項およびリダクション演算の限定されたセットを宣言します。
-
レーンワイズ単項演算は、1つの入力マスクで動作し、結果マスクを生成します。 入力マスクのレーンごとに、レーン要素は指定されたスカラー単項演算を使用して演算され、ブール結果は同じレーンのマスク結果に配置されます。 次の疑似コードは、この演算カテゴリの動作を示しています:
VectorMask<E> a = ...; boolean[] ar = new boolean[a.length()]; for (int i = 0; i < a.length(); i++) { ar[i] = scalar_unary_op(a.laneIsSet(i)); } VectorMask<E> r = VectorMask.fromArray(a.vectorSpecies(), ar, 0); -
レーンワイズ二項演算では、2つの入力マスクを演算して結果マスクを生成します。 2つの入力マスクaおよびbのレーンごとに、aおよびbの対応するレーン要素が、指定されたスカラー二項演算を使用して演算され、ブール結果が同じレーンのマスク結果に配置されます。 次の疑似コードは、この演算カテゴリの動作を示しています:
VectorMask<E> a = ...; VectorMask<E> b = ...; boolean[] ar = new boolean[a.length()]; for (int i = 0; i < a.length(); i++) { ar[i] = scalar_binary_op(a.laneIsSet(i), b.laneIsSet(i)); } VectorMask<E> r = VectorMask.fromArray(a.vectorSpecies(), ar, 0); -
クロス・レーン・リダクション演算では、入力マスクを受け入れてスカラー結果を生成します。 入力マスクのレーンごとに、レーン要素は、指定されたスカラー二項演算を使用してスカラー累積値とともに演算されます。 スカラー結果は、累計の最終値です。 次の疑似コードは、この演算カテゴリの動作を示しています:
Mask<E> a = ...; int acc = zero_for_scalar_binary_op; // 0, or 1 for & for (int i = 0; i < a.length(); i++) { acc = scalar_binary_op(acc, a.laneIsSet(i) ? 1 : 0); // & | + } return acc; // maybe boolean (acc != 0)
値ベースのクラスとアイデンティティ演算
VectorMaskは、Vectorとともにvalue-basedクラスです。 VectorMaskを使用すると、==などのアイデンティティ依存の演算で予期しない結果が発生したり、パフォーマンスが低下する可能性があります。 equalsはアイデンティティ依存のメソッドではないため、v.equals(w)はv==wよりも高速である可能性が高くなります。 (toStringでもhashCodeでもありません。) また、ベクトル・マスク・オブジェクトは、ローカルおよびパラメータにstatic final定数として格納できますが、セマンティクスが有効な場合でも、他のJavaフィールドまたは配列要素に格納すると、パフォーマンスが低下する可能性があります。 -
メソッドのサマリー
修飾子と型メソッド説明abstract booleanallTrue()すべてのマスク・レーンが設定されている場合、trueを返します。abstract VectorMask<E> and(VectorMask<E> m) このマスクと2番目の入力マスク間の論理積(a&bとして)を計算します。abstract VectorMask<E> andNot(VectorMask<E> m) このマスク(a&~bとして)から別の入力マスクを論理的に減算します。abstract booleananyTrue()マスク・レーンのいずれかが設定されている場合、trueを返します。abstract <F> VectorMask<F> cast(VectorSpecies<F> species) このマスクを、指定された種の要素型Fのマスクに変換します。abstract <F> VectorMask<F> このマスクが指定された要素型のベクトルに適用されることを確認し、このマスクをそのまま返します。abstract <F> VectorMask<F> check(VectorSpecies<F> species) このマスクが指定された種を持っていることを確認し、このマスクをそのまま返します。abstract VectorMask<E> compress()このマスクからセット・レーンを圧縮します。abstract VectorMask<E> eq(VectorMask<E> m) このマスクと別の入力マスク(ブールa==bまたはa^~bとして)との論理的な等価性を判定します。final booleanこのマスクが他のオブジェクトと同一かどうかを示します。abstract int設定されている最初のマスク・レーンのインデックスを返します。static <E> VectorMask<E> fromArray(VectorSpecies<E> species, boolean[] bits, int offset) オフセットから始まるboolean配列からマスクをロードします。static <E> VectorMask<E> fromLong(VectorSpecies<E> species, long bits) 指定されたビット・マスク内のビットに従って、最下位ビットから符号ビットまで、各レーンが設定または設定解除されているマスクを返します。static <E> VectorMask<E> fromValues(VectorSpecies<E> species, boolean... bits) 指定されたboolean値に従って各レーンが設定または設定解除されるマスクを返します。protected final Objectfinal inthashCode()マスク・ビット設定およびベクトル種に基づいて、マスクのハッシュ・コード値を返します。abstract VectorMask<E> indexInRange(int offset, int limit) 調整された索引N+offsetが[0..limit-1]の範囲内にない場合に、このマスクからレーン番号付きNを削除します。abstract VectorMask<E> indexInRange(long offset, long limit) 調整された索引N+offsetが[0..limit-1]の範囲内にない場合に、このマスクからレーン番号付きNを削除します。abstract voidintoArray(boolean[] a, int offset) このマスクをoffsetから始まるboolean配列に格納します。abstract booleanlaneIsSet(int i) 索引iのレーンが設定されているかどうかをテストabstract intlastTrue()設定されている最後のマスク・レーンのインデックスを返します。final intlength()マスク・レーンの数を返します。abstract VectorMask<E> not()このマスクを論理的に否定します。abstract VectorMask<E> or(VectorMask<E> m) このマスクと別の入力マスクの論理和集合(a|bとして)を計算します。abstract boolean[]toArray()このマスクのレーン要素を含むboolean配列を返します。abstract longtoLong()最大で最初の64個のレーン要素のlong値にパックされた、このマスクのレーン要素を返します。final StringtoString()このマスクの文字列表現を"Mask[T.TT...]"形式で返し、マスク・ビット設定('T'または'.'文字として)をレーン順に報告します。toVector()このマスクのベクトル表現を返します。そのレーン・ビットは、マスク・ビットに対応して設定または設定解除されます。abstract int設定されているマスク・レーンの数を返します。abstract VectorSpecies<E> このマスクが適用されるベクトル種を返します。abstract VectorMask<E> xor(VectorMask<E> m) このマスクと2番目の入力マスクの論理対称差(a^bとして)を決定します。
-
メソッドの詳細
-
vectorSpecies
public abstract VectorSpecies<E> vectorSpecies()このマスクが適用されるベクトル種を返します。 このマスクは、同じ種のベクトルと、同じレーン数に適用されます。- 戻り値:
- このマスクのベクトル種
-
length
public final int length()マスク・レーンの数を返します。 このマスクは、同じレーン数のベクトルと同じ種のベクトルに適用されます。- 戻り値:
- マスク・レーンの数
-
fromValues
public static <E> VectorMask<E> fromValues(VectorSpecies<E> species, boolean... bits) 指定されたboolean値に従って各レーンが設定または設定解除されるマスクを返します。Nがマスク・レーン索引である各マスク・レーンについて、索引Nの指定されたboolean値がtrueの場合は、索引Nのマスク・レーンが設定されます。それ以外の場合は、設定が解除されます。指定された種には、指定された配列と互換性のあるレーンがいくつか必要です。
- 型パラメータ:
E- boxed要素型- パラメータ:
species- 希望するマスクのベクトル種bits- 指定されたboolean値- 戻り値:
- 指定された
boolean値に従って各レーンが設定または設定解除されるマスク - スロー:
IllegalArgumentException-bits.length != species.length()の場合- 関連項目:
-
fromArray
public static <E> VectorMask<E> fromArray(VectorSpecies<E> species, boolean[] bits, int offset) オフセットから始まるboolean配列からマスクをロードします。Nがマスク・レーン索引である各マスク・レーンについて、索引offset + Nの配列要素がtrueの場合は、索引Nのマスク・レーンが設定されます。それ以外の場合は、設定が解除されます。- 型パラメータ:
E- boxed要素型- パラメータ:
species- 希望するマスクのベクトル種bits-boolean配列offset- 配列へのオフセット- 戻り値:
boolean配列からロードされたマスク- スロー:
IndexOutOfBoundsException-offset < 0またはoffset > bits.length - species.length()の場合- 関連項目:
-
fromLong
public static <E> VectorMask<E> fromLong(VectorSpecies<E> species, long bits) 指定されたビット・マスク内のビットに従って、最下位ビットから符号ビットまで、各レーンが設定または設定解除されているマスクを返します。Nがマスク・レーン索引である各マスク・レーンについて、式(bits>>min(63,N))&1がゼロ以外の場合は、索引Nのマスク・レーンが設定されます。それ以外の場合は、設定が解除されます。指定された種のレーンが64レーン未満の場合、ビット・マスクの上位
64-VLENGTHビットは無視されます。 指定された種が64レーンを超える場合、符号ビットはレーン64以上に複製されます。- 型パラメータ:
E- boxed要素型- パラメータ:
species- 希望するマスクのベクトル種bits- 指定されたマスク・ビット(64ビット符号付き整数)- 戻り値:
- 指定された整数値のビットに従って各レーンが設定または設定解除されるマスク
- 関連項目:
-
cast
public abstract <F> VectorMask<F> cast(VectorSpecies<F> species) このマスクを、指定された種の要素型Fのマスクに変換します。species.length()はマスクの長さと同じである必要があります。 様々なマスク・レーン・ビットは変更されません。Nがレーン索引である各マスク・レーンについて、索引Nのマスク・レーンが設定されている場合は、結果のマスクの索引Nのマスク・レーンが設定されます。それ以外の場合は、マスク・レーンは設定されません。- 型パラメータ:
F- 種のboxed要素の型- パラメータ:
species- 希望するマスクのベクトル種- 戻り値:
- シェイプおよび要素タイプによって変換されたマスク
- スロー:
IllegalArgumentException- このマスクの長さと種の長さが異なる場合
-
toLong
public abstract long toLong()最大で最初の64個のレーン要素のlong値にパックされた、このマスクのレーン要素を返します。レーン要素は、最下位ビットから最上位ビットの順に梱包されます。
Nがマスク・レーン索引である各マスク・レーンについて、マスク・レーンが設定されている場合、Nのthビットは結果のlong値でいずれかに設定されます。それ以外の場合、Nのthビットはゼロに設定されます。 マスクのレーン数は64以下である必要があります。- 戻り値:
long値にパックされたこのマスクのレーン要素。- スロー:
UnsupportedOperationException- このマスクに64を超えるレーンがある場合
-
toArray
public abstract boolean[] toArray()このマスクのレーン要素を含むboolean配列を返します。このメソッドは、このマスクを割り当てられた配列(
intoArray(boolean[], int)を使用して)に格納するかのように動作し、その配列を次のように返します:boolean[] a = new boolean[this.length()]; this.intoArray(a, 0); return a;- 戻り値:
- このベクトルのレーン要素を含む配列
-
intoArray
public abstract void intoArray(boolean[] a, int offset) このマスクをoffsetから始まるboolean配列に格納します。Nがマスク・レーン索引である各マスク・レーンについて、索引Nのレーン要素が配列要素a[offset+N]に格納されます。- パラメータ:
a- boolean []型の配列offset- 配列へのオフセット- スロー:
IndexOutOfBoundsException-offset < 0またはoffset > a.length - this.length()の場合
-
anyTrue
public abstract boolean anyTrue()マスク・レーンのいずれかが設定されている場合、trueを返します。- 戻り値:
- マスク・レーンのいずれかが設定されている場合は
true、それ以外の場合はfalse。
-
allTrue
public abstract boolean allTrue()すべてのマスク・レーンが設定されている場合、trueを返します。- 戻り値:
- すべてのマスク・レーンが設定されている場合は
true、それ以外の場合はfalse。
-
trueCount
public abstract int trueCount()設定されているマスク・レーンの数を返します。- 戻り値:
- 設定されているマスク・レーンの数。
-
firstTrue
public abstract int firstTrue()設定されている最初のマスク・レーンのインデックスを返します。 いずれも設定されていない場合は、VLENGTHを返します。- 戻り値:
- 設定されている最初のマスク・レーンのインデックス、または
VLENGTH
-
lastTrue
public abstract int lastTrue()設定されている最後のマスク・レーンのインデックスを返します。 いずれも設定されていない場合は、-1を返します。- 戻り値:
- 設定されている最後のマスク・レーンのインデックス、または
-1
-
and
public abstract VectorMask<E> and(VectorMask<E> m) このマスクと2番目の入力マスク間の論理積(a&bとして)を計算します。これは、論理
AND演算(&)を対応するマスク・ビットの各ペアに適用するレーンワイズ二項演算です。- パラメータ:
m- 2番目の入力マスク- 戻り値:
- 2つの入力マスクの論理結合の結果
-
or
public abstract VectorMask<E> or(VectorMask<E> m) このマスクと別の入力マスクの論理和集合(a|bとして)を計算します。これは、論理
OR演算(|)を対応するマスク・ビットの各ペアに適用するレーンワイズ二項演算です。- パラメータ:
m- 入力マスク- 戻り値:
- 2つの入力マスクを論理的に分離した結果
-
xor
public abstract VectorMask<E> xor(VectorMask<E> m) このマスクと2番目の入力マスクの論理対称差(a^bとして)を決定します。これは、論理
XOR演算(^)を対応するマスク・ビットの各ペアに適用するレーンワイズ二項演算です。- パラメータ:
m- 入力マスク- 戻り値:
- 2つの入力マスクを論理的に結合解除した結果
-
andNot
public abstract VectorMask<E> andNot(VectorMask<E> m) このマスク(a&~bとして)から別の入力マスクを論理的に減算します。これは、論理
ANDC演算(&~)を対応するマスク・ビットの各ペアに適用するレーンワイズ二項演算です。- パラメータ:
m- 2番目の入力マスク- 戻り値:
- このマスクから2番目のマスクを論理的に減算した結果
-
eq
public abstract VectorMask<E> eq(VectorMask<E> m) このマスクと別の入力マスク(ブールa==bまたはa^~bとして)との論理的な等価性を判定します。これは、レーンワイズ二項演算で、対応する各マスク・ビットのペアが等しいかどうかをテストします。 また、対応するマスク・ビットの各ペアに対して、論理
XNOR操作(^~)と同等です。- パラメータ:
m- 入力マスク- 戻り値:
- 2つの入力マスクが等しい場所を示すマスク
- 関連項目:
-
not
public abstract VectorMask<E> not()このマスクを論理的に否定します。これは、論理
NOT演算(~)を各マスク・ビットに適用するレーンワイズ二項演算です。- 戻り値:
- このマスクの論理否定の結果
-
indexInRange
public abstract VectorMask<E> indexInRange(int offset, int limit) 調整された索引N+offsetが[0..limit-1]の範囲内にない場合に、このマスクからレーン番号付きNを削除します。いずれの場合も、一連のsetレーンとunsetレーンは、オーバーフローやラウンドなしで無限精度または
VLENGTH-飽和加算または減算を使用する場合と同様に割り当てられます。- APIのノート:
- このメソッドは、
[offset..offset+VLENGTH-1]の範囲内の索引番号に対して、Objects.checkIndex(int,int)によって実行されるチェックのSIMDエミュレーションを実行します。 例外が必要な場合は、結果のマスクを元のマスクと比較できます。等しくない場合は、少なくとも1つのレーンが範囲外であったため、例外処理を実行できます。一連の
Nセット・レーンであり、その後に一連の未設定レーンが続くマスクを取得するには、allTrue.indexInRange(0, N)を呼び出します。ここで、allTrueはすべての真のビットのマスクです。N1の未設定レーンとそれに続くN2セット・レーンのマスクは、allTrue.indexInRange(-N1, N2)をコールすることで取得できます。 - パラメータ:
offset- 開始インデックスlimit- インデックス範囲の上限(除外)- 戻り値:
- 範囲外のレーンが設定された、元のマスク
- 関連項目:
-
indexInRange
public abstract VectorMask<E> indexInRange(long offset, long limit) 調整された索引N+offsetが[0..limit-1]の範囲内にない場合に、このマスクからレーン番号付きNを削除します。いずれの場合も、一連のsetレーンとunsetレーンは、オーバーフローやラウンドなしで無限精度または
VLENGTH-飽和加算または減算を使用する場合と同様に割り当てられます。- APIのノート:
- このメソッドは、
[offset..offset+VLENGTH-1]の範囲内の索引番号に対して、Objects.checkIndex(long,long)によって実行されるチェックのSIMDエミュレーションを実行します。 例外が必要な場合は、結果のマスクを元のマスクと比較できます。等しくない場合は、少なくとも1つのレーンが範囲外であったため、例外処理を実行できます。一連の
Nセット・レーンであり、その後に一連の未設定レーンが続くマスクを取得するには、allTrue.indexInRange(0, N)を呼び出します。ここで、allTrueはすべての真のビットのマスクです。N1の未設定レーンとそれに続くN2セット・レーンのマスクは、allTrue.indexInRange(-N1, N2)をコールすることで取得できます。 - パラメータ:
offset- 開始インデックスlimit- インデックス範囲の上限(除外)- 戻り値:
- 範囲外のレーンが設定された、元のマスク
- 導入されたバージョン:
- 19
- 関連項目:
-
toVector
このマスクのベクトル表現を返します。そのレーン・ビットは、マスク・ビットに対応して設定または設定解除されます。Nがマスク・レーン索引である各マスク・レーンについて、マスク・レーンがNで設定されている場合、特定のデフォルト以外の値-1がレーン索引Nの結果ベクトルに配置されます。 それ以外の場合、デフォルトの要素値0はレーン索引Nの結果ベクトルに配置されます。 このマスクの要素タイプ(ETYPE)が浮動小数点であるか整数であるかにかかわらず、マスクによって選択されるレーン値は、2つの算術値0または-1のいずれかになります。ETYPEごとに、マスク・レーンが設定されている場合にのみ、ベクトル・レーンの最上位ビットが設定されます。 さらに、整数型の場合、allレーンのビットは、マスクが設定されているレーンに設定されます。戻されるベクトルは、
ZERO.blend(MINUS_ONE, this)によって計算されるベクトルと同じです。ここで、ZEROとMINUS_ONEは、それぞれデフォルトのETYPE値と-1を表すETYPE値をレプリケートするベクトルです。- APIのノート:
- 静的型チェックのために、ユーザーは結果のベクトルを予想される積分レーン型(複数可)または種と照合してチェックする場合があります。 マスクが浮動小数点種用の場合、結果のベクトルは同じシェイプとレーン・サイズを持ちますが、整数型になります。 マスクが積分種の場合、結果のベクトルは正確にその種のものになります。
- 戻り値:
- このマスクのベクトル表現
- 関連項目:
-
laneIsSet
public abstract boolean laneIsSet(int i) 索引iのレーンが設定されているかどうかをテスト- パラメータ:
i- レーンのインデックス- 戻り値:
- インデックス
iのレーンが設定されている場合はtrue、そうでない場合はfalse - スロー:
IndexOutOfBoundsException- 索引が(< 0 || >= length())の範囲外であるかどうか
-
check
public abstract <F> VectorMask<F> check(Class<F> elementType) このマスクが指定された要素型のベクトルに適用されることを確認し、このマスクをそのまま返します。 効果は次の疑似コードのようになります :elementType == vectorSpecies().elementType() ? this : throw new ClassCastException()。- 型パラメータ:
F- 必要なレーン型のボックス化された要素型- パラメータ:
elementType- 必要なレーン・タイプ- 戻り値:
- 同じマスク
- スロー:
ClassCastException- 要素タイプが間違っている場合- 関連項目:
-
check
public abstract <F> VectorMask<F> check(VectorSpecies<F> species) このマスクが指定された種を持っていることを確認し、このマスクをそのまま返します。 効果は次の疑似コードのようになります :species == vectorSpecies() ? this : throw new ClassCastException()。- 型パラメータ:
F- 必要な種のボックス化された要素型- パラメータ:
species- このマスクにはベクトル種が必要です- 戻り値:
- 同じマスク
- スロー:
ClassCastException- 種が間違っている場合- 関連項目:
-
toString
-
equals
-
hashCode
-
compress
public abstract VectorMask<E> compress()このマスクからセット・レーンを圧縮します。 一連のNセット・レーンの後に一連の未設定レーンが続くマスクを返します。ここで、Nはこのマスクの実際のカウントです。- 戻り値:
- このマスクの圧縮マスク
- 導入されたバージョン:
- 19
-
getPayload
protected final Object getPayload()
-