2017-05-21 16 views
1

以下のサンプルコード(ルックアップテーブルに似ています)を実行しようとすると、常に次のエラーメッセージが生成されます。次元0の無限の方法で '色'。LUTに制限があります:無制限の次元で

RDom r(0, 10, 0, 10); 
Func label, color, out; 
Var x,y,c; 

label(x,y) = 0; 
label(r.x,r.y) = 1; 

color(c) = 0; 
color(label(r.x,r.y)) = 255; 

out(x,y) = color(label(x,y)); 

out.realize(10,10); 

実現する前に、以下のように、静的にバインドを成功させずに静的に設定しようとしました。

color.bound(c,0,10); 
label.bound(x,0,10).bound(y,0,10); 
out.bound(x,0,10).bound(y,0,10); 

ヒストグラムの例も見ましたが、少し異なります。

これはHalideの制限ですか?

答えて

1

ハライドは、Funcへの引数として渡す値の範囲を分析することによって、範囲外のアクセスを防ぎます(また、何を計算するかを決定します)。これらの値に制限がない場合、それはできません。彼らは有界作るための方法は、クランプである。この場合、

out(x, y) = color(clamp(label(x, y), 0, 9)); 

、それは無制限だ理由は、ラベルは、分析をあきらめます更新定義を、持っていることです。代わりにこのようなラベルを書いた場合:

label(x, y) = select(x >= 0 && x < 10 && y >= 0 && y < 10, 1, 0); 

次にクランプは必要ありません。

+0

'value_bound_promise(Expr val、Expr min、Expr max)'と 'EnforcePromises'および/または' AssertPromises'ターゲット機能があることを望みます。このようにして、生成されたコードは 'clamp'や' select'を必要としません。 –

関連する問題