10.3. その他の関数

注記

詳細は「表:その他の関数」(表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が範囲外のときの戻り値は未定義です。

10.3.1. printf関数

注記

詳細は「表: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