【发布时间】:2017-04-26 02:18:10
【问题描述】:
这是一个非常奇怪的情况。为什么会报错
CL_PLATFORM_NOT_FOUND_KHR
当我调用这个函数时:
clGetPlatformIDs(0, NULL, &platformCount);
之前没有这个错误。我已经安装了 Intel 和 Nvidia 的驱动程序和 SDK。有什么建议吗?
【问题讨论】:
这是一个非常奇怪的情况。为什么会报错
CL_PLATFORM_NOT_FOUND_KHR
当我调用这个函数时:
clGetPlatformIDs(0, NULL, &platformCount);
之前没有这个错误。我已经安装了 Intel 和 Nvidia 的驱动程序和 SDK。有什么建议吗?
【问题讨论】:
Here 解释了为什么会发生这种错误。如果函数成功执行并且有非零数量的可用平台,则 clGetPlatformIDs 返回 CL_SUCCESS。否则,如果启用了 cl_khr_icd 扩展并且没有找到平台,它可以返回 CL_PLATFORM_NOT_FOUND_KHR。
【讨论】:
你很幸运。好吧……看到这是 3 年后的事了。
免责声明:我不知道为什么会这样:
机器: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。 我从文档中重建了我需要的结构。我也不 也为函数签名的原型而烦恼。例如, 我通过将其转换为类型“F_03”来调用“clGetPlatformIDs”,然后 这么称呼它。
typedef void* (F_03)( void, void*, void* );
【讨论】:
我的机器没有 GPU,因此不得不将 hashcat 与 OpenCL 一起用于 CPU。我的机器是英特尔酷睿i3,所以我从英特尔网站下载了OpenCL软件并手动安装,错误消失了。
【讨论】: