天天看點

OpenCL: kernel中的向量關系運算符和等價運算符(>,<,>=,<=,==,!=)

opencl的kernel程式設計語言是C99标準的一個子集,在C99的基礎上opencl增加了向量資料類型(Scalar Data Types):charn,ucharn,shortn,ushortn,intn,uintn,longn,ulongn,floatn,doublen(n=2,4,8,16)。

這些向量類型與基礎的标量類型(Vector Data Types)一樣支援各種算術和邏輯運算符。

Opencl中的關系運算符(relational operators)包括(<,>,<=,>=),等價運算符(equality operators)包括(==,!=),所有的關系運算符和等價運算符的傳回結果都是一個整數類型。向量類型比較時,傳回的結果是對應同樣位元組長度的整數向量類型:

charn,ucharn類型的結果就傳回 charn;

shortn,ushortn類型的結果就傳回 shortn;

intn,uintn類型的結果就傳回 intn;

longn,ulongn類型的結果就傳回 longn;

floatn類型的結果就傳回 intn;

doublen類型的結果就傳回 longn;

例如

uint2 x=(uint2)(,);
uint2 y=(uint2)(,);
int2 r=x>y; //正确
uchar2 r2=x>y;//編譯錯誤 uchar與int長度不同
           

在進行向量比較的時候,允許兩個同類型向量比較,也允許一個向量與一個标量類型比較。

兩個向量比較的時,它們的類型必須一樣。

例如:

uint2 x=(uint2)(,);
uint2 y=(uint2)(,);
long2 z=(uint2)(,);
uint4 z2=(uint4)(,,,);
int2 r1=x>y; //正确
int2 r2=x>z; // 編譯錯誤,x和z的類型不同
int2 r3=x>z2; // 編譯錯誤,x和z的類型不同
           

一個向量和一個标量類型比較的時候,标量的類型必須與向量的元素類型一樣或者能被隐式轉換成向量元素類型,在比較運算時标量類型被擴充為與向量類型一樣元素數目的标量,然後參與比較運算。

例如:

uint2 x=(uint2)(,);
int2 r1=x>; //正确 等價于 x>(int2)(0,0)
           

當比較結果為true時,結果标量的對應元素值為-1,

當比較結果為false時,結果标量的對應元素值為0

如果向量元素為NaN,則結果傳回0

例如:

uint2 x=(uint2)(,);
uint2 y=(uint2)(,);
int2 r=x>y; // r為 (-1,0)
           

繼續閱讀