【问题标题】:Can't run any available OpenCL sample with recent API CL/cl2.hpp无法使用最近的 API CL/cl2.hpp 运行任何可用的 OpenCL 示例
【发布时间】:2016-11-16 00:54:43
【问题描述】:

我正在尝试开始使用 OpenCL。安装后发现和网上几乎所有的教程相比有点奇怪,没有cl.hpp头文件,只有cl2.hpp。我知道这是一个新版本。新版本的 API,几乎没有教程。

我找到的教程编译失败。例如,这个(http://github.khronos.org/OpenCL-CLHPP/)由于未定义的变量而无法编译,如果我避免它,它会报告我没有 OpenCL 2.0 设备。我能够通过设备检查 (http://simpleopencl.blogspot.cz/2013/06/tutorial-simple-start-with-opencl-and-c.html),但是当我尝试创建上下文时它崩溃了(找到了设备)。

我正在尝试的代码:

std::vector<cl::Platform> all_platforms;
cl::Platform::get(&all_platforms);
if(all_platforms.size()==0){
    std::cout<<" No platforms found. Check OpenCL installation!\n";
    exit(1);
}
cl::Platform default_platform=all_platforms[0];
std::cout << "Using platform: "<<default_platform.getInfo<CL_PLATFORM_NAME>()<<"\n";

//get default device of the default platform
std::vector<cl::Device> all_devices;
default_platform.getDevices(CL_DEVICE_TYPE_ALL, &all_devices);
if(all_devices.size()==0){
    std::cout<<" No devices found. Check OpenCL installation!\n";
    exit(1);
}
cl::Device default_device=all_devices[0];
std::cout<< "Using device: "<<default_device.getInfo<CL_DEVICE_NAME>()<<"\n";


cl::Context context({default_device}); // null pointer read here

cl::Program::Sources sources;

// kernel calculates for each element C=A+B
std::string kernel_code=
        " void kernel simple_add(global const int* A, global const int* B, global int* C){ "
        " C[get_global_id(0)]=A[get_global_id(0)]+B[get_global_id(0)]; "
        " } ";
sources.push_back({kernel_code.c_str(),kernel_code.length()});

cl::Program program(context,sources);
if(program.build({default_device})!=CL_SUCCESS){
    std::cout<<" Error building: "<<program.getBuildInfo<CL_PROGRAM_BUILD_LOG>(default_device)<<"\n";
    exit(1);
}

// create buffers on the device
cl::Buffer buffer_A(context,CL_MEM_READ_WRITE,sizeof(int)*10);
cl::Buffer buffer_B(context,CL_MEM_READ_WRITE,sizeof(int)*10);
cl::Buffer buffer_C(context,CL_MEM_READ_WRITE,sizeof(int)*10);

int A[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int B[] = {0, 1, 2, 0, 1, 2, 0, 1, 2, 0};

//create queue to which we will push commands for the device.
cl::CommandQueue queue(context,default_device);

//write arrays A and B to the device
queue.enqueueWriteBuffer(buffer_A,CL_TRUE,0,sizeof(int)*10,A);
queue.enqueueWriteBuffer(buffer_B,CL_TRUE,0,sizeof(int)*10,B);


//run the kernel
cl::KernelFunctor simple_add(cl::Kernel(program,"simple_add"),queue,cl::NullRange,cl::NDRange(10),cl::NullRange);
simple_add(buffer_A,buffer_B,buffer_C);

//alternative way to run the kernel
cl::Kernel kernel_add=cl::Kernel(program,"simple_add");
kernel_add.setArg(0,buffer_A);
kernel_add.setArg(1,buffer_B);
kernel_add.setArg(2,buffer_C);
 queue.enqueueNDRangeKernel(kernel_add,cl::NullRange,cl::NDRange(10),cl::NullRange);
queue.finish();

int C[10];
//read result C from the device to array C
queue.enqueueReadBuffer(buffer_C,CL_TRUE,0,sizeof(int)*10,C);

std::cout<<" result: \n";
for(int i=0;i<10;i++){
    std::cout<<C[i]<<" ";
}

我在 Ubuntu 16.04 上的 Intel(R) HD Graphics IvyBridge M GT2 上使用 Intel Gen OCL 驱动程序。

知道我做错了什么吗?

【问题讨论】:

  • 简要地看一下,我看不出你的代码有什么问题,我也不相信 cl2.hpp 是“坏的”,因为我在工作中一直在使用它。如果您的 CL 驱动程序不支持 CL2.0,您可能需要将 CL_HPP_TARGET_OPENCL_VERSION 设置为 120(例如)。
  • 我不能在那里设置较低的版本,如果我尝试,它会报告'CL_HPP_MINIMUM_OPENCL_VERSION不能大于CL_HPP_TARGET_OPENCL_VERSION'并且CL_HPP_MINIMUM_OPENCL_VERSION在cl2.hpp中设置为200。
  • 嗯,奇怪。 cl2.hpp 应该支持从 1.0 到 2.0 的所有 CL 版本(至少)。但也许你需要同时设置。
  • 两者都设置是什么意思?该软件甚至没有包含 v1 标头 (cl.hpp)。它确实有 cl.h 标头,但它也遇到了同样的问题。
  • #include &lt;CL/cl2.hpp&gt; 之前使用 #define 'CL_HPP_MINIMUM_OPENCL_VERSION 120 或类似的东西 - 你永远不必再使用 cl.hpp,cl2.hpp 是一个功能齐全的替代品,afaict。

标签: c++ opencl


【解决方案1】:

如果驱动程序不支持 CL2.0,则需要通过将 CL 的最低版本和目标版本设置为相关版本(例如 1.2)来“降低对 cl2.hpp 的期望”:

#define CL_HPP_MINIMUM_OPENCL_VERSION 120
#define CL_HPP_TARGET_OPENCL_VERSION 120
#include <CL/cl2.hpp>

这样,cl2.hpp 中的代码将针对 CL1.2 环境进行编译。

【讨论】:

  • 如果您知道,请问哪里可以找到将 OpenCL-CLHPP 与 opencl v1.2 结合使用的示例?
  • 抱歉,不知道例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 2012-01-02
  • 2012-08-27
  • 2016-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多