2017-03-28 10 views
0

다음 코드를 최적화하는 데 조언이 필요합니까? 코드는 먼저 이미지를 그레이 스케일하고 반전 한 다음 임계 값을 지정합니다 (포함되지 않은 코드는 사소한 것입니다). 그런 다음 각 행과 열의 요소를 합합니다 (모든 요소는 1 또는 0입니다). 그런 다음 가장 높은 값을 갖는 행 및 열의 행 및 열 색인을 찾습니다.행과 열 셀의 렌더 스크립트 합계 최적화

이 코드는 이미지의 중심을 찾기 위해 생각하고 그것을 작동,하지만 난 내가 그렇게 감소 커널을 사용할 수 없습니다, API 23 개발하고 있어요

더 빨리 만들고 싶어한다.

자바 스 니펫 :

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 개의 값을 가져옵니다.

또한 이전 단계를이 단계와 결합 해보십시오. 이러한 계산의 중간 결과가 필요하지 않으면 메모리로드를 한 번 수행 한 다음 레지스터에서 해당 변환을 수행하는 것이 더 저렴할 수 있습니다.

스레드가 작동하는 값의 수와 함께 플레이 할 수도 있습니다. 너비/2, 너비/4, 너비/8 개의 각 너비를 처리하고 어떻게 수행하는지 볼 수 있습니다. 이렇게하면 더 낮은 해상도의 이미지에서 GPU에 더 많은 스레드를 제공 할 수 있지만 더 많은 축소 단계가 필요하다는 트레이드 오프가 있습니다.

또한 maxsX/maxsY 및 maxIndexX/maxIndexY 변수에 여러 작성자 경쟁 조건이 있습니다. 당신이 정확한 정답을 원한다면 모든 쓰기는 원자학을 사용해야합니다. 나는 당신이 * _indices_alloc에 ​​저장하지 않기 때문에 잘못된 코드를 게시했을 것이라고 생각하지만, 결국에는 그 코드를 복사한다. 따라서 실제로 모든 합계를 저장 한 다음 단일 스레드 함수 또는 원자와 함께 커널을 사용하여 절대 최대 및 최대 색인을 얻어야합니다.