OpenCL编程:创建buffer和subbuffer cl_mem

一、缓存对象

创建缓存对象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, &region, &err);
if (err < 0)
{
	cout << "Failed to create a sub buffer." << err << endl;
	return err;
}

猜你喜欢

转载自blog.csdn.net/heiheiya/article/details/81224223
cl