【发布时间】:2021-12-23 03:09:50
【问题描述】:
这是我第一次编写 OpenCL 计算单元,所以我从小处着手;这是我的基本测试内核:
kernel void test_kernel(global float* in, global float* out)
{
int thread_id = get_global_id(0);
printf("%d", thread_id);
out[thread_id] = in[thread_id] + thread_id;
}
下面是尝试为参数构造缓冲区并运行它的 c++ 代码:
...
...
cl::Kernel kernel(program, "test_kernel", &cl_error);
if (cl_error != 0) {
std::cout << "Error - cl::Kernel - " << getErrorString(cl_error) << std::endl;
return 1;
}
cl::CommandQueue command_queue(context, device);
cl::vector<float> input_vector{ 0.1f, 0.2f, 0.3f, 0.4f, 0.5f };
cl::vector<float> output_vector{ 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
cl::Buffer input_buffer(std::begin(input_vector), std::end(input_vector), true);
cl::Buffer output_buffer(std::begin(output_vector), std::end(output_vector), false);
cl::EnqueueArgs enqueue_args(command_queue, cl::NDRange(5));
cl::KernelFunctor<cl::Buffer, cl::Buffer> functor(kernel);
functor(enqueue_args, input_buffer, output_buffer);
for (const auto& value : output_vector) {
std::cout << value << ", ";
}
我希望在运行内核后打印输出向量缓冲区的结果,这应该等于input[n] + n,但是我只得到了填充输出向量的初始0s。我已经尝试了很多事情,但到目前为止还没有成功,所以为了清楚起见,我将其缩小了。内核确实构建了,运行它时没有任何错误,只是没有得到我希望的结果。我也看不到任何打印语句输出。
关于进一步的上下文,我的硬件最高支持 openCL 1.2,在 macOS 上运行,并且我已经定义了 openCL 定义以声明我正在使用 openCL 1.2。
谁能看到我在设置代码中做错了什么?
【问题讨论】:
-
我在使用其他库的计算和图形着色器方面有中等经验,但同样,在为 openCL 处理 C++ 之前熟悉常规 openCL 是否可取?也许我错了,但是用于 openCL 的 C++ 的文档更有限,而没有
标签: c++ arguments kernel opencl