在例如密码破解、生物信息学领域,处理的数据大部分是整数数据。在OpenCL中也提供了很多针对整数处理的函数,详细见下表。在开始介绍这些函数之前,我们对表格中的数据类型做一些约定:使用通用类型名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};使用通用类型名ugentype来表示gentype的无符号版本;使用通用类型名sgentype来表示一个标量数据。
对于执行整数操作,我们首先会想到的是如果计算结果所需空间大于存放结果的变量空间限制,这种情况称为溢出。对于有些设备,会有专门的标志位来记录溢出情况,但是在OpenCL中没有此标志位。例如,我们把两个有符号int整数相加,结果可能会超出int最大值使得结果为负值,溢出位使得结果为负值。
add_sat()和sub_sat()函数可以接受结果溢出,它们会把结果设置为能表示的最大值。例如,对于32位int,最大值为0x7FFFFFFF。
例 如,假 设x,y,z都 是int类 型 数 据,其 中x=0x78888888,y=0x11111111,z=-0x21111111。(x+y)实际的值为0x89999999,(x-z)实际的值为0x99999999。但是对于add_sat(x,y)=0x7FFFFFFF,sub_sat(x,z)=0x7FFFFFFF。这就是因为实际的值超出了32位int所能表示的最大值,产生溢出情况,函数会把结果设置为最大值。
对于乘法操作,mul24()利用低24位来计算乘法,这加快了计算速度,返回的结果是32位。例如:
int x = 0x00711111;
int y = 0x00722222;
int c = mul24(x, y);
int d = mul_hi(x, y)
计算出来的c值为0xACDA8642,但是实际真实结果是0x3268ACDA8642。所以在我们使用mul24()函数来加快计算速度时,需要注意输入参数有效位要小于24位,计算出来的结果有效位同时要小于32位。
如果最终结果超过32位,那我们该如何处理呢?我们先看d值计算结果为0x3268, mul_hi()函数返回值是返回乘积结果的乘积的高位半值,也就是返回超出有效表示位之外的结果。上述例子也给了我们一点启示,那就是对于乘法操作,我们要获得一个全部的乘积,可以使用mul_hi()函数,并结合乘法操作。高位值通过mul_hi()函数获得,有效范围内的值通过乘法直接获得。