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

时间:2018-08-06 03:49:00

标签: opencl imx6 opencl-c

我想将输入图像写入缓冲区并在主机程序的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*/    
}

我找不到我做错的地方,因为它可以在我的PC上正常工作。 我该如何解决?

0 个答案:

没有答案