0

병렬 감소 알고리즘을 수정하려고합니다. 주어진 배열 길이를 2의 거듭 제곱으로 나눌 논리를 사용하고 있습니다. 예를 들어 26을 넣으면 16 개의 요소 중 배열 1을 만들고 8 개의 요소의 다음 배열과 2 개의 요소의 마지막 배열을 만듭니다. 26 자체가 2의 힘이 아니지만이 방법으로 나는 각각의 병렬 감소를받을 수있는 메인 어레이에서 생성 된 서브 어레이의 수가 더 많습니다. 하지만 rendercript에서 이것을 할 수 있기를 원할 때마다 하나의 컨텍스트를 가지고 있지만 오류를 던지고있는 동안 매번 렌더 카드 메모리 할당을 다시 작성하는 루프를 사용합니다. 이 부분에서 나를 도울 수 있니? 나를 사각 지대로 안내해 주시겠습니까? 다음은 내 코드입니다!루프 안에 렌더러 메모리 할당을 넣어 일련의 가변 크기 배열을 처리 할 수 ​​있습니까?

private void createScript() { 
    log ("i'm in createscript"); 
    int pp=0; 
    int qq=1; 
    int ii=0; 
    **mRS = RenderScript.create(this);** 
    for (int gstride=0; gstride < address.length/2; gstride++){ 
     log("im in stride noof gstride:"+gstride); 
     // this is the address array location 
     int strtadd=address[ii]; 
     int sze = 0; 
     sze=address[qq]-address[pp]+1; 
     tempin =new int [sze]; 
     System.arraycopy(input, strtadd, tempin, 0, tempin.length); 
     strtadd=address[ii+2]; 
     log("Generated size of array: " + tempin.length); 
     //renderscript declarations 



     `enter code here`**mInAllocation=Allocation.createSized(mRS,Element.I32(mRS),tempin.length);                
     `enter code here`mOutAllocation=Allocation.createSized(mRS,Element.I32(mRS),address.length/2); ` 

     mInAllocation.copyFrom(tempin); 
     mScript = new ScriptC_reduce2(mRS, getResources(), R.raw.reduce2); 
     //int row_width = input.length; 
     mScript.bind_gInarray(mInAllocation); 
     mScript.set_gIn(mInAllocation); 
     mScript.set_gOut(mOutAllocation); 
     mScript.set_gScript(mScript); 


     //time measurement 

     long lStartTime = new Date().getTime(); 
    for (int stride = tempin.length/2; stride > 0; stride /= 2) { 
     mScript.set_stride(stride); 
     mScript.invoke_filter(); 
    }** 
    long lEndTime = new Date().getTime(); 
    long difference = lEndTime - lStartTime; 
    nettime[gstride]=difference; 
    pp=pp+1; 
    qq=qq+1; 

    mInAllocation.copyTo(tempin); 
    output[gstride] = tempin[0]; 

     } 
    int sum=0; 
    int sum2=0; 
    int i = 0;  . 
    while(i < output.length) { 
     sum += output[i]; 
     sum2 +=nettime[i]; 
     i++;   
    } 

    t1.setText(String.format("output:%s\n\nExecution time:%s", 
      +sum, +sum2 +"ms")); //input:%s\n\n ArrayToString(input), 
} 


I get the following error as copied from the error log: I don't think its out of memory ` `error. 
V/RenderScript(2890): rsContextCreate dev=0x2a14ea68 
V/ScriptC (2890): Create script for resource = reduce2 
D/StopWatch(2890): StopWatch bcc: RSCompilerDriver::loadScriptCache time (us): 1988 
D/StopWatch(2890): StopWatch bcc: RSCompilerDriver::build time (us): 2485 
D/AndroidRuntime(2890): Shutting down VM 
W/dalvikvm(2890): threadid=1: thread exiting with uncaught exception (group=0x40a71930) 
E/AndroidRuntime(2890): FATAL EXCEPTION: main 
E/AndroidRuntime(2890): java.lang.RuntimeException: Unable to start activity  `enter code `enter code here`ComponentInfo{com.example.paralleladd2/com.example.paralleladd2.Paralleladd2}:java.lang .NullPointerException 
E/AndroidRuntime(2890): at `enter code here`android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180) 
E/AndroidRuntime(2890): at `enter code here`android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 
E/AndroidRuntime(2890): at android.app.ActivityThread.access$600(ActivityThread.java:141) 
E/AndroidRuntime(2890): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 
E/AndroidRuntime(2890): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime(2890): at android.os.Looper.loop(Looper.java:137) 
E/AndroidRuntime(2890): at android.app.ActivityThread.main(ActivityThread.java:5041) 
E/AndroidRuntime(2890): at java.lang.reflect.Method.invokeNative(Native Method) 
E/AndroidRuntime(2890): at java.lang.reflect.Method.invoke(Method.java:511) 
E/AndroidRuntime(2890): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
E/AndroidRuntime(2890): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
E/AndroidRuntime(2890): at dalvik.system.NativeStart.main(Native Method) 
E/AndroidRuntime(2890): Caused by: java.lang.NullPointerException 
E/AndroidRuntime(2890): at com.example.paralleladd2.Paralleladd2.createScript(Paralleladd2.java:157) 
E/AndroidRuntime(2890): at com.example.paralleladd2.Paralleladd2.onCreate(Paralleladd2.java:48) 
E/AndroidRuntime(2890): at android.app.Activity.performCreate(Activity.java:5104) 
E/AndroidRuntime(2890): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080) 
E/AndroidRuntime(2890): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144) 
+0

무엇이 오류입니까? 메모리 부족? –

답변

0

할당 생성은 루프 내부에서 이루어져야합니다. 나는 당신의 문제가 루프 내부에서 스크립트를 만드는 것으로부터 오는 것이라고 생각한다. 내가 할당 생성 루프 밖에서 하나의 reduce 스크립트를 만들고 루프에서 다시 사용합니다.

스크립트를 만드는 데 많은 리소스가 필요하며 시스템에서 리소스를 실행할 수 있습니다.

+0

"mScript = new ScriptC_reduce2 (mRS, getResources(), R.raw.reduce2);"를 루프 외부에서 수행했지만 여전히 동일한 오류가 발생합니다. 왜 그런지! 나는 logcat 출력으로 내 게시물을 업데이 트했습니다. – user3302611

+0

그래서 2 루프와 같습니다. Loop1 : 매번 새로운 입력 배열을 만듭니다. Loop2 :는 병렬 감소로 작동합니다. 이제 루프 1 외부에서 스크립트를 만들고 루프 1에서 _set()을 호출하고 invoke filter()를 호출하여 메모리 입력 만 수행했습니다. 내부 Loop2에서 병렬 축소를 수행합니다. 제가 누락 된 부분에 대한 도움은 매우 감사하겠습니다! – user3302611

+0

소스의 157 행은 무엇입니까? –