OpenCL clGetPlatformID仅在从Visual Studio运行时导致访问冲突

时间:2017-04-05 20:57:26

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

这对我来说很奇怪。我正在从我最近迁移到VS2015的旧仓库中拉出一个项目。该解决方案仍然构建并且可执行文件正常工作,但是当在visual studio中运行时,我在调用clGetPlatformIDs()尝试从0x000008E0读取时遇到访问冲突。

老实说,我不知道它可能是什么,因为它很奇怪:构建本身但不是来自VS.通过我调试可以确认所有参数都符合预期,但功能仍然失败。我将OpenCL实现更新到英特尔的OpenCL SDK版本6.3,但这并没有解决问题,我没有符号深入挖掘功能。

代码很简单,但无论如何我都在下面发布。

//Get Platforms
cl_platform_id * platforms = new cl_platform_id[6];
cl_uint numPlatforms = 0;
cl_uint numPlatformsToCheck = 6;
error = clGetPlatformIDs(numPlatformsToCheck, platforms, &numPlatforms);
printCLError( "Getting Platforms", error );

2 个答案:

答案 0 :(得分:2)

所以我遇到了同样的问题:我在任何OpenCL函数上都遇到了访问冲突异常。全新安装英特尔OpenCL SDK,所有驱动程序都是最新的。只有在Visual Studio内部运行时才会发生。

I found a solution.

igdrcl64.dll中存在访问冲突,导致异常。这个库是IntelHD Graphics驱动程序的一部分,显然曾经是DLL中的一个错误。但是我没有安装这个驱动程序(使用NVIDIA显卡),现在也可以修复bug。事实证明,IntelHD驱动程序的卸载程序并没有删除它的所有DLL,因此有问题的DLL已经留在我的机器上而没有更新。

修复:手动删除DLL(仅当您不使用IntelHD图形时!)

在64位版本的Windows操作系统上:
C:\ WINDOWS \ SYSTEM32 \ igdbcl64.dll
C:\ WINDOWS \ SYSTEM32 \ igdfcl64.dll
C:\ WINDOWS \ SYSTEM32 \ igdrcl64.dll
C:\ WINDOWS \ Syswow64资料\ igdbcl32.dll
C:\ WINDOWS \ Syswow64资料\ igdfcl32.dll
C:\ Windows \ SysWOW64 \ igdrcl32.dll

在32位版本的Windows操作系统上:
C:\ WINDOWS \ SYSTEM32 \ igdbcl32.dll
C:\ WINDOWS \ SYSTEM32 \ igdfcl32.dll
C:\ Windows \ System32 \ igdrcl32.dll

我希望这会对某人有所帮助。

答案 1 :(得分:0)

我认为你使用clGetPlatformIDs是错误的。首先,致电clGetPlatformIDs(numPlatformsToCheck, NULL, &numPlatforms);

然后: cl_platform_id * platforms = new cl_platform_id[numPlatforms];

最后:error = clGetPlatformIDs(numPlatformsToCheck, platforms, NULL); printCLError( "Getting Platforms", error );

一般来说,OpenCL查询命令是:

  • 查询以获取列表中的项目数
  • 为列表分配内存
  • 填充列表

问题可能在于,当输入所有参数时,它要么试图找到6个没有6个平台的平台,要么在库中有些时髦。