CMake 检测到错误版本的 OpenCL

Posted

技术标签:

【中文标题】CMake 检测到错误版本的 OpenCL【英文标题】:CMake detects a wrong version of OpenCL 【发布时间】:2020-09-28 00:16:34 【问题描述】:

在this post 之后,我使用these instructions 安装了NVIDIA 的OpenCL SDK。 clinfo 工具正确检测到 1.2 OpenCL 版本。但是,下面的CMakeLists.txt 文件:

cmake_minimum_required(VERSION 3.1)

project(OpenCL_Example)

find_package(OpenCL REQUIRED)
include_directories($OpenCL_INCLUDE_DIRS)
link_directories($OpenCL_LIBRARY)

add_executable(main main.c)
target_include_directories(main PUBLIC $CMAKE_CURRENT_SOURCE_DIR)
target_link_libraries(main $OpenCL_LIBRARY)

从here复制,检测到错误的OpenCL 1.1版本:

-- 寻找 CL_VERSION_1_1 - 找到 -- 找到 OpenCL:C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v3.2/lib/Win32/OpenCL.lib(找到版本“1.1”)

如果您能帮助我了解问题所在以及如何解决,我将不胜感激。

P.S.1.您可以使用下面的虚拟main.c C 代码进行测试

#include <CL/cl.h>
#include <stdio.h>

int main() 
    printf("Hello, World! \n");
    return 0;

P.S.2. 在this Tweet 之后,我运行cmake .. --debug-find 命令并得到this log。但仍然不确定是什么问题。

P.S.3. 跟着this Tweet,原来我安装了a very outdated CUDA toolkit。卸载它,现在我得到了

-- 找到 OpenCL:C:/Program Files (x86)/IntelSWTools/system_studio_2020/OpenCL/sdk/lib/x86/OpenCL.lib(找到版本“2.2”)

这是英特尔的 SDK。这基本上是Google search“NVIDIA OpenCL SDK 下载”的第二个结果,首先完全令人困惑。所以我不得不卸载它并从这里安装最新版本。 NVIDIA 至少可以提一下,必须安装 CUDA 工具包才能获得 OpenCL SDK!

【问题讨论】:

您在调用find_package() 时是否尝试指定确切的版本?例如:find_package(OpenCL 1.2 EXACT REQUIRED) @squareskittles 感谢您的评论。指定 SDK/SPI/Platfrom 的确切版本实际上是一种不好的做法,但是为了调试问题,它添加了上述命令并得到了 Could NOT find OpenCL: Found unsuitable version "1.1", but required is exact version "1.2" 错误。 我不知道为什么这是不好的做法,尤其是当您在机器上拥有相同软件的多个版本时。您可以查看find_package() 文档的Version Selection 部分,该部分描述了 CMake 如何在不同情况下选择版本。它找到您想要的版本的能力因包而异,并且依赖于存在的版本文件 (opencl-config-version.cmake)。 【参考方案1】:

NVidia Cuda v3.2 是根据 this 于 2010 年 11 月发布的,OpenCL 1.2 规范是在一年后的 2011 年 11 月 15 日发布的。所以我怀疑 cmake 正确地检测到了 OpenCL 1.1

如果您安装了另一个 SDK,并且希望 cmake 检测到 OpenCL 1.2,尽管有另一个支持旧版本的 SDK,您需要在 cmake 中指定该信息。否则它将在搜索路径上找到第一个OpenCL 并停止。所以它应该指定find_package(OpenCL 1.2 REQUIRED) 或@squareskittles 指出find_package(OpenCL 1.2 EXACT REQUIRED) 如果你想要确切的版本。

但是,您可能需要将其他 SDK 路径添加到 PATH 或在 cmake 中指定它们,以便它有机会检查其他 OpenCL 版本。如果您查看 find cmake 宏内容,它们包含一些指定的典型搜索路径,如果您在其他非标准路径中安装了 SDK,您必须自己告诉 cmake。在Windows 上尤其如此,您没有标准更具体的包含或库的安装路径,例如Linux。在Windows 上确实有Program Files,但这太通用了,cmake 必须递归搜索它,我不确定是否支持。

我怀疑您可能仅将 nvidia cuda 3.2 toolkit 路径添加到 PATH 中,或者您仅在 cmake 中指定了该路径。所以问题就在这里。添加其他 SDK 路径可能会解决此问题。

我还认为 clinfo 检查运行时 OpenCL 安装意味着它可以是任何供应商 OpenCL.dll 在您的 NVidia GPU 上支持 OpenCL 1.2 和 cmake 检查 SDK 的标头,其中 OpenCL 版本您安装的 SDK 支持。所以这可能是差异。在这种情况下,您可能需要安装更新的 cuda 工具包。

【讨论】:

请检查 P.S.3.

以上是关于CMake 检测到错误版本的 OpenCL的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 的 OpenCL 特征检测器

由于警告,CMake 未能检测到 pthread

安卓平台下ARM Mali OpenCL编程-GPU信息检测(转)

CMake+OpenCL+CUDA -> 运行时库可能被隐藏

OpenCL无法使用OpenCV检测我的AMD GPU

OpenCL 内核的 LLVM IR 到 PTX 到二进制