我正在尝试在运行时加载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驱动程序。
答案 0 :(得分:2)
clGetPlatformIDs
的第一个参数是允许驱动程序写入第二个元素指向的数组的元素数。
如果是第一次调用,则为这些调用传递INT_MAX和NULL。我希望在这里发生崩溃,因为你告诉驱动程序继续写下你的NULL指针。
您应该为第一个参数传递0,因为您感兴趣的只是返回的第三个参数值。
在第二个调用中,您至少为第二个参数传递有效内存,但是您再次传递INT_MAX。在这里你应该传递nplatforms
,因为那是你分配的内存量。对于第三个参数,传递NULL,因为您不需要返回值(再次)。