cl_context & cl::Context 之间的区别

Difference between cl_context & cl::Context

本文关键字:cl 区别 之间 Context context      更新时间:2023-10-16

我试图为我的OpenCL程序创建一个缓冲区。但是,该功能

clCreateBuffer

期望一个cl_context而不是我正在使用的那个,这是cl::Context.有什么方法可以解决这个问题,或者我在这里做错了什么?

您正在混合 OpenCL C API (clCreateBuffer ) 和 C++ API ( cl::Context )。不要这样做,坚持使用 C 或 C++。

如果您已经有 cl::Context ,那么您应该坚持使用 C++ API。创建缓冲区的相应调用(例如,对于 100 个浮点数)将是:

cl::Context context(...); // your context creation
cl_int err;
cl::Buffer my_buffer(context, CL_MEM_READ_WRITE, sizeof(cl_float)*100, NULL, &err); 
if (err != CL_SUCCESS) {
    std::cerr << "ERROR: create buffer (" << err << ")" << std::endl;
    exit(1);
}

cl_context是OpenCL上下文的低级类型(来自cl.h),而cl::Context来自OpenCL C++包装器(cl.hpp)。要从类型为 cl::Context 的对象获取cl_context,请使用 operator() 。例如,如果您的上下文变量是"foo",要将其传递给clCreateBuffer请使用clCreateBuffer(foo(), flags, ...)

我发现您最好使用 C API 或 C++ 包装器,但不要同时使用两者,因为在它们之间转换会变得混乱和/或乏味。从低级类型构造C++包装器时,还要注意引用计数。