OpenCL: kernel中的向量关系运算符和等价运算符(>,=,

2019-05-25 22:42:55 浏览数 (2)

版权声明:本文为博主原创文章,转载请注明源地址。 https://cloud.tencent.com/developer/article/1433794

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;

例如

代码语言:javascript复制
uint2 x=(uint2)(1,2);
uint2 y=(uint2)(0,1);
int2 r=x>y; //正确
uchar2 r2=x>y;//编译错误 uchar与int长度不同

在进行向量比较的时候,允许两个同类型向量比较,也允许一个向量与一个标量类型比较。

两个向量比较的时,它们的类型必须一样。

例如:

代码语言:javascript复制
uint2 x=(uint2)(1,2);
uint2 y=(uint2)(0,1);
long2 z=(uint2)(0,1);
uint4 z2=(uint4)(0,1,2,3);
int2 r1=x>y; //正确
int2 r2=x>z; // 编译错误,x和z的类型不同
int2 r3=x>z2; // 编译错误,x和z的类型不同

一个向量和一个标量类型比较的时候,标量的类型必须与向量的元素类型一样或者能被隐式转换成向量元素类型,在比较运算时标量类型被扩展为与向量类型一样元素数目的标量,然后参与比较运算。

例如:

代码语言:javascript复制
uint2 x=(uint2)(1,2);
int2 r1=x>0; //正确 等价于 x>(int2)(0,0)

当比较结果为true时,结果标量的对应元素值为-1,

当比较结果为false时,结果标量的对应元素值为0

如果向量元素为NaN,则结果返回0

例如:

代码语言:javascript复制
uint2 x=(uint2)(1,2);
uint2 y=(uint2)(0,3);
int2 r=x>y; // r为 (-1,0)

0 人点赞