2017-01-08 3 views
0

私の研究から、私はRenderScriptの内部からメモリを割り当てることができないことを発見しました。たとえば、int* values = new int[10];はC99では使用できません。この配列をローカルに処理している現在のピクセルだけにしたいと思います。そのような動的割り当ては、カーネル関数内から宣言されインスタンス化されている場合に保証します。RenderScriptでローカル/プライベートアレイを宣言するにはどうすればいいですか?

私はint values[10];が有効な宣言であることを知っています。 RenderScriptの先頭に置くと、グローバル配列になります(Allocationを使用して)Javaコードから設定することができます。

int values[10];をカーネル内部に入れてみましたが、これは現在のピクセルのローカルなものと仮定しました。私は、単一値の変数(uint32_t、float4など)を宣言することは、現在のピクセルに対して確実にローカルであることを知っています。しかし、カーネル内で宣言された配列はまだグローバル変数です。他のすべてのピクセルは読み書きできます。

uchar4 RS_KERNEL mykernel(uchar4 in, uint32_t x, uint32_t y){ 
    int* values = (int*)malloc(sizeof(int)*256); // illegal 
    int* values2 = new int[256]; // illegal 
    int values3[256]; // legal, but it's global. I want a local array 
} 

疑問に思っている場合は、現在のピクセル(x、y)から隣接するピクセルにアクセスしたいと思います。私はそれを引き出すことができました。しかし、最も頻繁に発生する色成分、その配列がソートされた後の正確な中間成分などを選ぶ必要があるかもしれないので、いくつかのピクセル情報(それらの隣接するピクセルの色成分の1つのような)を配列に格納する必要があります。それで、私はモードフィルターとメジアンフィルター、さらには油絵効果を引き出そうとしています。そのすべてがローカルのピクセルデータをローカルアレイに格納する必要があります。

したがって、現在処理中のピクセルだけが触れることができるローカル/プライベートアレイをRenderScriptでどのように宣言できますか?それが不可能な場合、単一値の変数だけでタスクを必要とするローカル配列をどのようにシミュレートしますか?


更新

上記int values3[256];は確かに現在のスレッドに対してローカルです。私たちが望まないごみ箱の値が入っているかもしれません。私は、各インデックスの値がデフォルトで0であると仮定しました。いくつかはありません。だからこそ私は他のスレッドがすべてそれに書いていると思った。私は上記のことを集計にしようと考えていたので、いつも期待通り0で始まったわけではありませんでした。それが私の計算がオフになった理由です!

答えて

1

しかし、カーネル内で宣言された配列はまだグローバル変数です。他のすべてのピクセルは読み書きできます。

いいえ、間違っています。あなたの例ではvalues3が正しいです、そして、それは各スレッドにローカルです。

+0

私はあなたが正しいと思います。私のデバッグは他のスレッドから情報を収集したようだった。後でコードと結果を掲載します。 –

関連する問題