c - 在 OpenCL C 中声明 cl_uint 变量会导致段错误(核心转储)

标签 c linux parallel-processing opencl gpgpu

我用 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/

相关文章:

linux - 如何在 Ubuntu 上固定 Rabbitmq 版本?

php - Linux 使 PHP 从源代码到 '.so' 文件

C:在运行时动态合成聚合数据类型

c++ - 消息队列中的accept() IPC UNIX

c - 如何读取以逗号分隔的大于 999 的数字(例如 10,000)?

我可以使用 C 预处理器有条件地检查宏的值吗?

Linux:如何在层次结构中查找具有特定扩展名的文件并在找到时执行命令?

r - mc.cores > 1 在 Windows 上不受支持

r - 如何创建随机种子

multithreading - 多核处理器上的多线程、并发和并行性