假设我有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]);
}
}
答案 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