明示的型変換もOpenCLはサポートしますが、ベクトル型はサポート外です。例えば以下のキャストは不正です。
float4 num; int4 i = (int4) num; //(1)
不正なベクトル型キャスト。 |
例外としては、スカラ型をベクトル型にキャストする場合です。
int x = 10; int4 i = (int4) x; //(1)
有効なキャスト。 |
この例では、(10,10,10,10)として正常に(スカラ型からベクトル型へ)キャストが行なわれます。
ベクトルのキャストを行なう場合は、convert変換関数を使うことができます。
定義.
destType convert_destType<_sat><_roundingMode> (sourceType)
定義の中の <> で囲まれた箇所はオプションなので除外できます。一番シンプルな例は、オプションを使わない場合です。 <_sat> は演算結果の飽和を指定、 <_roundingMode> は丸めモードの指定します。
uint4 num = (uint4)(...); int4 y = convert_int4(num); //(1)
符号無し整数に変換しています。 |
uint4 num = (uint4)(...); int4 y = convert_int4_sat(num); //(1)
符号無し整数に変換し、値が溢れる場合は結果を飽和させます。 |
uint4 num = (uint4)(...); int4 y = convert_int4_sat_rtz(num); //(1)
0への丸めモードで符号無し整数に変換します。値が溢れる場合は結果を飽和させます。 |
次に簡単な例を見てみましょう。
サンプル.
float x = 12345.12345f; uint y = convert_uint(x); printf("convert_uint: %u\n",y); float2 x_v2 = (float2)(1.234f, 4.9f); uint2 y_v2 = convert_uint2(x_v2); printf("convert_uint2: %#v2u\n", y_v2); float4 x_v4 = (float4)(1.234f, FLT_MIN, MAXFLOAT, -MAXFLOAT); //(1) int4 y_v4_sat = convert_int4_sat(x_v4); printf("convert_int4_sat: %#v4d\n", y_v4_sat); int4 y_v4_sat_rtz = convert_int4_sat_rtz(x_v4); printf("convert_int4_sat_rtz: %#v4d\n", y_v4_sat_rtz); int4 y_v4_sat_rtp = convert_int4_sat_rtp(x_v4); printf("convert_int4_sat_rtp: %#v4d\n", y_v4_sat_rtp);
FLT_MINは「0x1.0p-126f」、MAXFLOATはfloatが取れる有限の最大値です。 |
出力.
convert_uint: 12345 convert_uint2: 1,4 convert_int4_sat: 1,0,2147483647,-2147483648 convert_int4_sat_rtz: 1,0,2147483647,-2147483648 convert_int4_sat_rtp: 2,1,2147483647,-2147483648 komatsumasaki-no-Mac-mini:build komatsu$
変換関数は数学的直感として理解するものなので、細かくは説明はしません。この例では、飽和によりint型の最大、最小値に、float型の最大、最小値が変換されていることが分かるかと思います。
丸めモードはrtz(0への丸め)がデフォルト設定です。
丸めモードについては、「表:丸めモード」(???) を参照ください。
Copyright 2018-2019, by Masaki Komatsu