17.3. その他の関数

Note

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

17.3.1. printf関数

Note

詳細は「表:printf関数」(Table 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