詳細は「表:その他の関数」(表B.114「表:その他の関数」)を参照ください。
この項目では頻繁に使うことは無いが、あると便利な関数をご案内します。
gentype clamp ( gentype x, gentype minval, gentype maxval)
min(max(x, minval), maxval) を計算します。結果は minval > maxval のときに未定義です。
gentype radians ( gentype degrees)
度をラジアンに変換します。 (π / 180) * degrees を計算します。
gentype step ( gentype edge, gentype x)
x < edge のときに、0.0、それ以外のときに、1.0を返します。
gentype smoothstep ( gentype edge0, gentype edge1, gentype x)
x <= edge0 のときは、0.0、 x >= edge1 のときは、1.0を返します。 edge0 < x < edge1 のときは0と1の間でエルミート補間をします。スムースに遷移してくれる閾関数が必要な時に使います。
gentype sign (gentype x)
x > 0 のときは、1.0、 x = -0.0 のときは、-0.0、 x = +0.0 のときは、+0.0、 x < 0 のときは、-1.0を返します。xがNaNのときは、0.0を返します。
gentype mix ( gentype x, gentype y, gentype a)
xとyの線形ブレンドをします。 x + (y – x) * a の計算をします。 aは[0.0, 1.0]の範囲内とします。aが範囲外のときの戻り値は未定義です。
詳細は「表:printf関数」(表B.115「表:printf関数」)を参照ください。
OpenCL-Cのprintf関数はC言語のものと概ね類似しています。printf関数はコマンドをキューに挿入しているため実際に実行されるタイミングはキューがスケジューリングしますが、clFinishを呼び出すことで即座に標準出力されます。
通常のC言語のprintfと異なる仕様としては1点抑えておきたいことがあります。例えば以下の関数を見てください。
サンプル.
float4 f4 = (float4)(1.5f, 2.5f, 3.5f, 4.5f); printf("f4 = %2.4v4hlf\n", f4); printf("f4 = %2.4v4hle\n", f4); printf("f4 = %2.4v4hla\n", f4);
出力.
f4 = 1.5000,2.5000,3.5000,4.5000 f4 = 1.5000e+00,2.5000e+00,3.5000e+00,4.5000e+00 f4 = 0x1.8000p+0,0x1.4000p+1,0x1.c000p+1,0x1.2000p+2
サンプルを見ると、%で始まる表現の中に v4 という文字列があります。これは4つの要素を持つベクトル型の出力を指定しています。個別の型は、 f 、 e 、 a で指定します。hlは出力の長さを指定する修飾子です。ベクトル型では、 hh 、 h 、 hl があります。
次に16進数の出力で頭に 0x を付加させたい場合は、 # を % の次に指定します。
uchar2 uc2 = (uchar2)(0xaa, 0xba); printf("uc2 = %#v2hhx\n", uc2); printf("uc2 = %#v2hx\n", uc2); printf("uc2 = %#v2lx\n", uc2); printf("uc2 = %#v2x\n", uc2);
出力.
uc2 = 0xaa,0xba uc2 = 0xaa,0xba uc2 = 0xaa,0xba uc2 = 0xaa,0xba
出力を見て頂くと、全て同じです。これは0xaaの長さが、最低の長さ( hh )の範囲でカバーされているためです。
文字列の出力は以下のようにC言語と何も変わりありません。
printf("%s\n", "helloworld"); constant char *hello = "helloworld"; printf("%s\n", hello);
出力.
helloworld helloworld
最後にベクトルに設定する値を上げることで、長さの修飾子( hh 、 h 、 hl )によって出力が異なることを示します。
uint2 ui = (uint2)(0x12345678, 0x87654321); printf("unsigned char value = %#v2hhx\n", ui); printf("unsigned short value = %#v2hx\n", ui); printf("unsigned long value = %#v2hlx\n", ui); printf("unsigned long value = %#v2x\n", ui);
出力.
unsigned char value = 0x78,0x21 unsigned short value = 0x5678,0x4321 unsigned long value = 0x12345678,0x87654321 unsigned long value = 0x12345678,0x87654321
出力を見て頂くと( hh 、 h 、 hl )の作用が理解できるものと思います。
Copyright 2018-2019, by Masaki Komatsu