2017-03-28 12 views
0

次のコードの最適化に関するアドバイスはありますか?コードは最初にグレースケール化し、反転させて、画像にスレッショルドを付けます(コードは含まれていません)。次に、各行と列の要素を合計します(すべての要素は1または0です)。次に、最も高い値を持つ行と列の行と列のインデックスが検索されます。行セルと列セルのレンダスクリプトの総和の最適化

コードは、画像の重心を見つけることになって、それが動作しますが、私はそれがより速く

私はAPI 23開発していますので、削減のカーネルを使用することができないようにしたいです。

Javaは、スニペット:

private int[] sumValueY = new int[640]; 
private int[] sumValueX = new int[480]; 

rows_indices_alloc = Allocation.createSized(rs, Element.I32(rs), height, Allocation.USAGE_SCRIPT); 
col_indices_alloc = Allocation.createSized(rs, Element.I32(rs), width, Allocation.USAGE_SCRIPT); 

public RenderscriptProcessor(RenderScript rs, int width, int height) 
{ 
    mScript.set_gIn(mIntermAllocation); 

    mScript.forEach_detectX(rows_indices_alloc); 
    mScript.forEach_detectY(col_indices_alloc); 

    rows_indices_alloc.copyTo(sumValueX); 
    col_indices_alloc.copyTo(sumValueY); 
} 

Renderscript.rsはスニペット:

#pragma version(1) 
#pragma rs java_package_name(org.gearvrf.renderscript) 
#include "rs_debug.rsh" 
#pragma rs_fp_relaxed 

const int mImageWidth=640; 
const int mImageHeight=480; 

int32_t maxsX=-1; 
int32_t maxIndexX; 

int32_t maxsY=-1; 
int32_t maxIndexY; 

rs_allocation gIn; 

void detectX(int32_t v_in, int32_t x, int32_t y) { 

    int32_t sum=0; 

    for (int i = 0; i < (mImageWidth); i++) { 

     float4 f4 = rsUnpackColor8888(rsGetElementAt_uchar4(gIn, i, x)); 
     sum+=(int)f4.r; 
    } 

    if((sum>maxsX)){ 

     maxsX=sum; 
     maxIndexX = x; 
    } 
} 

void detectY(int32_t v_in, int32_t x, int32_t y) { 

    int32_t sum=0; 

    for (int i = 0; i < (mImageHeight); i++) { 

     float4 f4 = rsUnpackColor8888(rsGetElementAt_uchar4(gIn, x, i)); 
     sum+=(int)f4.r; 
    } 

    if((sum>maxsY)){ 
     maxsY=sum; 
     maxIndexY = x; 
    } 

} 

すべてのヘルプは、これが再びintに当時浮くとするint型から変換

答えて

0
float4 f4 = rsUnpackColor8888(rsGetElementAt_uchar4(gIn, x, i)); 
sum+=(int)f4.r; 

をいただければ幸いです。あなたがそれらを投稿していないが、あなたはここで読むためにパックされた値を生成しようとしなければならないので、私はあなたの前のステージが動作を正確に方法がわからない

sum += rsGetElementAt_uchar4(gIn, x, i).r; 

:私はあなただけでこれを行うことにより、簡素化することができると思います。したがって、グレースケールチャンネルを.rgbaに入れるか、または単一のチャンネルフォーマットを使用してから、rsAllocationVLoad_uchar4を使用して4つの値を一度に取得します。

また、これらの計算の中間結果を必要としない場合は、メモリ負荷を1回実行してからレジスタで行うほうが安いかもしれません。

また、スレッドが操作する値の数で遊ぶこともできます。それぞれのカーネルが幅2、幅4、幅8の要素を処理し、それらがどのように動作するかを調べることができます。これによりGPUには特に低解像度の画像で再生するスレッドが増えるが、削減ステップが増えるというトレードオフがある。

また、maxsX/maxsYおよびmaxIndexX/maxIndexY変数には、複数のライターの競合状態があります。あなたが正確な正解を気にしている場合、これらの書き込みはすべてアトミックを使用する必要があります。あなたが* _indices_allocに保存しないで、最後からコピーするので間違ったコードを投稿した可能性があります。したがって、実際にはすべての合計をそれらに格納して、絶対最大値と最大値を得るためにアトミックを持つ単一のスレッド関数またはカーネルを使用する必要があります。

関連する問題