1

この記事では、コードの最適化について説明し、命令レベルの並列処理について説明します。これらは、個々のスカラーではなくベクトルに対して float4 ベクトル計算を実行できる GPU ベクトル計算の例を示しています。例:

float4 x_neighbor = center.xyxy + float4(-1.0f, 0.0f, 1.0f, 0.0f);

私の質問は、比較目的にも使用できますか? したがって、リダクションの例では、これを行うことができますか:

accumulator.xyz = (accumulator.xyz < element.xyz) ? accumulator.xyz : element.xyz;

ありがとうございました。

4

2 に答える 2

5

オースティンで既に述べたように、比較演算子はベクトルにも適用されます。

ポイント d. 規格のセクション 6.3 が関連する部分です。それは言います:

関係演算子より大きい (>)、より小さい (<)、より大きいか等しい (>=)、およびより小さいか等しい (<=) は、スカラー型とベクトル型で動作します。

有効なケースについても説明します。

  • 2 つのオペランドはスカラーです。(...)

  • 一方のオペランドはスカラーで、もう一方はベクトルです。(...) スカラー型は、ベクトル オペランドと同じ数のコンポーネントを持つベクトルに拡張されます。操作はコンポーネントごとに行われ、同じサイズのベクトルになります。

  • 2 つのオペランドは同じ型のベクトルです。この場合、操作はコンポーネント単位で行われ、同じサイズのベクトルになります。

そして最後に、これらの比較演算子が返すもの:

結果は、ソース オペランドがスカラーの場合は int 型のスカラー符号付き整数になり、ソース オペランドがベクトル型の場合はソース オペランドと同じサイズのベクトル符号付き整数型になります。

スカラー型の場合、関係演算子は、指定された関係が false の場合は 0 を返し、指定された関係が true の場合は 1 を返します。ベクトル型の場合、関係演算子は、指定された関係が偽の場合は 0 を返し、指定された関係が真の場合は -1 (つまり、すべてのビットが設定されている) を返します。いずれかの引数が数値 (NaN) でない場合、関係演算子は常に 0 を返します。

編集:

特に @redrum のコメントの後に、戻り値の部分を少し完成させます。ベクトル型の真の値が -1 であることは、最初は奇妙に思えます。ただし、OCL は可能な限り C のように動作するため、0 以外のすべてが true であるため、大きな変更はありません。

例として、ベクトルがあります:

int2 vect = (int2)(0, -1);

このステートメントは true と評価され、何かを実行します。

if(vect.y){
    //Do something 
}

ここで、これは有効ではないことに注意してください (返される値には関係なく、ベクトルであるという事実にのみ関係します)。

if(vect){
    //do something
}

これはコンパイルされませんが、関数allを使用anyして、「if ステートメント」でベクトルのすべての要素を評価できます。

if(any(vect){
    //this will evaluate to true in our example
}

返される値は (クイック リファレンス カードから) であることに注意してください。

int any (Ti x): 1 if MSB in component of x is set; else 0

したがって、負の数は何でも構いません。

それでも、true と評価されたときに戻り値として 1 を保持しないのはなぜですか?

重要な部分は、すべてのビットが設定されているという事実だと思います。私の推測では、特定の値よりも小さい要素を削除したいなど、ベクトルに対して簡単にビット単位の操作を行うことができるようになるでしょう。値「true」が -1、つまり 111111...111 であるため、次のようなことができます。

int4 vect = (int4)(75, 3, 42, 105);
int ref = 50;
int4 result = (vect < ref) & vect;

結果の要素は次のようになります: 0, 3, 42, 0

一方、戻り値が true の 1 の場合、結果は 0, 1, 0, 0 になります。

于 2013-08-31T07:59:20.477 に答える