以下是一个简单的OpenCL应用程序的完整C++代码示例,它将两个向量相加:
#include <iostream>
#include <vector>
#include <CL/cl.hpp>
int main() {
// 创建OpenCL上下文
std::vector<cl::Platform> platforms;
cl::Platform::get(&platforms);
cl::Context context;
std::vector<cl::Device> devices;
platforms[0].getDevices(CL_DEVICE_TYPE_GPU, &devices);
context = cl::Context(devices);
// 创建OpenCL命令队列
cl::CommandQueue queue(context, devices[0]);
// 创建OpenCL内核
std::string kernel_code =
"__kernel void vector_add(__global const float* a, __global const float* b, __global float* c) {\n"
" int i = get_global_id(0);\n"
" c[i] = a[i] + b[i];\n"
"}";
cl::Program::Sources sources;
sources.push_back({kernel_code.c_str(), kernel_code.length()});
cl::Program program(context, sources);
program.build(devices);
cl::Kernel kernel(program, "vector_add");
// 准备数据
const int N = 1024;
std::vector<float> a(N), b(N), c(N);
for (int i = 0; i < N; i++) {
a[i] = i;
b[i] = i * 2;
}
// 创建OpenCL缓冲区
cl::Buffer buffer_a(context, CL_MEM_READ_ONLY, sizeof(float) * N);
cl::Buffer buffer_b(context, CL_MEM_READ_ONLY, sizeof(float) * N);
cl::Buffer buffer_c(context, CL_MEM_WRITE_ONLY, sizeof(float) * N);
// 将数据复制到OpenCL缓冲区
queue.enqueueWriteBuffer(buffer_a, CL_TRUE, 0, sizeof(float) * N, a.data());
queue.enqueueWriteBuffer(buffer_b, CL_TRUE, 0, sizeof(float) * N, b.data());
// 设置内核参数
kernel.setArg(0, buffer_a);
kernel.setArg(1, buffer_b);
kernel.setArg(2, buffer_c);
// 启动内核
cl::NDRange global(N);
cl::NDRange local(256);
queue.enqueueNDRangeKernel(kernel, cl::NullRange, global, local);
// 将结果复制回主机内存
queue.enqueueReadBuffer(buffer_c, CL_TRUE, 0, sizeof(float) * N, c.data());
// 输出结果
for (int i = 0; i < N; i++) {
std::cout << c[i] << " ";
}
std::cout << std::endl;
return 0;
}
该示例程序首先创建了一个OpenCL上下文和命令队列,然后创建了一个简单的向量加法内核。接下来,它准备了两个向量并将它们复制到OpenCL缓冲区中。然后,它设置内核参数并启动内核。最后,它将结果从OpenCL缓冲区复制回主机内存并输出结果。