我已经在OpenCL C中编写了代码以列出所有可用平台。

int main()
{
    cl_context context;
    cl_platform_id* platforms;
    cl_device_id* devices;
    cl_uint platformcount;
    cl_int ret;
    clGetPlatformIDs(2,NULL,&platformcount);
    clGetPlatformIDs(platformcount,platforms,NULL);
    /*if(ret==CL_SUCCESS)
    {
        printf("\nNumber of platforms found=%d\n",platformcount);
    }*/
    return 0;
}


这导致转储核心(分段故障(转储核心))。

$ gcc -lOpenCL a.c -o a && ./a
Segmentation fault (core dumped)


但是,如果我注释掉ret声明,则代码可以正常编译。

int main()
{
    cl_context context;
    cl_platform_id* platforms;
    cl_device_id* devices;
    cl_uint platformcount;
    //cl_int ret;
    clGetPlatformIDs(2,NULL,&platformcount);
    clGetPlatformIDs(platformcount,platforms,NULL);
    /*if(ret==CL_SUCCESS)
    {
        printf("\nNumber of platforms found=%d\n",platformcount);
    }*/
    return 0;
}


为什么会这样?

最佳答案

这个电话

clGetPlatformIDs(platformcount,platforms,NULL);


写入platforms指向的位置,但是platforms尚未初始化为指向任何位置,因此该调用调用UB。

关于c - 在OpenCL C中声明cl_uint变量会导致段错误(核心转储),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31043892/

10-11 18:03