モジュール jdk.incubator.vector
パッケージ jdk.incubator.vector

クラスVectorMask<E>

java.lang.Object
jdk.incubator.vector.VectorMask<E>
型パラメータ:
E - ETYPEのボックス版、ベクトルの要素型

値ベースのクラスとアイデンティティ演算

VectorMaskは、Vectorとともにvalue-basedクラスです。 VectorMaskを使用すると、==などのアイデンティティ依存の演算で予期しない結果が発生したり、パフォーマンスが低下する可能性があります。 equalsはアイデンティティ依存のメソッドではないため、v.equals(w)v==wよりも高速である可能性が高くなります。 (toStringでもhashCodeでもありません。) また、ベクトル・マスク・オブジェクトは、ローカルおよびパラメータにstatic final定数として格納できますが、セマンティクスが有効な場合でも、他のJavaフィールドまたは配列要素に格納すると、パフォーマンスが低下する可能性があります。

public abstract class VectorMask<E> extends Object
VectorMaskは、順序付けられた不変のboolean値のシーケンスを表します。

同じ「要素型」 (ETYPE)およびshapeVectorMaskおよび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)