如何解决将数据“按块”写入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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。