转化函数的格式
destType convert_destType<_sat>
destTypen convert_destTypen<_sat>
notice :
- 不支持bool, half, size_t, ptrdiff_t, intptr_t, uintptr_t, and void类型的转换。
- 源和目的向量元素的个数要相同。
支持的数据类型:
char, uchar, short, ushort, int, uint, long, ulong, float, 以及内置的向量类型。默认的float转为整数使用的是_rtz,即舍去小数位。
round 模式
opencl中的round模式使用来将浮点转化为定点的操作,遵循IEEE754的round规则。
_rte:将小数位是5的转化为最靠近的偶数,其他情况按照四舍五入。例如convert_ushort(4.5) -> 4, convert_ushort(3.5) -> 4, convert_ushort(4.51) -> 5,
_rtz:向零转化。例如convert_ushort(4.5) -> 4
_rtp:向正无穷转化。例如convert_ushort(4.1) -> 5,同ceil函数。
_rtn:向负无穷转化。例如convert_ushort(4.9) -> 4,同floor函数。
默认情况下浮点转化为整数使用_rtz
例如下面两种转化都默认包含_rtz的使用。
int4 i = convert_int4( f );
int4 i2 = convert_int4_sat( f );
默认情况下整数转化为浮点数使用的是_rte
饱和转化
_sat将会把输入数据卡在目的数范围内(nan 将会转化为0),一般很少用于转化为浮点数的操作。
当没有指定_sat时将会使用截断的方式来赋值。
例如convert_ushort(65537.33f)的结果是1。可以将其看作是进行两步计算,
- 先把65537.33f按照__ctz转化为正整数65537,
- 然后将65537按照truncate的方式转化为ushort类型,结果就是1了。
EXAMPLE
小范围转化为大范围uchar4-> int4
uchar4 u;
int4 c = convert_int4(u);
浮点转化为定点float -> int
float f;
int i = convert_int(f);
有符转化为无符号short4 -> ushort4 , 大范围转化为小范围short4 -> char4
short4 s;
// negative values clamped to 0
ushort4 u = convert_ushort4_sat( s );
// values > CHAR_MAX converted to CHAR_MAX
// values < CHAR_MIN converted to CHAR_MIN
char4 c = convert_char4_sat( s );
浮点向定点的转化
float4 f;
// 使用_rtz 和截断操作
int4 i = convert_int4( f );
// 使用_rtz和饱和操作
// values > INT_MAX clamp to INT_MAX, values < INT_MIN clamp
// to INT_MIN. NaN should produce 0.
// The _rtz rounding mode is
// used to produce the integer values.
int4 i2 = convert_int4_sat( f );
// 使用_rte和截断操作
int4 i3 = convert_int4_rte( f );
// 使用_rte和饱和操作
// similar to convert_int4_sat, except that
// floating-point values are rounded to the
// nearest integer instead of truncated
int4 i4 = convert_int4_sat_rte( f );
定点转化为浮点
int4 i;
// convert ints to floats using the default rounding mode. ???
float4 f = convert_float4( i );
// convert ints to floats. integer values that cannot
// be exactly represented as floats should round up to the
// next representable float.
float4 f = convert_float4_rtp( i );
浮点数转定点的c代码
1. _rte (round to even)
表示向偶数转化。对应的c版描述如下:
inline int convert_int_rte (float number)
{
int sign = (int)((number > 0) - (number < 0)); // (number > 0) -> 1, (number < 0) -> -1
int odd = ((int)number % 2); // odd -> 1, even -> 0
return ((int)(number-sign*(0.5f-odd)));
}
2. _rtz (round to zero)
表示向零靠近转化,即舍去小数位数。对应的c描述如下:
inline int convert_int_rtz (float number)
{
return ((int)(number));
}
3. _rtp (round to positive infinity)
表示向正无穷方向变化。对应的c描述如下:
inline int convert_int_rtp (float number)
{
return ((int)ceil(number));
}
4. _rtn (round to negative infinity)
表示向负无穷转化。对应的c的描述如下:
inline int convert_int_rtp (float number)
{
return ((int)floor(number));
}