OpenCL C提供了一些内建的关系函数,通过这些关系函数,我们可以判断两个标量或矢量间的大小关系;我们也可以判断输入的参数变量是否为无限值、是否为有限值等操作。
在开始讲解这些关系函数之前,我们对表格中的数据类型做一些约定:用通用类型名gentype指示这些数学函数参数可以取uchar、char{2|3|4|8|16}、ushort、short{2|3|4|8|16}、uint,int{2|3|4|8|16}、ulong、long{2|3|4|8|16}、f loat、f loat{2|3|4|8|16}、double和double{2|3|4|8|16}。通用类型igentype表示的数据类型为:uchar、char{2|3|4|8|16}、ushort、short{2|3|4|8|16}、uint、int{2|3|4|8|16}、ulong、long{2|3|4|8|16}。通用类型igentype表示的数 据 类 型 为:uchar、uchar{2|3|4|8|16}、ushort、ushort{2|3|4|8|16}、uint、uint{2|3|4|8|16}、ulong、ulong{2|3|4|8|16}。
上述关系函数,通过表格中的描述很容易知道其作用。这里只把bitselect()函数作用列举一个例子。
在笔者碰到的OpenCL设备中,曾经遇到某个厂家的OpenCL设备在计算MD5中的如下处理时:
#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
clBuildProgram()函数采用默认的编译选项,计算出来的结果是错误的。而如果clBuildProgram()函数采用“-cl-opt-disable”编译选项时,结果是正确的。OpenCL编译器在优化上述代码过程中出错了!上述操作是MD5计算中的关键步骤,从编程角度没办法通过其他编程方式实现。庆幸的是,在OpenCL中提供了bitselect()函数,通过该函数可以实现上述功能。采用bitselect()函数代码如下:
#define F(x,y,z) bitselect(z,y,x)
对于bitselect()函数,计算示意图如下图所示:
而对于select()函数,计算示意图如下图所示: