动态链接时OpenCL崩溃了吗?

时间:2014-03-08 08:05:52

标签: c++ qt opencl

我正在尝试在运行时加载OpenCL库,以便相同的exe可以在没有OpenCL驱动程序的平台上运行而不会找到未解析的符号。我正在使用Qt这样做,但我不认为我因Qt而面临问题。这是我的函数,它检查是否安装了OpenCL 1.1:

QLibrary *MyOpenCL::openCLLibrary = NULL;

bool MyOpenCL::loadOpenCL()
{
    if(openCLLibrary)
        return  true;

    QLibrary *lib = new QLibrary("OpenCL");
    if(!lib->load())
        return false;

    bool result = false;
    typedef cl_int (*MyPlatorms)(cl_uint, cl_platform_id *, cl_uint *);
    MyPlatorms pobj = (MyPlatorms) lib->resolve("clGetPlatformIDs");
    if(pobj)
    {
        cl_uint nplatforms = 0;
        cl_uint myerr = pobj(0, NULL, &nplatforms);
        if((myerr == CL_SUCCESS) && (nplatforms > 0))
        {
            cl_platform_id *mplatforms = new cl_platform_id[nplatforms];
            myerr = pobj(nplatforms, mplatforms, NULL);

            typedef cl_int (*MyPlatformInfo)(cl_platform_id, cl_platform_info, size_t, void *, size_t *);
            MyPlatformInfo pinfoobj = (MyPlatformInfo) lib->resolve("clGetPlatformInfo");
            if(pinfoobj)
            {
                size_t size;
                for(unsigned int i = 0; i < nplatforms; i++)
                {
                    size = 0;
                    myerr = pinfoobj(mplatforms[i], CL_PLATFORM_VERSION, 0, NULL, &size);//size = 27
                    if(size < 1)
                        continue;

                    char *ver = new char[size];
                    myerr = pinfoobj(mplatforms[i], CL_PLATFORM_VERSION, size, ver, NULL);
                    qDebug() << endl << ver;//segmentation fault at this line
...
}

可以看出Qt成功解析了clGetPlatformIDs()。它甚至表明有1个平台可用。但是当我传递数组来存储cl_platform_id时,它会崩溃。 为什么会这样?

修改 我正在使用Qt 4.8.1与MinGW编译器使用OpenCL APP SDK 2.9。 我正在使用Khronos网站的OpenCL 1.1标题。 我的笔记本电脑有Windows7 64位也有ATI Radeon 7670m GPU,有OpenCL 1.1驱动程序。

1 个答案:

答案 0 :(得分:2)

clGetPlatformIDs的第一个参数是允许驱动程序写入第二个元素指向的数组的元素数。

如果是第一次调用,则为这些调用传递INT_MAX和NULL。我希望在这里发生崩溃,因为你告诉驱动程序继续写下你的NULL指针。

您应该为第一个参数传递0,因为您感兴趣的只是返回的第三个参数值。

在第二个调用中,您至少为第二个参数传递有效内存,但是您再次传递INT_MAX。在这里你应该传递nplatforms,因为那是你分配的内存量。对于第三个参数,传递NULL,因为您不需要返回值(再次)。