【问题标题】:Porting a function from C to OPENCL将函数从 C 移植到 OPENCL
【发布时间】:2019-07-18 10:51:02
【问题描述】:

我有这个用 C 编写的函数:

void SimpleGraphDrawing(unsigned char *image, int dim[2],double range[2][2])
{
    for (int j=0;j<dim[1];j++)
        for (int i=0;i<dim[0];i++)
        {
            float x=range[0][0]+(i+0.5)*(range[0][1]-range[0][0])/dim[0]; 
            float y=range[1][0]+(j+0.5)*(range[1][1]-range[1][0])/dim[1]; 
            float val=(x*x+y*y-1);
            val=val*val*val-x*x*y*y*y;
            image[j*dim[0]+i]=(val>0)*255; 
        }
}

我想把它移植到 OPENCL。

这是我的新功能:

void SimpleGraphDrawingGPU(OpenCLContext &context, unsigned char *image, int dim[2],double range[2][2])
{
    cl_int error;
    int blocking = true;
    SetConsoleColor(15);
    cl_int myKernel = GRAPH_DRAWING;

    cl_mem imageKernel = clCreateBuffer(context.GetContext(), CL_MEM_READ_WRITE, dim[0]*dim[1] * sizeof(char), NULL, &error);
    cl_mem dimKernel = clCreateBuffer(context.GetContext(), CL_MEM_READ_WRITE, 2*sizeof(int), NULL, &error);
    cl_mem rangeKernel = clCreateBuffer(context.GetContext(), CL_MEM_READ_WRITE, 4 * sizeof(double), NULL, &error);

    error = clEnqueueWriteBuffer(context.GetCommandQueue(0), imageKernel, blocking, 0, dim[0] * dim[1]* sizeof(int), image, 0, NULL, NULL);
    error = clEnqueueWriteBuffer(context.GetCommandQueue(0), dimKernel, blocking, 0, 2*sizeof(int), &dim, 0, NULL, NULL);
    error = clEnqueueWriteBuffer(context.GetCommandQueue(0), rangeKernel, blocking, 0, 4 * sizeof(double), &range, 0, NULL, NULL);

    error = clSetKernelArg(context.GetKernel(myKernel), 0, sizeof(cl_mem), &imageKernel);
    error = clSetKernelArg(context.GetKernel(myKernel), 1, sizeof(cl_mem), &dimKernel);
    error = clSetKernelArg(context.GetKernel(myKernel), 2, sizeof(cl_mem), &rangeKernel);

    size_t globalWorkSize[1] = { 1024 };
    error = clEnqueueNDRangeKernel(context.GetCommandQueue(0), context.GetKernel(myKernel), 1, NULL, globalWorkSize, NULL, 0, NULL, NULL);

    error = clReleaseMemObject(imageKernel);
    error = clReleaseMemObject(dimKernel);
    error = clReleaseMemObject(rangeKernel);
    ;
}

这也是来自 MyKernels 的函数:

__kernel void GRAPH_DRAWING ()
{

}

输出真的很奇怪,我不知道如何修复它:“PROGRAM -33”

【问题讨论】:

  • kernel 可能不是这个问题的正确标签。
  • 如果“PROGRAM -33”是您遇到的错误的一部分,您需要提供确切的错误信息(将其添加到问题帖子中)。

标签: c kernel opencl


【解决方案1】:

-33 是无效的设备。您应该观看此示例以了解他们如何管理和处理 OCL 设备:https://software.intel.com/en-us/articles/gemm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    相关资源
    最近更新 更多