将数据“按块”写入OpenCL缓冲区

问题描述

我正在将CUDA应用程序移植到OpenCL,我注意到CUDA提供了按块将数据写入其“缓冲区”的功能。我的意思是:

int *vals = new int[N/4];
int *d_vec = nullptr;
cudamalloc((void**)&d_vec,sizeof(int) * N);
for(int i = 0; i < 4; i++){
    cudamemcpy(d_vec + i*(N/4),vals,sizeof(int) * N/4,cudamemcpyHostToDevice);
}

上面的代码要做的是将vals数组(具有d_vec缓冲区的1/4)顺序写入d_vec。所以我的问题是,是否可以对OpenCL进行相同的处理?也就是说,分配一个缓冲区并按顺序向其写入值,而不必编写具有完整缓冲区大小的数组?

谢谢!

解决方法

是的,使用enqueueWriteBuffer确实可以实现:

cl_int *vals = new cl_int[N/4];
Buffer d_vec;
d_vec = Buffer(context,CL_MEM_READ_WRITE,N*sizeof(cl_int));
for(int i = 0; i < 4; i++){
    queue.enqueueWriteBuffer(d_vec,true,i*(N/4),sizeof(cl_int)*N/4,(void*)vals);
    queue.finish();
}
,

是的,您可以为clEnqueueWriteBuffer指定大小和偏移量,以代替cudaMemcpy

cl_int clEnqueueWriteBuffer(
    cl_command_queue command_queue,cl_mem buffer,cl_bool blocking_write,size_t offset,// from your example: i*(N/4)
    size_t size,// from your example: sizeof(int) * N/4
    const void* ptr,cl_uint num_events_in_wait_list,const cl_event* event_wait_list,cl_event* event);