C++ Can';t使用最新的API CL/cl2.hpp运行任何可用的OpenCL样本

C++ Can';t使用最新的API CL/cl2.hpp运行任何可用的OpenCL样本,c++,opencl,C++,Opencl,我正在尝试开始使用OpenCL。安装后,我发现与几乎所有在线教程相比有点奇怪,没有cl.hpp标题,只有cl2.hpp。我知道这是一个新版本。新版本的API,几乎没有可用的教程 我发现的教程无法编译。例如,这个()无法编译,因为有一个未定义的变量,如果我避开它,它会报告我没有OpenCL2.0设备。我能够通过设备检查(),但当我试图创建上下文(设备被找到)时,它崩溃了 我正在尝试的代码: std::vector<cl::Platform> all_platforms; cl::Pla

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

我发现的教程无法编译。例如,这个()无法编译,因为有一个未定义的变量,如果我避开它,它会报告我没有OpenCL2.0设备。我能够通过设备检查(),但当我试图创建上下文(设备被找到)时,它崩溃了

我正在尝试的代码:

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]<<" ";
}
std::vector所有_平台;
cl::平台::获取(&所有_平台);
如果(所有平台.size()==0){

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

#定义CL_HPP_最小值_OPENCL_版本120
#定义CL\U HPP\U目标\U OPENCL\U版本120
#包括

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

简单看一下,我看不出您的代码有任何问题,我也不认为cl2.hpp是“坏的”,因为我在工作中一直在使用它。您可能需要将
CL\u hpp\u TARGET\u OPENCL\u VERSION
设置为120(例如)如果您的CL驱动程序不支持CL2.0。我无法在那里设置较低的版本,如果我尝试,它会报告“CL_HPP_MINIMUM_OPENCL_version不得大于CL_HPP_TARGET_OPENCL_version”,CL_HPP_MINIMUM_OPENCL_version在CL2.HPP.Hmm中设置为200,奇怪。CL2.HPP应该支持CL从1.0到2.0(至少)的所有版本。但可能您需要同时设置这两个。您同时设置这两个是什么意思?软件甚至没有v1标头(cl.hpp)包含。它确实有cl.h标题,但该标题也有同样的问题。使用
#定义'cl#u HPP#u MINIMUM#u OPENCL#u VERSION 120
或类似的内容,在
#include
之前-您不应该再使用cl.HPP了,cl2.HPP是一个功能齐全的替代品,afaict。如果您知道,请告诉我,哪里可以找到它d在OpenCL v1.2中使用OpenCL CLHPP的示例?对不起,不知道示例。
#define CL_HPP_MINIMUM_OPENCL_VERSION 120
#define CL_HPP_TARGET_OPENCL_VERSION 120
#include <CL/cl2.hpp>