OpenCL支持的运算符在下表中列出。
算术运算符
加、减、乘和除可以用于内建整数、浮点标量和矢量数据类型。取余只能用于整数标量和整数矢量数据类型。如果操作数有相同类型(整数或浮点数),算术运算符的结果类型与操作数一样。操作数为整数与浮点数,则返回值为浮点数类型。操作数一个为矢量数据,另一个为标量数据时,这个标量操作数会转换为矢量操作数使用的元素类型。例如:
int4 vec_a = (int4)(1, 2, 3, 4);
int flag = 3;
int vec_b = vec_a * flag; //vec_b=(1,2,3,4)*(3,3,3,3)=(3,6,9,12)
关系和相等运算符
关系和相等运算符可以用于标量和矢量类型。这两种运算符的结果都是一个整数标量或矢量类型。如果两个操作数都是标量,则结果为有符号的整型标量。如果操作数是charn或ucharn,则结果为charn;如果操作数是shortn或ushortn,则结果为shortn;如果操作数为intn、uintn或f loatn,则结果为intn。如果操作数为longn、ulongn或doublen,则结果为longn。如果操作数一个为矢量数据,另一个为标量数据时,这个标量操作数会转换为矢量操作数使用的元素类型。
对于标量类型,如果关系和相等运算符为假,则结果为0,反之结果为1。对于矢量类型,如果关系和相等运算符为假,则结果为0,反之结果为-1。
位运算符除
了浮点类型标量和矢量,位运算符可以用于内建的其他所有标量和矢量数据类型。如果操作数有相同类型,结果类型与操作数一样。如果操作数一个为矢量数据,另一个为标量数据时,这个标量操作数会转换为矢量操作数使用的元素类型。
逻辑运算符
逻辑运算符可以用于所有的标量和矢量数据类型。如果操作数是charn或ucharn,则结果为charn;如果操作数是shortn或ushortn,则结果为shortn;如果操作数为intn、uintn或floatn,则结果为intn。如果操作数为longn、ulongn或doublen,则结果为longn。如果操作数一个为矢量数据,另一个为标量数据时,这个标量操作数会转换为矢量操作数使用的元素类型。
对于标量,如果指定关系为假,则结果为0,反之结果为1。对于矢量,如果指定关系为真,则结果为0,反之为-1。
条件选择运算符
三目选择运算符作用于三个表达式(expr1?expr2:expr3)。运算符计算第一个表达式expr1,expr1可以为标量或矢量数据类型,但不能是内置浮点数。如果操作数是标量,当expr1不为零时,结果为第二个表达式exp2;如果expr1等于0时,结果为第三个表达式expr3。如果操作数为矢量,则会依次判断expr1中矢量分量结果,如果expr1中某个矢量分量结果的最高有效位为1,则结果为第二个表达式expr2中相同位置的矢量分量结果;如果expr1中某个分量结果的最高有效位为0,则结果为第三个表达式expr3中相同位置的矢量分量结果。例如:
int4 vec_a = (int4)(4, 3, 2, 1);
int4 vec_b = (int4)(1, 2, 3, 4);
int4 vec_c = (vec_a > vec_b) ? vec_a : vec_b;
//vec_c.x=(vec_a.x>vec_b.x)?(vec_a.x:vec_b.x)
//vec_c.y=(vec_a.y>vec_b.y)?(vec_a.y:vec_b.y)
//vec_c.z=(vec_a.z>vec_b.z)?(vec_a.z:vec_b.z)
//vec_c.w=(vec_a.w>vec_b.w)?(vec_a.w:vec_b.w)
//vec_c=(4,3,3,4)
vec_a=(in4)(0x8000 0000,100,-1,0);
vec_c=(in4)(-1,-2,-3,-4);
vec_c=vec_a? vec_b:vec_c;
//vec_c=(1,-2,3,-4);
移位运算符
除了浮点类型标量和矢量,移位运算符可以用于内建的其他所有标量和矢量数据类型。如果第一个操作符为标量,则最右操作数必须为一个标量。如果第一个操作数是一个矢量,则最右操作数可以是矢量也可以是标量。对于矢量,依次移位矢量中的所有分量。
一元运算符算术
一元运算符(+和-)用于内置标量和矢量数据。
除了浮点类型的标量和矢量,自加和自减运算符可以用于其他所有标量和矢量数据类型。对于矢量数据,会对矢量中所有分量执行相应的自加或自减运算。例如:
int4 vec_a = (int4)(4, 3, 2, 1);
vec_a++; //vec_a=(5,4,3,2)
逻辑非操作可以用于所有标量和矢量数据类型。如果操作数是charn或ucharn,则结果为charn;如果操作数是shortn或ushortn,则结果为shortn;如果操作数为intn、uintn或f loatn,则结果为intn。如果操作数为longn、ulongn或doublen,则结果为longn。对于标量,如果指定关系为假,则结果为0,反之结果为1。对于矢量,如果指定关系为真,则结果为0,反之为-1。
sizeof运算符会得到操作数的字节大小,包含为了对齐而增加的空间。对于标量数据,如果操作数为char或uchar,结果为1;如果操作数为short、ushort或shart,结果为2;如果操作数为int、uint或float,结果为4;如果操作数为long、ulong或double,结果为8。对于n不为3的矢量数据,结果为n*矢量分量大小。而n为3的矢量数据,为了满足对齐要求,结果为4*矢量分量大小。
一元运算符(*
)指向一个对象,则结果为指向该对象的左值。如果操作数指向“某个类型的指针”,则结果为该类型。
一元运算符(&
)返回操作数的地址。