OpenCL Installable Client Driver (ICD) Loader编译

本文介绍了OpenCLInstallableClientDriver(ICD)Loader的作用,如何通过此中间库实现跨平台的OpenCL应用程序开发,无需依赖特定厂商的SDK,支持动态库和静态编译,确保代码的OpenCLSDK无关性和设备无关性。

ICD是什么?

OpenCL Installable Client Driver (ICD) Loader是实现OpenCL应用程序与各硬件厂商提供的OpenCL驱动(platform)之间隔离的中间库。

从OpenCL 1.2开始,OpenCL提供了一个ICD扩展(cl_khr_icd),它允许不同厂商的多个OpenCL驱动(platform)共存于一个主机系统,应用程序可以通过调用clIcdGetPlatformIDsKHR函数获取所有已经安装的platform的列表,自由选择使用其中的一个platform。
OpenCL Installable Client Driver (ICD) Loader实现了ICD扩展(cl_khr_icd)并提供了所有OpenCL API接口,应用程序可以通过OpenCL Installable Client Driver (ICD) Loader从已经安装的OpenCL驱动(platform)中选择使用一个平台,应用程序的所有OpenCL API请求将被转发到指定的平台。

简单的说,这个Loader Library只是个二传手,它提供了所有OpenCL API的接口,但没有提供实现,所有通过Loader Library调用的OpenCL API请求都会被传递到指定的OpenCL驱动。有了这个中间库,你的项目代码中的OpenCL API请求可以不依赖于任何厂商的OpenCL SDK,可以在没有安装任何OpenCL SDK的环境实现代码编译,你可以以动态库的形式使用它,也可以把这个中间库静态编译到自己的项目代码中,真正的实现OpenCL SDK无关性、设备无关性。
以下是OpenCL官网对ICD的描述:

The OpenCL ICD extension (cl_khr_icd) allows multiple implementations of OpenCL to co-exist on the same system. The OpenCL ICD Loader Library allows applications to choose a platform from the list of installed platforms and dispatches OpenCL API calls to the underlying implementation. Source code for the ICD loader library is available in the Khronos registry. Consult LICENSE.txt in the tarball for full terms and conditions. @ 《opencl-installable-client-driver-icd-loader》

下载

OpenCL Installable Client Driver (ICD) Loader是开源的,需要自己下载源码后编译才能使用,下载地址可以在OpenCL registry上找到,我下载时它是放到了github上。
打开 https://github.com/KhronosGroup/OpenCL-ICD-Loader,点击"Doanload ZIP",下载ZIP格式的压缩包,解压到本地。
这里写图片描述
下载的OpenCL-ICD-Loader-master.zip包并不能直接编译。还缺少一些必要的opencl头文件。

然后打开 ./inc/README.txt,下面是README.txt中的内容。

Copy or symlink {OpenCL, EGL, KHR} headers here, inside appropriate
directories, so that the structure of the inc directory looks something like
this:

inc/CL/cl_d3d10.h
inc/CL/cl_d3d11.h
inc/CL/cl_dx9_media_sharing.h
inc/CL/cl_ext.h
inc/CL/cl_gl_ext.h
inc/CL/cl_gl.h
inc/CL/cl.h
inc/CL/cl.hpp
inc/CL/cl_platform.h
inc/CL/opencl.h
inc/EGL/eglext.h
inc/EGL/egl.h
inc/EGL/eglplatform.h
inc/KHR/khrplatform.h

根据README.txt的要求,需要把OpenCL的标准头文件复制到inc/CL文件夹下**(注意这里CL要大写)**。

OpenCL是个开放标准,关于OpenCL标准所有的官方文档都可以在khronos的官方网站获取–>https://www.khronos.org/opencl/,打开这个链接(https://www.khronos.org/registry/cl/),你会看到每个OpenCL正式版本的的标准头文件。

OpenCL的标准从1.0开始,到现在最新版本已经是2.1了,应该下载哪个版本的头文件呢?
因为OpenCL Installable Client Driver (ICD) Loader是设计用来支持所有OpenCL平台的,所以这里应该下载最新版本的OpenCL头文件。
这里写图片描述
鼠标右键点击上图中列表中的11个链接下载.h文件到./inc/CL目录下(.hpp文件也可以下载,但编译ICD用不上)。
更直观的办法可以打开这个地址下载 https://www.khronos.org/registry/cl/api/2.1
这里写图片描述

另外README.txt中只要求CL中的10个.h文件,不需要cl_egl.h,但下载下来也没关系。

然后去https://www.khronos.org/registry/egl/api/EGL/下载eglext.h,egl.h,eglplatform.h这三个文件放在./inc/EGL/文件夹下

然后去https://www.khronos.org/registry/egl/api/KHR/下载khrplatform.h文件放在./inc/KHR/文件夹下

所有必要的文件都下载后,目录结构如下图
这里写图片描述

编译

然后就可以参照源./README.txt的说明进行编译了。

== Building ICD and ICD Test ==
The build system will build ICD Loader library (OpenCL.dll or libOpenCL.so) and
ICD Loader Test binary (icd_loader_test) and some helper libraries for the test.
=== Linux ===
Run “make”
=== Windows ===
Run “build_using_cmake.bat”

在Windows下,如果安装了VC直接运行build_using_cmake.bat就可以编译了,编译后会生成一个build文件夹,所有目标文件和中间文件都生成在这个目录下。
Windows下如果用GCC编译的话,要用cmake来生成Makefile,编译也能通过,但因为生成的dll文件名不符合Windows习惯,测试程序在运行时会报错找不到dll文件,需要修改CMakeLists.txt文件解决。

<think>好的,我现在需要帮助用户解决在Windows 7 64位系统上运行hashcat64.exe时遇到的OpenCL错误,尤其是无法找到OpenCL ICD Loader库的问题。首先,我应该回顾之前的对话,确保不重复信息,但可能需要更深入地探讨这个问题。 用户提到“无法找到OpenCL ICD Loader库”,这可能与系统缺少必要的OpenCL文件或路径配置有关。根据之前的回答,我已经提到了更新驱动、安装运行时和配置环境变量。现在需要更具体地针对ICD Loader的问题。 首先,ICDInstallable Client DriverLoaderOpenCL的一部分,允许系统管理多个厂商的OpenCL实现。如果系统找不到这个库,可能是因为相关DLL文件缺失或路径不正确。常见的DLL文件是OpenCL.dll,可能位于系统目录或显卡驱动的安装路径中。 接下来,我需要考虑用户可能没有正确安装OpenCL运行时。例如,AMD和NVIDIA的驱动通常包含这些文件,但用户可能安装了不完整的驱动,或者文件被安全软件误删。此外,Windows 7本身可能缺少某些更新,导致支持不足。 用户可能需要手动安装OpenCL ICD Loader。微软官方可能不提供单独的安装包,但可以从第三方或显卡厂商获取。例如,Intel提供了OpenCL运行时,用户可能需要安装这个,即使他们没有Intel显卡,但不确定是否适用。 另一个可能性是环境变量中的路径没有包含OpenCL的DLL位置。用户可能需要手动添加路径或复制DLL文件到系统目录。但需要注意,不同显卡厂商的DLL路径不同,需要根据用户的硬件进行指导。 此外,用户可能需要检查系统是否安装了Visual C++ Redistributable,因为某些运行时依赖这些组件。尤其是旧版本的软件可能需要特定版本的VC++运行时。 还可能存在权限问题,例如DLL文件被拒绝访问,或者系统文件损坏。建议用户运行系统文件检查器(sfc /scannow)来修复系统文件。 总结可能的解决步骤: 1. 确认显卡驱动已正确安装,包含OpenCL组件。 2. 安装或修复OpenCL ICD Loader,可能需要手动下载DLL。 3. 检查系统路径是否正确配置,包含OpenCL库的路径。 4. 安装必要的系统更新和运行时库,如VC++ Redistributable。 5. 使用诊断工具如GPU Caps Viewer或clinfo验证OpenCL是否正确安装。 6. 处理可能的文件缺失或损坏,如复制DLL到系统目录。 需要确保步骤清晰,适合Windows 7用户操作,并考虑到用户可能的技术水平,提供具体的下载链接和命令行示例。同时,提醒用户注意驱动兼容性,特别是Windows 7的支持可能有限,可能需要旧版驱动或补丁。</think>### Hashcat64.exe在Win7 64位系统下OpenCL错误与ICD Loader缺失解决方案 --- #### 一、**核心问题定位:OpenCL ICD Loader缺失** 错误提示“**无法找到OpenCL ICD Loader库**”表明系统缺失或未正确注册OpenCL的动态链接库(如`OpenCL.dll`),或显卡驱动未提供完整的OpenCL支持。以下是针对性解决方案: --- #### 二、**关键修复步骤** 1. **手动安装OpenCL ICD Loader** - **Intel官方方案**(通用性强): 1. 下载 [Intel® OpenCL™ Runtime for Legacy GPUs](https://www.intel.com/content/www/us/en/developer/articles/tool/opencl-drivers.html) 2. 安装时勾选 **"OpenCL ICD"** 组件(即使无Intel显卡,此操作可修复系统级ICD注册)[^1] - **AMD/NVIDIA替代方案**: - 从显卡驱动包提取`OpenCL.dll`: ```bash # 路径示例(NVIDIA默认安装路径): C:\Program Files\NVIDIA Corporation\OpenCL\OpenCL.dll # AMD路径: C:\Windows\System32\amdvlk64.dll # 可能需要重命名为OpenCL.dll ``` - 将文件复制到以下目录: ``` C:\Windows\System32 C:\Windows\SysWOW64 # 确保覆盖32位和64位环境 ``` 2. **修复系统依赖项** - 安装 **Visual C++ 2010 Redistributable**(x86+x64): - [Microsoft官方下载](https://learn.microsoft.com/zh-CN/cpp/windows/latest-supported-vc-redist?view=msvc-170) - 运行系统文件检查: ```cmd sfc /scannow ``` 3. **注册表修复(高危操作需谨慎)** - 创建注册表项(若缺失): ```reg Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\OpenCL\Vendors] "C:\\Windows\\System32\\OpenCL.dll"=dword:00000000 ``` - 保存为`.reg`文件并双击导入[^2] --- #### 三、**驱动与运行环境配置** 1. **强制指定OpenCL实现** - 通过环境变量强制使用显卡厂商的ICD: ```cmd set OPENICD_LOADER_DEBUG=1 # 启用调试日志 set OPENCL_VENDOR_PATH=C:\Program Files\NVIDIA Corporation\OpenCL ``` - 运行Hashcat时附加平台参数: ```bash hashcat64.exe --opencl-platforms 1 --force -m 0 example.hash ``` 2. **驱动降级方案(针对老旧显卡)** - **NVIDIA**:安装 **R390分支驱动**(支持GeForce 400/500系列) - [驱动下载页面](https://www.nvidia.cn/Download/index.aspx) → 选择 **Windows 7 64位** → 版本 **391.35** - **AMD**:使用 **Crimson ReLive 17.7.1**(支持HD 7000及更早型号) - [AMD旧驱动库](https://www.amd.com/zh-hans/support/previous-drivers) --- #### 四、**验证与调试** 1. **诊断工具检查** - 运行 **clinfo.exe**: ```cmd clinfo.exe > output.txt ``` - 检查输出中是否包含 `ICD Loader` 版本及设备信息 - 使用 **GPU-Z** → 查看 **OpenCL** 支持状态是否激活 2. **Hashcat专用调试命令** ```bash hashcat64.exe -I # 显示可用OpenCL设备列表 hashcat64.exe -b # 运行基准测试,观察错误细节 ``` --- #### 五、**终极解决方案(如仍失败)** 1. **使用Hashcat Legacy版本** 下载兼容旧版OpenCL的Hashcat v5.x: ```bash https://hashcat.net/forum/thread-9210.html # 官方旧版存档 ``` 2. **虚拟机或Linux子系统** - 在Windows 7内通过 **VirtualBox** 安装 **Kali Linux** → 直接使用Linux版Hashcat(规避Win7兼容性问题) --- ### 相关问题 1. 如何判断OpenCL.dll文件是否被系统正确加载? 2. Hashcat报错"ERROR: clGetDeviceIDs() -1"该如何处理? 3. 在Windows 7中如何彻底清除残留的OpenCL注册表项? --- **引用说明** [^1]: Intel OpenCL运行时包含通用ICD Loader,可修复多厂商兼容性问题 [^2]: 注册表操作需备份系统,错误修改可能导致OpenCL功能完全失效
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值