CMake 检测到错误版本的 OpenCL

CMake detects a wrong version of OpenCL

按照this post, where I have used 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 版本:

-- Looking for CL_VERSION_1_1 - found
-- Found OpenCL: C:/Program Files/NVIDIA GPU Computing Toolkit/CUDA/v3.2/lib/Win32/OpenCL.lib (found version "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, I ran the cmake .. --debug-find command and got this log。但是还是不知道是什么问题。

P.S.3. 关注 this Tweet, it turns out that I had installed a very outdated CUDA toolkit。卸载它,现在我得到

-- Found OpenCL: C:/Program Files (x86)/IntelSWTools/system_studio_2020/OpenCL/sdk/lib/x86/OpenCL.lib (found version "2.2")

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

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 的头文件您安装的 SDK 支持哪个 OpenCL 版本。所以这可能是差异。在这种情况下,您可能需要安装更新的 cuda 工具包。