OpenCL 1.2 C++ Wrapper - 对clReleaseDevice的未定义引用

lev*_*que 5 nvidia opencl

我正在尝试将OpenCL C++包装器API用于以下程序:

#define __CL_ENABLE_EXCEPTIONS


#include <CL/cl.hpp>
#include <cstdio>
#include <cstdlib>
#include <iostream>

 const char helloStr []  = "__kernel void "
                          "hello(void) "
                          "{ "
                          "  "
                          "} ";

 int
 main(void)
 {
    cl_int err = CL_SUCCESS;
    try {

      std::vector<cl::Platform> platforms;
      cl::Platform::get(&platforms);
      if (platforms.size() == 0) {
          std::cout << "Platform size 0\n";
          return -1;
      }

      cl_context_properties properties[] =
         { CL_CONTEXT_PLATFORM, (cl_context_properties)(platforms[0])(), 0};
      cl::Context context(CL_DEVICE_TYPE_CPU, properties);

      std::vector<cl::Device> devices = context.getInfo<CL_CONTEXT_DEVICES>();

      cl::Program::Sources source(1,
          std::make_pair(helloStr,strlen(helloStr)));
      cl::Program program_ = cl::Program(context, source);
      program_.build(devices);

      cl::Kernel kernel(program_, "hello", &err);

      cl::Event event;
      cl::CommandQueue queue(context, devices[0], 0, &err);
      queue.enqueueNDRangeKernel(
          kernel,
          cl::NullRange,
          cl::NDRange(4,4),
          cl::NullRange,
          NULL,
          &event);

      event.wait();
    }
    catch (cl::Error err) {
       std::cerr
          << "ERROR: "
          << err.what()
          << "("
          << err.err()
          << ")"
          << std::endl;
    }

   return EXIT_SUCCESS;
 }
Run Code Online (Sandbox Code Playgroud)

我使用该博客文章中的相同内核文件,无论如何这不是问题,因为我无法通过编译.

我正在使用以下命令编译程序:

g++ example.cpp -o example -l OpenCL
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

/tmp/ccbUf7dB.o: In function `cl::detail::ReferenceHandler<_cl_device_id*>::release(_cl_device_id*)':
example.cpp:(.text._ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE7releaseES3_[_ZN2cl6detail16ReferenceHandlerIP13_cl_device_idE7releaseES3_]+0x14): undefined reference to `clReleaseDevice'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

我读过关于clReleaseDevice不能用于传统设备的东西(例如参见这个问题),但我的显卡是最近的(NVidia GTX 660 Ti,支持OpenCL 1.2).我从哪里可以去哪里?

我在Ubuntu 13.04 x64上使用nvidia-opencl-dev和从ubuntu存储库安装的opencl-headers运行它.

chi*_*ies 10

根本原因

问题是您链接的OpenCL库不支持OpenCL 1.2.一般来说,在支持您要使用的版本的OpenCL实现可用于特定平台之前,在链接到随其提供的OpenCL共享库时,您将遇到此问题.有两种解决方案:

  • 从Khronos下载与您选择的硬件提供的OpenCL版本匹配的cl.hpp版本,并继续使用设备制造商提供的库.
  • 链接实现最新OpenCL标准的OpenCL共享库,但编写多个代码路径 - 每个OpenCL版本一个,确保每个代码路径仅使用该版本支持的OpenCL函数.这条路线更难,我不知道你怎么能用C++包装器做到这一点.如果您尝试在不支持OpenCL 1.2的平台上调用OpenCL 1.2函数,您将获得段错误,这就是需要不同代码路径的原因.

Nvidia具体

Nvidia在提供OpenCL 1.2支持方面进展缓慢.因此,他们的OpenCL库没有提供链接器正在寻找的OpenCL 1.2函数,从而导致错误.

2015年5月底,Nvidia发布了支持OpenCL 1.2的驱动程序,请参阅下面的Z Boson的评论.更新驱动程序应解决链接器错误.GeForce GTX 6xx及更高版本的卡(前几代品牌除外)支持OpenCL 1.2.您可以检查Khronos OpenCL站点上的符合要求的产品列表以确保.列出了GTX 660 Ti,所以你很幸运.

  • Nvidia现在支持Linux和Windows上的OpenCL 1.2 http://www.phoronix.com/scan.php?page=article&item=amdnv-phoronix-11&num=5"最近,NVIDIA最终还为其专有的Linux驱动程序添加了OpenCL 1.2支持. " 和https://devtalk.nvidia.com/default/topic/540773/opencl-1-2-support-in-nvidia-drivers/"是的,来自NVIDIA 352.84和352.63的最新Win10驱动程序包括OpenCL 1.2支持." (2认同)