将数据 "by chunks" 写入 OpenCL 缓冲区
Write data "by chunks" into OpenCL buffer
我正在将 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);
我正在将 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);