OpenCl不能使用clGetPlatformID

时间:2016-07-23 15:44:37

标签: c++ visual-c++ opencl

我一直在尝试学习OpenCl,但每次我把这个命令都用掉了, 这是一个简单的代码,我已经隔离了错误: clGetPlatformIDs导致了以下错误:

OpenCl-OpenGl.exe中0x778d15ee处的未处理异常:0xC0000005:访问冲突。

然后程序给出选项" Break"或者"继续"

#pragma comment(lib, "OpenCL.lib")
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <CL/cl.h>

int main() {
    cl_platform_id platform;
    cl_int  err;
    err = clGetPlatformIDs(1, &platform, NULL);

    return 0;

}

1 个答案:

答案 0 :(得分:1)

可能有以下原因:

  1. 您的系统上有多个OpenCL.dll,并且根据选择(或某些VS设置,环境路径),可执行文件正在加载旧版本。检查VS模块窗口(Debug&gt; Window&gt; Modules)是否已加载正确的OpenCL.dll(C:\ Windows \ SysWow64或C:\ Windows \ System32)。

  2. 虽然clGetPatformIDs中的第3个参数是可选的,但我知道一些较旧的Intel OpenCL供应商库(intelopencl32.dll或intelopencl64.dll)不会检查这个并且可能会尝试写入该nullptr。我建议尝试添加一个接收平台计数的第3个参数。

  3. 如果两者似乎都没有解决问题,请在发生崩溃时/发布崩溃时从Visual Studio发布堆栈转储。另外,检查调试输出窗口以查看它是读取还是写入访问冲突。所有窗口都可以在菜单Debug&gt;下找到。 Windows&gt;输出。你也可以在那里找到Stack和Modules。

  4. 编辑:我刚刚使用最新的OpenCL.dll版本进行了测试,并且只提供了一个包含1个条目的数组,就像您一样。尽管如此,OpenCL.dll写入了3个元素,这意味着它在允许的数组边界之外写入。巧合的是,我有3个平台。

    当你提供cl_platform_id类型的单个变量时,这种行为会损坏堆栈,在这个简短的程序中,很可能会损坏clGetPlatformIds的返回地址,从而导致崩溃。我必须进一步调查。尝试同时使用cl_platform_id平台[8]数组。它看起来像我的OpenCl.dll版本2.01中的一个错误

    试试这段代码:

    cl_uint PlatformCount = 0;
    cl_platform_id Platforms[8] = { 0 };
    
    cl_int Status = clGetPlatformIDs(sizeof(Platforms) / sizeof(Platforms[0]), Platforms, &PlatformCount);
    if (Status != CL_SUCCESS || PlatformCount == 0)
      error(...)