【问题标题】:How to choose OpenCL implementation with CMake?如何使用 CMake 选择 OpenCL 实现?
【发布时间】:2017-07-05 19:06:37
【问题描述】:

我有一个使用一些 AMD 扩展的 Windows OpenCL 应用程序。此外,我的应用程序有一些可选的 CUDA 组件。使用 CMake 构建 Visual Studio 解决方案时,FindOpenCL 模块选择 Nvidia OpenCL 实现而不是 AMD。有没有简单的方法让 CMake 使用 AMD 版本?

我尝试在 FindOpenCL 模块代码中注释 Nvidia 部分,但这不起作用。是否有一些我可以修改的注册表设置?我在安装 AMD 的 SDK 后安装了 CUDA。安装顺序会有所不同吗?

【问题讨论】:

  • 查询平台名称,如果有amd则选中。或者您可以尝试重命名/移动 nvidia 的 icd 文件。
  • 您的意思是在 CMake 上查询平台名称吗?或者用 OpenCL 代码查询它?如果是后者,那与我的用例不同,因为由于扩展,我需要在编译时实现 AMD
  • 我的意思是在 OpenCL 代码中。也许您可以从PATH等环境变量中临时删除icd文件位置?
  • 您使用的哪组包含文件独立于您在运行时选择的平台和设备。例如,我的头文件总是使用旧的 AMD SDK,但代码在 AMD、NVIDIA 和 Intel 上运行。换句话说,您不会在编译时选择实现。
  • 要在运行时选择特定平台和设备,只需搜索其已知名称(或“NVIDIA”等子字符串)。或者,正如 HTB 上面建议的那样,您可以手动从 ICD 中删除项目(在注册表中,如果在 Windows 上;HLM\SOFTWARE\Khronos\OpenCL\Vendors),但这仅适用于您自己的机器(不要以编程方式执行到用户的机器上!)。

标签: cmake opencl


【解决方案1】:

最后,起作用的是从find_libraryfind_path 命令中的PATHS 建议中删除NVIDIA 环境变量并添加NO_DEFAULT_PATH。问题是,即使我删除了这些建议,CMake 仍在添加默认路径,其中包括 NVIDIA 的 OpenCL 实现。这两个命令最终如下所示:

find_path(OpenCL_INCLUDE_DIR
  NAMES
    CL/cl.h OpenCL/cl.h
    NO_DEFAULT_PATH
  PATHS
    ENV "PROGRAMFILES(X86)"
    ENV AMDAPPSDKROOT
    ENV ATISTREAMSDKROOT
  PATH_SUFFIXES
    include
    OpenCL/common/inc
    "AMD APP/include")

 find_library(OpenCL_LIBRARY
      NAMES OpenCL
      NO_DEFAULT_PATH 
      PATHS
        ENV "PROGRAMFILES(X86)"
        ENV AMDAPPSDKROOT
        ENV ATISTREAMSDKROOT
      PATH_SUFFIXES
        "AMD APP/lib/x86_64"
        lib/x86_64
        lib/x64
        OpenCL/common/lib/x64)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多