这是一个非常奇怪的情况。为什么我会收到错误
CL_PLATFORM_NOT_FOUND_KHR
当我调用这个函数时:
clGetPlatformIDs(0, NULL, &platformCount);
早些时候这个错误不是。我已经安装了 Intel 和 Nvidia 的驱动程序和 SDK。有什么建议吗?
这里解释了为什么会发生这样的错误。如果函数成功执行并且可用的平台数量非零,则 clGetPlatformIDs 返回 CL_SUCCESS。否则,如果启用了 cl_khr_icd 扩展并且没有找到平台,它可以返回 CL_PLATFORM_NOT_FOUND_KHR。
你很幸运。好吧……看到这是三年后的事了。
免责声明:我不知道为什么会这样:
机器:x64 windows 10。
显卡:Geforce GTX 960
加载库完全失败 :LoadLibraryA(“OpenCL64.dll”)
错误(但加载) :LoadLibraryA("C:/Program Files/NVIDIA Corporation/OpenCL/OpenCL64.dll")
错误(但加载) :LoadLibraryA("C:/Program Files/NVIDIA Corporation/OpenCL/OpenCL.dll")
正确:LoadLibraryA(“OpenCL.dll”)
这是真正的内幕:我的两个“错误”答案都可以让您获取函数指针,但是当您调用 clGetPlatformIDs 时,返回状态将为 0xFFFFFC17 ( CL_PLATFORM_NOT_FOUND_KHR )。
然后你将检查你的函数调用的正确性。也许您甚至会查看调用约定。也许你会检查头文件并确保那里没有任何拼写错误。然而,您正在寻找所有错误的地方,因为最初的问题比您想象的要退一步。
由于这个问题,我在我的程序中构建了读取文件的代码:“OPEN_CL_SEARCH_PATHS.TXT”,因此软件用户可以更改程序尝试加载的 DLL 文件。
当我在这里时,我还想补充一点,驱动程序似乎存在一个错误,因此 OpenCL <==> OpenGL 共享不是零拷贝共享,而且非常滞后。现在我必须弄清楚 Vulkan 来制作我的分形渲染引擎,尽管 OpenCL 的抽象更适合这个问题。
值得注意的是,我没有使用 SDK 或任何验证层。事实上,我什至没有使用 windows.h。我编写了汇编代码,通过导航 PEB 文件来获取 GetProcAddress 和 LoadLibrary 的地址。我也没有使用 cl.h 或 cl_platform.h。我从文档中重建了我需要的结构。我也不在乎函数签名的原型。例如,我通过将“clGetPlatformIDs”转换为类型“F_03”然后以这种方式调用它来调用它。
typedef void* ( F_03)( void , void*, void* );
我的机器没有 GPU,因此不得不将 hashcat 与 OpenCL 一起用于 CPU。我的机器是 Intel core i3,所以我从 Intel 网站下载了 OpenCL 软件并手动安装,错误消失了。