1) Как я могу получить доступ к другим элементам forEach_root(), кроме текущего?
В OpenCL у нас есть указатель на первый элемент, а затем мы можем использовать get_global_id(0) для получения текущего индекса. Но мы по-прежнему можем получить доступ ко всем остальным элементам. В Renderscript у нас есть только указатель на текущий элемент?
2) Как я могу перебрать выделение в forEach_root()?
У меня есть код, который использует вложенный (двойной) цикл в java. Renderscript автоматизирует внешний цикл, но я не могу найти никакой информации о реализации внутреннего цикла. Ниже приведены мои лучшие усилия:
void root(const float3 *v_in, float3 *v_out) {
rs_allocation alloc = rsGetAllocation(v_in);
uint32_t cnt = rsAllocationGetDimX(alloc);
*v_out = 0;
for(int i=0; i<cnt; i++)
*v_out += v_in[i];
}
Но здесь rsGetAllocation() не работает при вызове из forEach_root().
05-11 21:31:29.639: E/RenderScript(17032): ScriptC::ptrToAllocation, failed to find 0x5beb1a40
На всякий случай добавлю свой код OpenCL, который отлично работает под Windows. Я пытаюсь портировать его на Renderscript
typedef float4 wType;
__kernel void gravity_kernel(__global wType *src,__global wType *dst)
{
int id = get_global_id(0);
int count = get_global_size(0);
double4 tmp = 0;
for(int i=0;i<count;i++) {
float4 diff = src[i] - src[id];
float sq_dist = dot(diff, diff);
float4 norm = normalize(diff);
if (sq_dist<0.5/60)
tmp += convert_double4(norm*sq_dist);
else
tmp += convert_double4(norm/sq_dist);
}
dst[id] = convert_float4(tmp);
}