如何在宿主程序的循环中使用opencl?

如何在宿主程序的循环中使用opencl?,opencl,imx6,opencl-c,Opencl,Imx6,Opencl C,我想将输入图像写入缓冲区,并在宿主程序的while循环中执行内核文件(而不是在内核文件中)。我确实在while循环中设置了OpenCL内容(上下文、设备、缓冲区、命令队列等),将图像写入我在循环中创建的缓冲区,并运行内核。它在我的桌面上工作,但当我在i.mx6板上执行它时,它在第二个while循环中返回分段错误。代码如下 while (count < 10) { unsigned char* input = (unsigned char*)inImg.data; start

我想将输入图像写入缓冲区,并在宿主程序的while循环中执行内核文件(而不是在内核文件中)。我确实在while循环中设置了OpenCL内容(上下文、设备、缓冲区、命令队列等),将图像写入我在循环中创建的缓冲区,并运行内核。它在我的桌面上工作,但当我在i.mx6板上执行它时,它在第二个while循环中返回分段错误。代码如下

while (count < 10)
{
    unsigned char* input = (unsigned char*)inImg.data;
    start = clock();

    unsigned char* output = (unsigned char*)malloc(width * height * sizeof(unsigned char));

    size_t localWorkSize[2] = { WGX, WGY };
    size_t globalWorkSize[2] = { RoundUp(WGX, width), RoundUp(WGY, height) };
    cl_mem cl_inImg = clCreateBuffer(context, CL_MEM_READ_ONLY, width * height * sizeof(unsigned char) * inImg.channels(), NULL, &ret);
    /*error check*/


    cl_mem cl_outImg = clCreateBuffer(context, CL_MEM_WRITE_ONLY, width * height * sizeof(unsigned char) * inImg.channels(), NULL, &ret);
    /*error check*/

    int filterSize = 5;
    int paddingSize = (int)(filterSize / 2) * 2;
    int localWidth = WGX + paddingSize;
    int localHeight = WGY + paddingSize;

    size_t localMemSize = (localWidth * localHeight * sizeof(unsigned char) * inImg.channels());

    clEnqueueWriteBuffer(queue, cl_inImg, CL_TRUE, 0, width * height * sizeof(unsigned char) * inImg.channels(), input, 0, NULL, NULL);

    cl_int errNum = 0;
    errNum = clSetKernelArg(kernel, 0, sizeof(cl_mem), &cl_inImg);
    errNum |= clSetKernelArg(kernel, 1, sizeof(cl_mem), &cl_outImg);
    errNum |= clSetKernelArg(kernel, 2, localMemSize, NULL);
    errNum |= clSetKernelArg(kernel, 3, sizeof(int), &filterSize);
    errNum |= clSetKernelArg(kernel, 4, sizeof(int), &localWidth);
    errNum |= clSetKernelArg(kernel, 5, sizeof(int), &localHeight);
    errNum |= clSetKernelArg(kernel, 6, sizeof(int), &width);
    errNum |= clSetKernelArg(kernel, 7, sizeof(int), &height);
    /*error check*/


    errNum = clEnqueueNDRangeKernel(queue, kernel, 2, NULL,
        globalWorkSize, localWorkSize,
        0, NULL, NULL);
    /*error check*/


    clFinish(queue);

    errNum = clEnqueueReadBuffer(queue, cl_outImg,
        CL_TRUE, 0, width * height * sizeof(unsigned char) * inImg.channels(), output, 0, NULL, NULL);
    /*error check*/    
}
while(计数<10)
{
unsigned char*input=(unsigned char*)inImg.data;
开始=时钟();
无符号字符*输出=(无符号字符*)malloc(宽度*高度*大小(无符号字符));
大小\u t localWorkSize[2]={WGX,WGY};
大小\u t globalWorkSize[2]={汇总(WGX,宽度),汇总(WGY,高度)};
cl_mem cl_inImg=clCreateBuffer(上下文,cl_mem_只读,宽度*高度*大小(无符号字符)*inImg.channels(),NULL,&ret);
/*错误检查*/
cl_mem cl_outImg=clCreateBuffer(上下文,仅cl_mem_WRITE_,宽度*高度*大小(无符号字符)*inImg.channels(),NULL,&ret);
/*错误检查*/
int filterSize=5;
int paddingSize=(int)(filterSize/2)*2;
int localWidth=WGX+paddingSize;
int localHeight=WGY+paddingSize;
size\u t localMemSize=(localWidth*localHeight*sizeof(unsigned char)*inImg.channels());
clEnqueueWriteBuffer(队列,cl_inImg,cl_TRUE,0,宽度*高度*大小(无符号字符)*inImg.channels(),输入,0,NULL,NULL);
cl_int errNum=0;
errNum=clSetKernelArg(kernel,0,sizeof(cl_mem),&cl_inImg);
errNum |=clSetKernelArg(kernel,1,sizeof(cl_mem)和cl_outImg);
errNum |=clSetKernelArg(内核,2,localMemSize,NULL);
errNum |=clSetKernelArg(kernel,3,sizeof(int)和filterSize);
errNum |=clSetKernelArg(kernel,4,sizeof(int)和localWidth);
errNum |=clSetKernelArg(内核,5,sizeof(int)和localHeight);
errNum |=clSetKernelArg(kernel,6,sizeof(int)和width);
errNum |=clSetKernelArg(kernel,7,sizeof(int)和height);
/*错误检查*/
errNum=clenqueueendrangekernel(队列,内核,2,NULL,
globalWorkSize、localWorkSize、,
0,空,空);
/*错误检查*/
clFinish(队列);
errNum=clenqueueredbuffer(队列,cl_outImg,
CL_TRUE,0,宽度*高度*大小of(无符号字符)*inImg.channels(),输出,0,NULL,NULL);
/*错误检查*/
}
我找不到错误的地方,因为它在我的电脑上正常工作。
如何解决此问题?

请尝试valgrind检测错误所在。谢谢您的回复。segfault错误发生在clFinish。如果我注释clFinish,则会出现与CLENQUEUREADBUFFER函数相同的错误。我不知道为什么在第二次尝试循环时会出现错误。