gpt4 book ai didi

c++ - 动态链接时 OpenCL 崩溃?

转载 作者:行者123 更新时间:2023-11-30 04:07:42 27 4
gpt4 key购买 nike

我正在尝试在运行时加载 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 header 。我的笔记本电脑有 Windows7 64 位,也有 ATI Radeon 7670m GPU,它有 OpenCL 1.1 驱动程序。

最佳答案

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

如果是第一次调用,您将为此传递 INT_MAX 和 NULL。我预计这里会发生崩溃,因为您告诉驱动程序继续并通过您的 NULL 指针进行写入。

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

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

关于c++ - 动态链接时 OpenCL 崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22266795/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com