当前位置: 首页 > 知识库问答 >
问题:

RenderScript分配。从分配读取int

许博易
2023-03-14

在Java中,我有以下代码用于为intPointer创建分配。但是在renderscript计算之后,我无法返回分配的值。没有copyTo(int)方法,只有byte[],short[],int[],float[],位图。

    //Create Allocation
    Allocation intPointer = Allocation.createSized(renderScript, Element.I32(renderScript), 2);

    convolution.bind_intPointer(intPointer);
    convolution.forEach_root(allocationOut);

    [...]
    //read Allocation, not working
    int[] ints = new int[]{0x01234567};
    intPointer.copyTo(ints);             //does not overwrite the ints the line above
    int i = (int)ints[0];
    Log.d("ints", String.valueOf(i));
#pragma version(1)
#pragma rs java_package_name(package com.ap.wificam)
#pragma rs_fp_imprecise

rs_allocation input;
rs_allocation mask;

int32_t *intPointer = 0;

void root(uchar4* out, uint32_t x, uint32_t y) {

    //do some stuff

    if((sum.x + sum.y + sum.z)/3 > *intPointer)
        *intPointer = (sum.x + sum.y + sum.z)/3;    //wirte data to intPointer

    *out = convert_uchar4(sum);
}

log.d(“ints”,string.valueof(i));给出d/ints:19088743和rsDebug(“rs”,*intpointer);2045 0x7fd

如何从分配中获取int值?

共有1个答案

梁丘柏
2023-03-14

您的RenderScript设置似乎是正确的,但我认为您在正确初始化分配中的数据时遇到了问题。

因为在比较sumaverage是否大于*intpointer时,您正在读取RenderScript中的分配值,所以您需要确保该值的起始值是您实际期望的值。否则,它将具有未初始化的数据,并且>比较大部分时间都将失败。

我想这就是您试图使用int32_t*intpointer=0;所做的,但这并不是在C中初始化指针数据的正确html" target="_blank">方法。最简单的方法是在创建分配后立即从Java复制数据:

Allocation intPointer = Allocation.createSized(renderScript, Element.I32(renderScript), 2);
intPointer.copy1DRangeFrom(0, 2, new int[2]);
convolution.bind_intPointer(intPointer);

我建议您不要这样做,而是将所有(sum.x+sum.y+sum.z)/3值存储在一个与输入数据一样大的分配中,然后将该分配复制回Java中,然后在其数组上执行一个简单的循环以找到最大值。

在RenderScript内核中正确地并行最大值算法实际上有点困难(如果您感兴趣,可以阅读我前段时间发布的另一个答案以获得更多细节),所以为了简单起见,您最好像我上面建议的那样从Java中找到最大值。

 类似资料:
  • 这肯定不总是一件好事,例如,未分配的内存可能会被取消映射。然而,一定有什么东西能让这一切奏效。我的一些假设: OSX不仅保证它的分配是16字节对齐的,而且还保证分配的“量程”是16字节的块。换句话说,分配5个字节实际上会分配16个字节。分配20个字节实际上将分配32个字节。 在编写asm时读取数组末尾本身并无害,因为这不是未定义的行为,只要它在范围内(在页面内?)。 实际原因是什么?

  • 我一直在试图找到一种简单的方法来读取Rust中的变量,但是到目前为止还没有任何运气。Rust Book中的所有示例处理字符串AFAIK,我找不到任何有关整数或浮点数的工作。

  • 若一条代码不能向量化,你可以通过预分配任何输出结果已保存其中的向量或数组以加快for 循环。例如,这个代码用zeros函数把for循环产生的向量预分配。这使得for循环的执行显著加快。 r = zeros(32,1); for n = 1:32 r(n) = rank(magic(n)); end 上例中若没有使用预分配,MATLAB的注释器利用每次循环扩大r向量。向量预分配排除了该步骤

  • 本节介绍 ByteBuf 实例管理的几种方式: ByteBufAllocator 为了减少分配和释放内存的开销,Netty 通过支持池类 ByteBufAllocator,可用于分配的任何 ByteBuf 我们已经描述过的类型的实例。是否使用池是由应用程序决定的,表5.8列出了 ByteBufAllocator 提供的操作。 Table 5.8 ByteBufAllocator methods 名

  • 好的,多亏了~slothiful~,我终于让表情符号起作用了。 我没有试图让bot根据对作为服务器规则发布的消息的反应来分配角色。 谢谢你的回答