Android上的数组添加

时间:2015-02-03 12:39:27

标签: java android opengl-es renderscript

假设我有2个int

数组
int[10] A; //[1,1,1,1,1,1,1,1,1,1]
int[10] B; //[2,2,2,2,2,2,2,2,2,2]

数组C的结果应为

int[10] C; //[3,3,3,3,3,3,3,3,3,3]

我应该如何获得结果C而不是使用for循环迭代每个A和B?换句话说,是否可以通过使用GPU来进行并行计算以节省计算时间?

我已经读过使用RenderScript,可以进行这样的计算。我应该怎么做呢?如果有人可以指导我或指向我参考网站,我会很高兴。

我已经读过这个并且仍然感到困惑:How to pass array values to and from Android RenderScript using Allocations

是否可以使用OpenGl ES来执行此操作?我在这篇文章中读到,无法声明数组:How to define constant array in GLSL (OpenGL ES 2.0)?

目前的解决方案:

RenderScript Snippet

int32_t *A;
int32_t *B;

int32_t __attribute__((kernel)) kernelAdd(int32_t in) {
    int32_t C;
    C = A[in] + B[in];
    return C;
}

Java代码段:

private void intAdd3(int[] A, int[] B) {
    RenderScript rs = RenderScript.create(this);
    ScriptC_rsintadd intaddscript = new ScriptC_rsintadd(rs,
            getResources(), R.raw.rsintadd);
    mScript = intaddscript;

    // Create allocation for arrays
    Allocation a = Allocation.createSized(rs, Element.I32(rs), A.length);
    a.copyFrom(A);
    intaddscript.bind_A(a);

    Allocation b = Allocation.createSized(rs, Element.I32(rs), B.length);
    b.copyFrom(B);
    intaddscript.bind_B(b);

    Allocation array = Allocation.createSized(rs, Element.I32(rs), SIZE);
    int[] array_size = new int[SIZE];
    for (int i = 0; i < SIZE; i++) {
        array_size[i] = i;
    }
    array.copyFrom(array_size);

    // create blank memory for c
    int[] C = new int[SIZE];
    Allocation c = Allocation.createSized(rs, Element.I32(rs), C.length);
    intaddscript.forEach_kernelAdd(array, c);

    c.copyTo(C);

    for (int i = 0; i < SIZE; i++) {
        System.out.println("intadd3" + i + ": " + C[i]);
    }
}

2 个答案:

答案 0 :(得分:1)

假设您已经分配了数组,并且它们在范围内可用:

void __attribute__((kernel)) kernelAdd(uint32_t x) {
    C[x] = A[x] + B[x];
}

查看http://developer.android.com/guide/topics/renderscript/compute.html#writing-an-rs-kernel

答案 1 :(得分:0)

它可以帮助你

int[] a = { 1, 2 };
int[] b = { 3, 4 };
int[] l;

for (int i = 0; i < a.length; i++) {
        int c=i;
        for(int j=0;j<=b.length;j++)
        {
            int d=j;
            int e=c*d;
            // Make List Array here To insert e
            myList.add(e);

        }
    }
    System.out.println(myList);

这不是完美解决方案,而是HelpFul