这对我来说很奇怪。我正在从我最近迁移到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 );
答案 0 :(得分:2)
所以我遇到了同样的问题:我在任何OpenCL函数上都遇到了访问冲突异常。全新安装英特尔OpenCL SDK,所有驱动程序都是最新的。只有在Visual Studio内部运行时才会发生。
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个平台的平台,要么在库中有些时髦。