- 型パラメータ:
E
-ETYPE
のボックス版、ベクトルの要素型値ベースのクラスとアイデンティティ演算
VectorMask
は、Vector
とともにvalue-basedクラスです。VectorMask
を使用すると、==
などのアイデンティティ依存の演算で予期しない結果が発生したり、パフォーマンスが低下する可能性があります。equals
はアイデンティティ依存のメソッドではないため、v.equals(w)
はv==w
よりも高速である可能性が高くなります。 (toString
でもhashCode
でもありません。) また、ベクトル・マスク・オブジェクトは、ローカルおよびパラメータにstatic final
定数として格納できますが、セマンティクスが有効な場合でも、他のJavaフィールドまたは配列要素に格納すると、パフォーマンスが低下する可能性があります。
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)
-
メソッドのサマリー
修飾子と型メソッド説明abstract boolean
allTrue()
すべてのマスク・レーンが設定されている場合、true
を返します。abstract VectorMask<E>
and
(VectorMask<E> m) このマスクと2番目の入力マスク間の論理積(a&b
として)を計算します。abstract VectorMask<E>
andNot
(VectorMask<E> m) このマスク(a&~b
として)から別の入力マスクを論理的に減算します。abstract boolean
anyTrue()
マスク・レーンのいずれかが設定されている場合、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>
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
値に従って各レーンが設定または設定解除されるマスクを返します。final int
hashCode()
マスク・ビット設定およびベクトル種に基づいて、マスクのハッシュ・コード値を返します。abstract VectorMask<E>
indexInRange
(int offset, int limit) 調整された索引N+offset
が[0..limit-1]
の範囲内にない場合に、このマスクからレーン番号付きN
を削除します。abstract void
intoArray
(boolean[] a, int offset) このマスクをoffsetから始まるboolean
配列に格納します。abstract boolean
laneIsSet
(int i) 索引i
のレーンが設定されているかどうかをテストabstract int
lastTrue()
設定されている最後のマスク・レーンのインデックスを返します。final int
length()
マスク・レーンの数を返します。abstract VectorMask<E>
not()
このマスクを論理的に否定します。abstract VectorMask<E>
or
(VectorMask<E> m) このマスクと別の入力マスクの論理和集合(a|b
として)を計算します。abstract boolean[]
toArray()
このマスクのレーン要素を含むboolean
配列を返します。abstract long
toLong()
最大で最初の64個のレーン要素のlong
値にパックされた、このマスクのレーン要素を返します。final String
toString()
このマスクの文字列表現を"Mask[T.TT...]"
形式で返し、マスク・ビット設定('T'または'.'文字として)をレーン順に報告します。toVector()
このマスクのベクトル表現を返します。そのレーン・ビットは、マスク・ビットに対応して設定または設定解除されます。abstract int
設定されているマスク・レーンの数を返します。abstract VectorSpecies<E>
このマスクが適用されるベクトル種を返します。クラスjdk.internal.vm.vector.VectorSupport.VectorPayloadで宣言されたメソッド
getPayload
-
メソッドの詳細
-
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つの入力マスクを論理的に分離した結果
-
eq
public abstract VectorMask<E> eq(VectorMask<E> m) このマスクと別の入力マスク(ブールa==b
またはa^~b
として)との論理的な等価性を判定します。これは、レーンワイズ二項演算で、対応する各マスク・ビットのペアが等しいかどうかをテストします。 また、マスク・ビットでの逆引き
XOR
演算(^~
)にも相当します。- パラメータ:
m
- 入力マスク- 戻り値:
- 2つの入力マスクが等しい場所を示すマスク
- 関連項目:
-
andNot
public abstract VectorMask<E> andNot(VectorMask<E> m) このマスク(a&~b
として)から別の入力マスクを論理的に減算します。これは、論理
ANDC
演算(&~
)を対応するマスク・ビットの各ペアに適用するレーンワイズ二項演算です。- パラメータ:
m
- 2番目の入力マスク- 戻り値:
- このマスクから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
- インデックス範囲の上限(exclusive)- 戻り値:
- 範囲外のレーンが設定された、元のマスク
- 関連項目:
-
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
-
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
public final String toString()このマスクの文字列表現を"Mask[T.TT...]"
形式で返し、マスク・ビット設定('T'または'.'文字として)をレーン順に報告します。 -
equals
public final boolean equals(Object obj) このマスクが他のオブジェクトと同一かどうかを示します。 2つのマスクは、同じ種と同じソース・インデックスを同じ順序で持つ場合にのみ同一です。 -
hashCode
public final int hashCode()マスク・ビット設定およびベクトル種に基づいて、マスクのハッシュ・コード値を返します。
-