はじめに
EVIS(Enhanced Vision Instruction Set)は、APIレベルのプログラム言語であり、GC7000XSVX(i.MX8QM)およびVIP8000NanoSi(i.MX8MP)に適用できます。この説明書は、ビジョン対応ハードウェアの強化されたビジョン機能を低遅延で活用しています。これは、Khronos Group OpenVX API を通じて提供される機能を超えたビジョン画像処理のための追加機能を提供します。i.MX8QM/i.MX8MP BSP では、OpenCL コンパイラは EVIS 命令もサポートしています。つまり、OpenCL VX Extension APIでもあるのです。
ソースファイルは /usr/include/CL/cl_viv_vx_ext.h にあります。
ハードウェア要件
i.MX8QM(GC7000XSVX)はEVIS1をサポートしています。
i.MX8MP(VIP8000NanoSi)はEVIS2に対応しています。
パックされたデータ型
命令の計算能力を十分に活用するために、拡張 API はパックされたデータ型をサポートしています。たとえば、標準のOpenCLでは、ベクトルchar4は4x32ビットレジスタを占有しますが、パックされたchar16は128ビットしか占有しません。したがって、可能な限りパックされたデータ型を使用してください。
char、unsigned char、short、unsigned short、integer、unsigned integer、 float パック・データ・タイプがサポートされています。これらは、プレフィックス vxc_ 、つまり vxc_char、vxc_uchar、vxc_short、vxc_ushort、vxc_int、vxc_uint、vxc_float で定義され、その後にパックされたデータ内の要素の数を定義するリテラル値 n が続きます。サポートされている n の値は、すべての packed data 型で 2、4、8、および 16 です。
表 1 パックされたデータ型のリスト
| 種類 | 形容 |
|---|---|
| vxc_charn | n 個のパックされた符号付き文字 値のベクトル |
| vxc_ucharn | n 個のパックされた符号なし 文字 値のベクトル |
| vxc_shortn | n 個の packed signed short value のベクトル |
| vxc_ushortn | n 個のパックされた符号なしショート値のベクトル |
| vxc_intn | n 個のパックされた符号付き整数値のベクトル |
| vxc_uintn | n 個のパックされた符号なし整数値のベクトル |
| vxc_floatn | n 個のパックされた float value のベクトル |
OP_CODE 手順
OP_CODE命令は、パックされたデータに対して動作します。列挙型は /usr/include/CL/cl_viv_vx_ext.h にあります。
EVIS1のみが命令をサポートしています。
VXC_IAdd
VXC_MagPhase
VXC_BiLinear
VXC_SelectAdd
VXC_BitReplace
VXC_Filter
VXC_DP2x16_b VXC_DP2x16
パック型イメージデータ読み取り/書き込み:対応タイプはパック8ビット/16ビット整数、16ビット浮動小数点です。image1d_t/image1d_array/image2d_t のイメージの読み取り/書き込み。オフセットは、VXC_5BITOFFSET_XY(x, y) を使用して構成する必要があります。
VXC_OP4(img_load、宛先、画像、座標、オフセット、情報)
VXC_OP4_NoDest(img_store、画像、座標、カラー、情報)
パラメーター:
img_load/img_store 画像データの読み取り/書き込み。
Dest データをロードする宛先。
画像 img_load用に読み込んだパックされた画像データ。img_storeに書き込むパックされた画像データ。
画像データの読み取り/書き込みを行うための座標座標。
Color Image for img_storeに書き込まれる画像データ。
詳細情報 VXC_MODIFIER (StartBin、EndBin、SourceBin、RoundingMode、Clamp) で詳細を参照してください。
VXC_MODIFIER(StartBin, EndBin, SourceBin, RoundingMode, Clamp)
パラメーター:
StartBin/EndBin 連続してパックされたデータの最初のビン/最後のビン。
SourceBin 未使用。
RoundingMode 0: Toward Zero (切り捨て)、 1: Toward Infinity (切り上げ)、 2: To Nearest Even、 3: 使用されません。
クランプ 0: いいえ、結果は結果タイプに合わせて切り捨てられます (下位ビットのみがコピーされます)、 1: はい、結果は結果タイプに合わせてクランプされます。
例えば
int2 coord = (int2)(get_global_id(0), get_global_id(1));
vxc_uchar16 r1;
VXC_OP4(img_load, r1, in_image, coord, 0, VXC_MODIFIER(0, 15, 0, VXC_RM_TowardZero, 0));
このインターフェイスは、指定されたフィルターを 3x3 ピクセル ブロックに適用します。
VXC_OP4(フィルタ、宛先、Src0、Src1、Src2、情報)
パラメーター:
フィルター フィルター モード。
Dest フィルタリングされた画像。
Src0 3x3 フィルターの最初の行のピクセル。
Src1 3x3 フィルターの 2 行目のピクセル。
Src2 3x3 フィルターの 3 行目のピクセル。
情報 VXC_MODIFIER_FILTER(StartBin、EndBin、SourceBin、Filter、Clamp)で詳細情報を参照してください。
VXC_MODIFIER_FILTER(StartBin, EndBin, SourceBin, Filter, Clamp)
パラメーター:
StartBin/EndBin 連続してパックされたデータの最初のビン/最後のビン。
SourceBin 未使用。
フィルター フィルター モードを表 2 に示します。
クランプ 0: いいえ、結果は結果タイプに合わせて切り捨てられます (下位ビットのみがコピーされます)、 1: はい、結果は結果タイプに合わせてクランプされます。
テーブル2.フィルターモードのリスト:
| フィルターモード | 形容 |
|---|---|
| VXC_FM_BOX | 3x3 ボックス フィルターを計算します。 |1/9、1/9、1/9、1/9、1/9、1/9、1/9、1/9、1/9|。 |
| VXC_FM_Guassian | 3x3 ガウス フィルターを計算します。 |1/16、2/16、1/16、2/16、4/16、2/16、1/16、1/16、1/16|。 |
| VXC_FM_SobelX | 3x3 Sobel フィルターを x 方向に計算します。 |-1, 0, 1, -2, 0, 2, -1, 0, 1|. |
| VXC_FM_SobelY | 3x3 Sobel フィルターを y 方向に計算します。 |-1、-2、-1、0、0、0、1、2、1|。 |
| VXC_FM_ScharrX | x 方向の 3x3 Scharr フィルターを計算します。 |3, 0, -3, 10, 0, -10, 3, 0, -3|. |
| VXC_FM_ScharrY | 3x3 Scharr フィルターを y 方向に計算します。 |3, 10, 3, 0, 0, 0, -3, -10, -3|. |
| VXC_FM_Max | 3x3カーネルを最大限に活用します。 |
| VXC_FM_Min | 3x3カーネルから最小値を取得します。 |
| VXC_FM_Median | 3x3カーネルから中央値を取得します。 |
たとえば( 詳細はガウスフィルタの例を参照)、
int2 coord_in1 = 座標 + (int2)(-1, -1);\n\
VXC_OP4(img_load, lineA, in_image, coord_in1, 0, VXC_MODIFIER(0, 15, 0, VXC_RM_TowardZero, 0));\n\
int2 coord_in2 = 座標 + (int2)(-1, 0);\n\
VXC_OP4(img_load, lineB, in_image, coord_in2, 0, VXC_MODIFIER(0, 15, 0, VXC_RM_TowardZero, 0));\n\
int2 coord_in3 = 座標 + (int2)(-1, 1);\n\
VXC_OP4(img_load, lineC, in_image, coord_in3, 0, VXC_MODIFIER(0, 15, 0, VXC_RM_TowardZero, 0));\n\
int info = VXC_MODIFIER_FILTER(0, 13, 0, VXC_FM_Guassian, 0);\n\
VXC_OP4(フィルター、出力、行A、行B、行C、情報);;\n\
a と b の絶対差の結果を計算します。パックされたデータで動作するため、16 x 8 ビット値または 8 x 16 ビット値を計算できます。
VXC_OP3(abs_diff, Dest, Src0, Src1, 情報)
パラメーター:
abs_diff 絶対差の関数を指定します。
Dest Destinationは結果を保存します。
Src0 絶対差を計算する最初のソース。
Src1 絶対差を計算する 2 番目のソース。
詳細情報 VXC_MODIFIER (StartBin、EndBin、SourceBin、RoundingMode、Clamp) で詳細を参照してください。
また、ここでは指定しない他のインターフェースもあり、それは /usr/include/CL/cl_viv_vx_ext.h にあります。つまり、VXC_IAdd、VXC_IAccSq、VXC_Lerp、VXC_MagPhase、VXC_MulShift、VXC_Clamp、VXC_BiLinear、VXC_SelectAdd、VXC_AtomicAdd、VXC_BitExtract、VXC_BitReplace。
参考文献:
有用,请问大神OpenVX Vision Image Extension API Introduction - DP Dot Products这个链接怎么进不去呢!