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