オンデバイス GPU opencl キャスト オペレーター

tflite ではキャストがサポートされていない状況がよく発生しますが、これは主に opencl でのキャストのサポートが不十分であることが原因です。

Opencl はパック データ型の直接キャストをサポートしていませんが、要素ごとにのみキャストできます。たとえば、次のようにキャストすることはできません。

int4 src = in[0];
half4 dst = src;

でもできる

int4 src = in[0];
half4 dst;
dst.s0=src.s0;
dst.s1=src.s1;
dst.s2=src.s2;
dst.s3=src.s3;

また、それでも直接変換できないデータ型も多く、例えばlongやboolなどはhalfに直接キャストできず、他のデータ型を元に変換する必要があります。一部の opencl コンパイラは、転送キャストで float などの共通データ型の使用をサポートしていますが、転送に複数のデータ型を使用する必要があるものもあります。

ここでの私の解決策は、src データ型と dst データ型にそれぞれ中間データ型を導入することです。まず、bool、char、long などの整数型のコンテンツを含む中間データ型マッピング マップを作成します。は int で、半分は float です。double 浮動小数点データ型は、中間データ型として float を使用します。

次に、vector<dtype> を作成し、src_dtype、src_mid_dtype、dst_mid_dtype、dst_dtype の 4 つの要素を格納します。次に、冗長な変換を避けるために、この配列の隣接する同一の要素を削除します。

このベクトルに従って、文字列に基づいて自動コード生成中間変換の変数および代入処理が動作します。

おすすめ

転載: blog.csdn.net/u013701860/article/details/128417525