opencl 的显示类型转换

转化函数的格式

destType convert_destType<_sat> (sourceType)
destTypen convert_destTypen<_sat> (sourceType)

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规则。

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));
}

你可能感兴趣的:(opencl 的显示类型转换)