2017-08-07 8 views
1

Iは、以下の出力の大き有する3つのハライド機能を有する:
40×40×64
40×40×128
40×40×64複数ハライド機能を組み合わせることが、同じ寸法を維持

Iをそれらを1つの関数に結合して、後で使用するための関数ハンドルを取得したいと考えています。だからここのために、結果の関数は、私がHalide::selectを使用しています

40×40×256

の大きさを持つべきであるが、それは4次元

concat(x,y,z,c)=Halide::select(c == 0, func_1(x, y, z), c == 1, func_2(x, y, z), func_3(x, y, z)); 

になりマージを生成する方法はあります3D機能?

答えて

0

Funcの代わりにPipelineオブジェクトを返すことができます。パイプラインは、複数の出力パラメータを持つ関数にコンパイルされます。複数の出力パラメータは、異なる形状のバッファにすることができます。

concat(x, y, z) = 
    Halide::select(z < 64, func_1(x, y, clamp(z, 0, 63)), 
       z < 192, func_2(x, y, clamp(z - 64, 0, 127)), 
       func_3(x, y, clamp(z - 192, 0, 63))); 
:あなたは、単一のFuncをしたいです場合

、あなたが何かのようにしたいです

0

Tupleを使用できます。 Tupleのメンバーは同じサイズでなければならないため、3次元のサイズが異なると少し複雑です。この複雑さは、4dソリューションにも存在します。

result(x, y, z) = Tuple 
    (func_1(x, y, z) 
    , func_2(x, y, z * 2 + 0) // Even z 
    , func_2(x, y, z * 2 + 1) // Odd z 
    , func_3(x, y, z) 
    ); 

スケジュールにunroll(c)を追加し、4Dソリューションを維持し、3(現在は4)の機能は、最も内側のループ内で順番に評価されます。

3つの機能を3次元で連結するのではなく、別の次元を追加するかTupleを使用する方がよい方法です。

編集unroll(c)のほかに、あなたはループの順序を変更するreorder(c,x,y,z)が必要になります。

関連する問題