Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 优化行和列单元格的renderscript求和_Android_Optimization_Renderscript_Android Renderscript - Fatal编程技术网

Android 优化行和列单元格的renderscript求和

Android 优化行和列单元格的renderscript求和,android,optimization,renderscript,android-renderscript,Android,Optimization,Renderscript,Android Renderscript,在优化以下代码方面有什么建议吗?代码首先对图像进行灰度化、反转,然后设置阈值(代码不包括在内,因为它很简单)。然后对每行和每列的元素求和(所有元素都是1或0)。然后,它查找具有最高值的行和列的行和列索引 该代码应该找到图像的质心,它可以工作,但我想让它更快 我是为API 23开发的,所以不能使用精简内核 Java代码段: private int[] sumValueY = new int[640]; private int[] sumValueX = new int[480]; rows_in

在优化以下代码方面有什么建议吗?代码首先对图像进行灰度化、反转,然后设置阈值(代码不包括在内,因为它很简单)。然后对每行和每列的元素求和(所有元素都是1或0)。然后,它查找具有最高值的行和列的行和列索引

该代码应该找到图像的质心,它可以工作,但我想让它更快

我是为API 23开发的,所以不能使用精简内核

Java代码段:

private int[] sumValueY = new int[640];
private int[] sumValueX = new int[480];

rows_indices_alloc = Allocation.createSized( rs, Element.I32(rs), height, Allocation.USAGE_SCRIPT);
col_indices_alloc = Allocation.createSized( rs, Element.I32(rs), width, Allocation.USAGE_SCRIPT);

public RenderscriptProcessor(RenderScript rs, int width, int height)
{
   mScript.set_gIn(mIntermAllocation);

   mScript.forEach_detectX(rows_indices_alloc);
   mScript.forEach_detectY(col_indices_alloc);

   rows_indices_alloc.copyTo(sumValueX);
   col_indices_alloc.copyTo(sumValueY);
 }
Renderscript.rs代码段:

#pragma version(1)
#pragma rs java_package_name(org.gearvrf.renderscript)
#include "rs_debug.rsh"
#pragma rs_fp_relaxed

const int mImageWidth=640;
const int mImageHeight=480;

int32_t maxsX=-1;
int32_t maxIndexX;

int32_t maxsY=-1;
int32_t maxIndexY;

rs_allocation gIn;

void detectX(int32_t v_in, int32_t x, int32_t y) {

    int32_t sum=0;

    for ( int i = 0; i < (mImageWidth); i++) {

       float4 f4 = rsUnpackColor8888(rsGetElementAt_uchar4(gIn, i, x));
       sum+=(int)f4.r;
    }

    if((sum>maxsX)){

        maxsX=sum;
        maxIndexX = x;
    }
}

void detectY(int32_t v_in, int32_t x, int32_t y) {

     int32_t sum=0;

     for ( int i = 0; i < (mImageHeight); i++) {

        float4 f4 = rsUnpackColor8888(rsGetElementAt_uchar4(gIn, x, i));
        sum+=(int)f4.r;
     }

     if((sum>maxsY)){
         maxsY=sum;
         maxIndexY = x;
     }

}
布拉格语版本(1) #pragma rs java_包_名称(org.gearvrf.renderscript) #包括“rs_debug.rsh” #pragma rs_fp_ 常量int mImageWidth=640; 常数int-mImageHeight=480; int32_t maxsX=-1; int32_t maxIndexX; int32_t maxsY=-1; int32_t Maxindex; 卢比; 无效检测TX(int32_t v_in,int32_t x,int32_t y){ int32_t sum=0; 对于(int i=0;i<(mImageWidth);i++){ float4 f4=rs8888(rsGetElementAt_uchar4(gIn,i,x)); 总和+=(int)f4.r; } 如果((总和>最大值)){ maxsX=总和; maxIndexX=x; } } 无效检测率(int32_t v_in,int32_t x,int32_t y){ int32_t sum=0; 对于(int i=0;i<(mImageHeight);i++){ float4 f4=rs8888(rsGetElementAt_uchar4(gIn,x,i)); 总和+=(int)f4.r; } 如果((总和>最大值)){ maxsY=总和; MaxIndex=x; } } 任何帮助都将不胜感激

float4 f4 = rsUnpackColor8888(rsGetElementAt_uchar4(gIn, x, i));
sum+=(int)f4.r;
这将从int转换为float,然后再转换回int。我认为您可以通过这样做来简化:

sum += rsGetElementAt_uchar4(gIn, x, i).r;
我不知道您以前的阶段是如何工作的,因为您还没有发布它们,但是您应该尝试生成压缩值以在这里阅读。因此,要么将灰度通道放入.rgba,要么使用单通道格式,然后使用rsAllocationVLoad_uchar4一次获取4个值

另外,尝试将前面的阶段与这个阶段结合起来,如果您不需要这些计算的中间结果,那么只需进行一次内存加载,然后在寄存器中进行这些转换,成本可能会更低

您还可以考虑线程操作的值的数量。您可以尝试让每个内核处理width/2、width/4、width/8元素,并查看它们的性能。这将为GPU提供更多的线程,尤其是在低分辨率图像上,但需要更多的缩减步骤

在maxsX/maxsY和maxIndexX/maxIndexY变量上也有多个写入程序争用条件。如果你关心确切的正确答案,那么所有这些文章都需要使用原子学。我想你可能发错了代码,因为你没有存储到*_index_alloc,但是你在最后从它们复制。因此,实际上,您应该将所有和存储到这些函数中,然后使用单线程函数或带原子的内核来获得绝对max和max索引