一、缓存对象
创建缓存对象buffer通过调用clCreateBuffer完成。
函数原型如下:
clCreateBuffer(cl_context context, cl_mem_flags options, size_t size, void *host_ptr, cl_int *error);
cl_mem_flags是枚举类型,可取以下值。
这些属性皆为限制设备,而非主机。前三个属性决定缓存对象的可访问性,后三个属性确定内存对象在主机内存中的分配方式。
二、子缓存对象
缓存对象可以生成子缓存对象。当一个内核需要另一个内核的一部分数据时,就可以使用子缓存对象,通过调用clCreateSubBuffer来创建。
函数原型如下:
clCreateSubBuffer(cl_mem buffer, cl_mem_flags flags, cl_buffer_create_type type,
const void *info, cl_int *error);
其中第三个参数只能设置为CL_BUFFER_CREATE_TYPE_REGION。
第四个参数指向的是一个cl_buffer_region结构,定义如下:
typedef struct _cl_buffer_region{
size_t origin;
size_t size;
}cl_buffer_region;
origin表示的是缓存对象的子对象数据的起始位置,size表示子对象的大小。
float main_data[1000];
cl_mem main_buffer, sub_buffer;
void *main_buffer_mem = NULL;
void *sub_buffer_mem = NULL;
size_t main_buffer_size, sub_buffer_size;
cl_buffer_region region;
main_buffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(main_data), main_data, &err);
if (err < 0)
{
cout << "Failed to create a buffer." << err << endl;
return err;
}
region.origin = 20 * sizeof(float);
region.size = 10 * sizeof(float);
sub_buffer = clCreateSubBuffer(main_buffer, CL_MEM_READ_ONLY, CL_BUFFER_CREATE_TYPE_REGION, ®ion, &err);
if (err < 0)
{
cout << "Failed to create a sub buffer." << err << endl;
return err;
}