OpenCL双三次插值内核失败,错误为等待列表中事件的执行状态错误

OpenCL双三次插值内核失败,错误为等待列表中事件的执行状态错误,opencl,interpolation,gpgpu,amd-processor,bicubic,Opencl,Interpolation,Gpgpu,Amd Processor,Bicubic,双三次插值是常用的插值方法之一,但我在OpenCL上找不到任何有效的实现。我决定自己在OpenCL上写双三次插值,但是 我对内核程序有一些问题 当我运行内核执行时,程序失败,错误为CL_EXEC_STATUS_error_FOR_EVENTS_IN_WAIT_LIST。没有关于错误原因的任何其他信息。我使用的是javacl绑定形式的谷歌代码:,AMD加速并行处理SDK 2.3在Ubuntu linux 10.10上,硬件AMD Radeon 5xxHD 我在ubuntu上没有针对AMD应用程序S

双三次插值是常用的插值方法之一,但我在OpenCL上找不到任何有效的实现。我决定自己在OpenCL上写双三次插值,但是

我对内核程序有一些问题

当我运行内核执行时,程序失败,错误为CL_EXEC_STATUS_error_FOR_EVENTS_IN_WAIT_LIST。没有关于错误原因的任何其他信息。我使用的是javacl绑定形式的谷歌代码:,AMD加速并行处理SDK 2.3在Ubuntu linux 10.10上,硬件AMD Radeon 5xxHD

我在ubuntu上没有针对AMD应用程序SDK的opencl调试器(

如果我取消注释float4 val=read_imagef(signal,sampler,(float2)(x+iX,y+iY)),并注释双三次插值的计算“float4 val=…”,则所有操作都没有任何错误(但使用双线性插值)。我认为此错误是由于无效内存访问或寄存器内存溢出造成的

const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_LINEAR | CLK_ADDRESS_CLAMP_TO_EDGE;
const float CATMULL_ROM[16]={-0.5F,1.5F,-1.5F,0.5F,1.0F,-2.5F,2.0F,-0.5F,-0.5F,0.0F,0.5F,0.0F,0.0F,1.0F,0.0F,0.0F};
__kernel void bicubicUpscale(int scale,read_only image2d_t signal, write_only image2d_t upscale) {

int x = get_global_id(0)-2, y = get_global_id(1)-2;

float C[16];
float T[16];


for (int i = 0; i < 16; i++)
{
    C[i]=0.0F;
    T[i]=0.0F;
}

for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++)
        for (int k = 0; k < 4; k++)
        {
            T[4*i+j] += read_imagef(signal, sampler, (int2)(x+k,y+i)).x * CATMULL_ROM[4*j+k];
        }
for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++)
        for (int k = 0; k < 4; k++)
        {
            C[4*i+j] += CATMULL_ROM[4*i+k] * T[4*k+j];
        }

for (int i = 0; i < scale; i++)
{
    for (int j = 0; j < scale; j++)
    {
        float iX=(float)j/(float) scale;
        float iY=(float)i/(float) scale;
        //float4 val=read_imagef(signal, sampler, (float2)(x+iX,y+iY));
        float val= iX * (iX * (iX * (iY * (iY * (iY * C[0] + C[1]) + C[2]) + C[3])
        + (iY * (iY * (iY * C[4] + C[5]) + C[6]) + C[7]))
        + (iY * (iY * (iY * C[8] + C[9]) + C[10]) + C[11]))
        + (iY * (iY * (iY * C[12] + C[13]) + C[14]) + C[15]);
        write_imagef(upscale, (int2)(x*scale+j, y*scale+i), val);
    }
}
}
const sampler\u t sampler=CLK\u规范化\u坐标\u假| CLK\u过滤器\u线性| CLK\u地址\u钳位\u至边缘;
常量浮点CATMULL_ROM[16]={-0.5F,1.5F,-1.5F,0.5F,1.0F,-2.5F,2.0F,-0.5F,-0.5F,0.0F,0.5F,0.0F,1.0F,0.0F};
__内核无效双立方比例(整数比例、只读图像2D\t信号、只读图像2D\t高比例){
int x=get_global_id(0)-2,y=get_global_id(1)-2;
浮点数C[16];
浮点数T[16];
对于(int i=0;i<16;i++)
{
C[i]=0.0F;
T[i]=0.0F;
}
对于(int i=0;i<4;i++)
对于(int j=0;j<4;j++)
对于(int k=0;k<4;k++)
{
T[4*i+j]+=read_imagef(信号,采样器,(int2)(x+k,y+i)).x*CATMULL_ROM[4*j+k];
}
对于(int i=0;i<4;i++)
对于(int j=0;j<4;j++)
对于(int k=0;k<4;k++)
{
C[4*i+j]+=CATMULL_-ROM[4*i+k]*T[4*k+j];
}
对于(int i=0;i

我用本地内存重写了这个程序,但它仍然不能正常工作

const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_LINEAR | CLK_ADDRESS_CLAMP_TO_EDGE;
const float CATMULL_ROM[]={-0.5F,1.5F,-1.5F,0.5F,1.0F,-2.5F,2.0F,-0.5F,-0.5F,0.0F,0.5F,0.0F,0.0F,1.0F,0.0F,0.0F};
__kernel void bicubicUpscale(local float* sharedBuffer,int scale,read_only image2d_t signal, write_only image2d_t upscale) {
int x = get_global_id(0)-2, y = get_global_id(1)-2;
//int locX=get_local_id(0);

int offsetT = (y+2)*512+(x+2)*32+16;
int offsetC = (y+2)*512+(x+2)*32;

global float* C=&sharedBuffer[offsetT];
global float* T=&sharedBuffer[offsetT];

for (int i = 0; i < 32; i++){
    sharedBuffer[offsetC+ i]=0.0F;
}

for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++)
        for (int k = 0; k < 4; k++){
            //T[4*i+j] = mad(read_imagef(signal, sampler, (int2)(x+k,y+i)).x,CATMULL_ROM[4*j+k],T[4*i+j]);
            T[i+j] += read_imagef(signal, sampler, (int2)(x+k,y+i)).x * CATMULL_ROM[4*j+k];
        }
for (int i = 0; i < 4; i++)
    for (int j = 0; j < 4; j++)
        for (int k = 0; k < 4; k++){
            //C[4*i+j] = mad(CATMULL_ROM[4*i+k],T[4*k+j],C[4*i+j]);
            sharedBuffer[offsetC +4*i+j] += CATMULL_ROM[4*i+k] * sharedBuffer[offsetT + 4*k+j];
        }


barrier (CLK_GLOBAL_MEM_FENCE);


for (int i = 0; i < scale; i++)
    for (int j = 0; j < scale; j++)
        {
            float iX=(float)j/(float) scale;
            float iY=(float)i/(float) scale;
            float4 val= iX * (iX * (iX * (iY * (iY * (iY * C[0] + C[1]) + C[2]) + C[3])
            + (iY * (iY * (iY * C[4] + C[5]) + C[6]) + C[7]))
            + (iY * (iY * (iY * C[8] + C[9]) + C[10]) + C[11]))
            + (iY * (iY * (iY * C[12] + C[13]) + C[14]) + C[15]);
            write_imagef(upscale, (int2)(x*scale+j, y*scale+i), val);
        }
}
const sampler\u t sampler=CLK\u规范化\u坐标\u假| CLK\u过滤器\u线性| CLK\u地址\u钳位\u至边缘;
常量浮点数CATMULL_ROM[]={-0.5F,1.5F,-1.5F,0.5F,1.0F,-2.5F,2.0F,-0.5F,-0.5F,0.0F,0.5F,0.0F,1.0F,0.0F,0.0F};
__内核无效双立方刻度(本地浮点*sharedBuffer、整数刻度、只读图像2D\t信号、只读图像2D\t高刻度){
int x=get_global_id(0)-2,y=get_global_id(1)-2;
//int locX=获取本地id(0);
整数偏移=(y+2)*512+(x+2)*32+16;
int offsetC=(y+2)*512+(x+2)*32;
全局浮点*C=&sharedBuffer[offset];
全局浮点*T=&sharedBuffer[offset];
对于(int i=0;i<32;i++){
sharedBuffer[offsetC+i]=0.0F;
}
对于(int i=0;i<4;i++)
对于(int j=0;j<4;j++)
对于(int k=0;k<4;k++){
//T[4*i+j]=mad(读取图像f(信号,采样器,(int2)(x+k,y+i)).x,CATMULL\u ROM[4*j+k],T[4*i+j]);
T[i+j]+=read_imagef(信号,采样器,(int2)(x+k,y+i)).x*CATMULL_ROM[4*j+k];
}
对于(int i=0;i<4;i++)
对于(int j=0;j<4;j++)
对于(int k=0;k<4;k++){
//C[4*i+j]=mad(CATMULL_-ROM[4*i+k],T[4*k+j],C[4*i+j]);
sharedBuffer[offsetT+4*i+j]+=CATMULL_-ROM[4*i+k]*sharedBuffer[offsetT+4*k+j];
}
屏障(CLK_GLOBAL_MEM_围栏);
对于(int i=0;i
你知道这个问题有什么解决办法吗

。使用命令“mvn clean compile exec:java”编译并运行演示

问候,,
Igor

我正在修复它!从性能角度来看,这个内核不是最优的,但功能正确

请使用以下参数进行排队更改:

            kernelBicubic.getKernel().setArgs(scaleFactor, inImage, imageOut);
            lastEvent=kernelBicubic.getKernel().enqueueNDRange(queue,
                    new int[]{(int) inImage.getWidth()+1,(int) inImage.getHeight()+1},lastEvent);
内核代码:

const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_LINEAR | CLK_ADDRESS_CLAMP_TO_EDGE;

const float CATMULL_ROM[16]={-0.5F, 1.5F,-1.5F, 0.5F, 1.0F,-2.5F, 2.0F,-0.5F,-0.5F, 0.0F, 0.5F, 0.0F, 0.0F, 1.0F, 0.0F, 0.0F};

inlie float calcT(image2d_t signal,int x,int y,int i,int j){
      return read_imagef(signal, sampler, (int2)(x  ,y+i)).x * CATMULL_ROM[4*j]
            +read_imagef(signal, sampler, (int2)(x+1,y+i)).x * CATMULL_ROM[4*j+1]
            +read_imagef(signal, sampler, (int2)(x+2,y+i)).x * CATMULL_ROM[4*j+2]
            +read_imagef(signal, sampler, (int2)(x+3,y+i)).x * CATMULL_ROM[4*j+3];
}

inline float C(image2d_t signal,int x,int y,int i,int j){
      return CATMULL_ROM[4*i  ] * calcT(signal,x,y,0,j)
            +CATMULL_ROM[4*i+1] * calcT(signal,x,y,1,j)
            +CATMULL_ROM[4*i+2] * calcT(signal,x,y,2,j)
            +CATMULL_ROM[4*i+3] * calcT(signal,x,y,3,j);
}


__kernel void bicubicUpscale(int scale,read_only image2d_t signal, write_only image2d_t upscale) {

int x = get_global_id(0)-2, y = get_global_id(1)-2;

float C0 =C(signal,x,y,0,0);
float C1 =C(signal,x,y,0,1);
float C2 =C(signal,x,y,0,2);
float C3 =C(signal,x,y,0,3);
float C4 =C(signal,x,y,1,0);
float C5 =C(signal,x,y,1,1);
float C6 =C(signal,x,y,1,2);
float C7 =C(signal,x,y,1,3);
float C8 =C(signal,x,y,2,0);
float C9 =C(signal,x,y,2,1);
float C10=C(signal,x,y,2,2);
float C11=C(signal,x,y,2,3);
float C12=C(signal,x,y,3,0);
float C13=C(signal,x,y,3,1);
float C14=C(signal,x,y,3,2);
float C15=C(signal,x,y,3,3);

float xOff=scale*1.5F + x*scale;
float yOff=scale*1.5F + y*scale;

 for (int i = 0; i < scale; i++)
 {
    for (int j = 0; j < scale; j++)
    {
        float iY=(float)j/(float) scale;
        float iX=(float)i/(float) scale;
        float val= iX * (iX * (iX * (iY * (iY * (iY * C0 + C1) + C2) + C3)
        + (iY * (iY * (iY * C4 + C5) + C6) + C7))
        + (iY * (iY * (iY * C8 + C9) + C10) + C11))
        + (iY * (iY * (iY * C12 + C13) + C14) + C15);
        write_imagef(upscale, (int2)(xOff+j, yOff+i), val);
    }
 }
}
const sampler\u t sampler=CLK\u规范化\u坐标\u假| CLK\u过滤器\u线性| CLK\u地址\u钳位\u至边缘;
常量浮点数CATMULL_ROM[16]={-0.5F,1.5F,-1.5F,0.5F,1.0F,-2.5F,2.0F,-0.5F,-0.5F,0.5F,0.5F,0.0F,0.0F,1.0F,0.0F};
内置浮点运算(图像2D_t信号,整数x,整数y,整数i,整数j){
返回读取图像f(信号,采样器,(int2)(x,y+i)).x*CATMULL\u ROM[4*j]
+读取图像f(信号,采样器,(int2)(x+1,y+i)).x*CATMULL\u ROM[4*j+1]
+读取图像f(信号,采样器,(int2)(x+2,y+i)).x*CATMULL\u ROM[4*j+2]
+读取图像f(信号,采样器,(int2)(x+3,y+i)).x*CATMULL_ROM[4*j+3];
}
内联浮点C(图像2D_t信号,整数x,整数y,整数i,整数j){
返回CATMULL_ROM[4*i]*calcT(信号,x,y,0,j)
+CATMULL_ROM[4*i+1]*calcT(信号,x,y,1,j)
+CATMULL_ROM[4*i+2]*calcT(信号,x,y,2,j)
+CATMULL_ROM[4*i+3]*calcT(信号,x,y,3,j);
}
__内核无效双立方比例(整数比例、只读图像2D\t信号、只读图像2D\t高比例){
int x=get_global_id(0)-2,y=get_global_id(1)-2;
浮点数C0=C(信号,x,y,0,0);
浮点数C1=C(信号,x,y,0,1);
浮点数C2=C(信号,x,y,0,2);
浮点数C3=C(信号,x,y,0,3);
浮点数C4=C(信号,x,y,1,0);
浮点数C5=C(信号,x,y,1,1);
浮点数C6=C(信号,x,y,1,2);
浮点数C7=C(信号,x,y,1,3);
浮点数C8=C(信号,x,y,2,0);
浮点数C9=C(信号,x,y,2,1);
浮动