17.10. OpenCL-Cイメージ処理関数

OpenCL-C言語の引数として、イメージオブジェクトを設定する場合にはイメージデータを表すデータ型を用いられます。例えば以下2つのようなものがあります。

2dは2次元、3dは3次元を示します。このデータ型にたいして読み込みと書き込みの関数をOpenCL-Cは用意しています。最も使われるのは単精度浮動小数点データの読み書きを行える以下2つの関数があります。

read_imagefが読み込みで、write_imagefが書き込み機能を担います。この関数はイメージデータをサンプリングするためのサンプラーパラメーターと、座標値を指定して要素ルックアップを行います。

Important

イメージ関数の数やチャンネルデータタイプ等、情報が多いので読者は混乱するかもしれませんが、画像の型式、エンコードは決めうちで行なうか、前処理を行なって統一しておく事が一般的です。それにイメージ処理は、各イメージ形式ごとに1つの本が書けるほど深みのある専門分野なので、本書ではPNGファイル、RGBAチャンネルに限定した解説を行います。

17.10.1. 正規化整数チャンネルデータ型の活用による浮動小数点変換

以下の項目で解説するイメージ読み込み・書き込み関数はイメージオブジェクトの要素ルックアップを行います。

しかしイメージ処理関数の解説をする前に、チャンネルデータの型に正規化数があることを読者には知ってもらいたいと思います。

通常、画素の定義をする際は、RGBからなる3つの画素、またはRGBA(Aはアルファチャンネル、透過度を指定)からなる4つの画素に、`0…255`の整数値を指定します。

しかしオンラインアルゴリズムによっては、浮動小数点に正規化したものの方が都合が良い場合があります。その場合、浮動小数点に都度変換するより、チャンネルデータタイプを正規化を0.0f...1.0f`または-1.0f…1.0f`の範囲の正規化浮動小数点値に指定した方が効率的です。つまり読み込みの段階で浮動小数点変換型に変換するので、操作を一つ減らせます。

符号無し

符号無しのチャンネルデータ型には以下のものがあります。

CL_UNORM_INT8
(8ビット符号無し整数)

値cに対して、`正規化浮動小数点値 = (float)c / 255.0f`の処理がされた値を読み込み(書き込み)ます。

CL_UNORM_INT_101010
(10ビット符号無し整数)

値cに対して、`正規化浮動小数点値 = (float)c / 1023.0f`の処理がされた値を読み込み(書き込み)ます。

CL_UNORM_INT16
(16ビット符号無し整数)

値cに対して、`正規化浮動小数点値 = (float)c / 65535.0f`の処理がされた値を読み込み(書き込み)ます。

符号付き

CL_SNORM_INT8
(8ビット符号付き整数)

値cに対して、`正規化浮動小数点値 = max(-1.0f, (float)c / 127.0f)`の処理がされた値を読み込み(書き込み)ます。

CL_SNORM_INT16
(16ビット符号付き整数)

値cに対して、`正規化浮動小数点値 = max(-1.0f, (float)c / 32767.0f)`の処理がされた値を読み込み(書き込み)ます。

17.10.2. サンプラー

Note

詳しくは「表:サンプラの状態」(Table B.124, “表:サンプラの状態”)を参照ください。

サンプラーはイメージ処理時の属性を定義します。以下が指定可能な属性です。

  1. 座標の正規が非正規されるかの指定
  2. アドレスモードの指定
  3. フィルターモードの指定

座標の正規化の有無については、以下の2つの値があります。

  • CLK_NORMALIZED_COORDS_TRUE
  • CLK_NORMALIZED_COORDS_FALSE

アドレスモードは以下の内いずれかの値をとります。

  • CLK_ADDRESS_MIRRORED_REPEAT
  • CLK_ADDRESS_REPEAT
  • CLK_ADDRESS_CLAMP_TO_EDGE
  • CLK_ADDRESS_CLAMP
  • CLK_ADDRESS_NONE

フィルタモードは以下の2つの値があります。

  • CLK_FILTER_NEAREST
  • CLK_FILTER_LINEAR

17.10.3. イメージ読み込み・書き込み関数

Note

詳しくは「表:イメージ読み込み関数」(Table B.125, “表:イメージ読み込み・書き込み関数”)を参照ください。

イメージ読み込み関数は座標(coord.x, coord.y)を使い2次元イメージオブジェクトの要素ルックアップをします。

float4 read_imagef (
    image2d_t image,
    sampler_t sampler,
    int2 coord)
float4 read_imagef (
    image2d_t image,
    sampler_t sampler,
    float2 coord)

image2d_tには以下のような制約と、戻り値の規則があります。

image_channel_data_typeがCL_UNORM_INT8かCL_UNORM_INT16のいずれかに指定されて生成されたイメージオブジェクトにおいて、`[0.0 … 1.0]`の範囲の浮動小数点の値を返します。

image_channel_data_typeがCL_SNORM_INT8かCL_SNORM_INT16のいずれかに指定されて生成されたイメージオブジェクトにおいて、`[-1.0 … 1.0]`の範囲の浮動小数点の値を返します。

image_channel_data_typeがCL_HALF_FLOATかCL_FLOATのいずれかに指定されて生成されたイメージオブジェクトにおいて、浮動小数点の値を返します。

整数の座標を扱う呼び出しでは、フィルターモードがCLK_FILTER_NEAREST、座標モードはCLK_NORMALIZED_COORDS_FALSE、アドレスモードはCLK_ADDRESS_CLAMP_TO_EDGE, CLK_ADDRESS_CLAMP、 CLK_ADDRESS_NONEのいずれかに指定している必要があります。

以下は整数型で返すイメージ読み込み関数の定義です。

int4 read_imagei (
    image2d_t image,
    sampler_t sampler,
    int2 coord)
int4 read_imagei (
    image2d_t image,
    sampler_t sampler,
    float2 coord)
uint4 read_imageui (
    image2d_t image,
    sampler_t sampler,
    int2 coord)
uint4 read_imageui (
    image2d_t image,
    sampler_t sampler,
    float2 coord)

Copyright 2018-2019, by Masaki Komatsu