问题描述
我正在将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);