如果我想将此代码格式化为OpenCL,在执行此操作时应该考虑什么?像我应该使用什么缓冲区? 如果我想知道内核使用了多少数据,我怎么能计算它呢?
int A[100000]
int B[100000]
for(int i=1; i<100000 -1); i++) {
B[i] = A[i-1] + A[i+1] - 2*A[i]
}
感谢所有帮助
答案 0 :(得分:2)
A和B需要两个缓冲区。例如:
cl_int error = CL_SUCCESS;
cl_mem A_buffer = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(int)*100000, A, &error);
cl_mem B_buffer = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, sizeof(int)*100000, B, &error);
如果您希望每个内核只使用B的一个元素,那么您的全局工作大小将等于99999。
你的内核可能看起来像这样(如果一个线程使用一个值,你可能不需要这样的并行性,它只是一个例子):
kernel void your_kernel(global int* A, global int* B) {
int i = get_global_id(0);
B[i] = A[i-1] + A[i+1] - 2*A[i];
}