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];
}
但是在这里,当从 forEach_root() 调用时,rsGetAllocation() 会失败。
05-11 21:31:29.639: E/RenderScript(17032): ScriptC::ptrToAllocation, failed to find 0x5beb1a40
以防我添加在 Windows 下运行良好的OpenCL代码。我正在尝试将其移植到 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);
}