【发布时间】: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 <CL/cl2.hpp>之前使用#define 'CL_HPP_MINIMUM_OPENCL_VERSION 120或类似的东西 - 你永远不必再使用 cl.hpp,cl2.hpp 是一个功能齐全的替代品,afaict。