Android OpenCL for循环仅工作一次

Android OpenCL for循环仅工作一次,android,for-loop,opencl,video-processing,Android,For Loop,Opencl,Video Processing,该程序是Android应用程序,需要升级mp4图像。初始化可以在以下问题中找到: 但是我发现init代码与那些不使用进行循环的内核一起工作。 当我有一个嵌套的for循环(如文章底部的示例所示)时,只有第一个图像将被处理,而所有其他图像都将是黑色的 简单的例子: 1) init function execute kernel with for loops remove opencl function =>一切顺利 2) init function execute kernel **withou

该程序是Android应用程序,需要升级mp4图像。初始化可以在以下问题中找到:

但是我发现init代码与那些不使用
进行
循环的内核一起工作。
当我有一个嵌套的for循环(如文章底部的示例所示)时,只有第一个图像将被处理,而所有其他图像都将是黑色的

简单的例子:

1)
init function
execute kernel with for loops
remove opencl function
=>一切顺利

2)
init function 
execute kernel **without** for loops
execute kernel **without** for loops on next frame
remove opencl function
3)
init function
execute kernel **with** for loops
execute kernel **with** for loops on next frame
remove opencl function
=>一切顺利

2)
init function 
execute kernel **without** for loops
execute kernel **without** for loops on next frame
remove opencl function
3)
init function
execute kernel **with** for loops
execute kernel **with** for loops on next frame
remove opencl function
=>处理第一帧,第二帧为黑色

边缘内核:

__kernel void edgeKernel(__read_only  image2d_t  srcImage,
                          __write_only image2d_t  dstImage)
{    
    const sampler_t sampler = CLK_NORMALIZED_COORDS_TRUE |
                               CLK_ADDRESS_REPEAT         |
                               CLK_FILTER_NEAREST;
    int x = get_global_id(0);
    int y = get_global_id(1);
    int2 coords = (int2) (x,y);

    int i = 0;
    int j = 0;
    float4 bufferPixel,currentPixel;
    float sum = 0;
    int counter = 0;
    const float edgeKernel[9] = {0.0f,1.0f,0.0f,1.0f,-4.0f,1.0f,0.0f,1.0f,0.0f};
    currentPixel = read_imagef(srcImage,sampler,coords);
    for(i=-1;i<=1;i++)
    {
        for(j=-1;j<=1;j++)
        {
        coords = (int2)((x+i),(y+j));
        bufferPixel = read_imagef(srcImage,sampler,coords);
        //sum = sum + (bufferPixel.y * edgeKernel[counter]);
        sum = mad(bufferPixel.y,edgeKernel[counter],sum);
        counter++;
        }
    }
    if(sum>255) sum=255;
    if(sum<0) sum=0;

    currentPixel.x=sum;
    currentPixel.y=sum;
    currentPixel.z=sum;

    write_imagef(dstImage,coords,currentPixel);                           
}
\uuuuuuu内核无效edgeKernel(\uuuuu只读图像2d\uu t srcImage,
__仅写入图像2D(仅写入图像)
{    
常量采样器\u t采样器=CLK\u规范化\u坐标\u真|
时钟地址重复|
最近的时钟滤波器;
int x=获取全局id(0);
int y=获取全局id(1);
int2坐标=(int2)(x,y);
int i=0;
int j=0;
浮点4缓冲像素,当前像素;
浮点数和=0;
int计数器=0;
常量浮点edgeKernel[9]={0.0f,1.0f,0.0f,1.0f,-4.0f,1.0f,0.0f,1.0f,0.0f};
currentPixel=读取图像F(srcImage、采样器、坐标);

对于(i=-1;我想你的问题是如何运行内核,而不是内核本身。如果一个帧处理正确,这意味着内核没问题。你是如何从解码器中获取帧的?DarkZeros:我已经添加了一个指向OpenCL代码的链接。所有OpenCL代码都可以在那里找到。如果你需要更具体的内容,请询问,我会提供。罗曼:解码器应该是正确的,如果我尝试使用反向内核,它会处理所有内容。只有在使用for循环时,问题才会出现我的opencl内核。我没有真正解决它,不是所有的情况下(我有多个过滤器,用相同的代码调用)。我去了opencl IRC频道(那里有很多有用的人),找到了一个人(nick:sharpneli)是谁帮我调试的,我们得出结论,一定是驱动程序质量不是100%。因此,你可以尝试更改内核中的内容,然后再次测试,尝试并出错,希望你能找到你的驱动程序最喜欢的内核。一个好的尝试是关闭所有编译器优化。这对我的内核有帮助。。