OpenCL clEnqueueWriteBuffer传递指针错误

时间:2018-02-01 07:28:21

标签: c++ opencl

传递给clEnqueueWriteBuffer的数组指针是否必须在同一范围内使用malloc? 这是我的代码:

class int_matrix{
public:
  int_matrix(size_t size_row, size_t size_col) :
        _size_row(size_row), _size_col(size_col) { 
        element = (int*)malloc(size_row * size_col * sizeof(int));
    }
  friend int_matrix cl_prod_l(int_matrix& lhs, int_matrix& rhs);
private:
  int* element;
};
int_matrix cl_prod_l(int_matrix& lhs, int_matrix& rhs) {
  ...
  int_matrix return_val(lhs._size_row, rhs._size_col, 0); // Initialize elements in retrun_val
  cl_mem lhs_buffer, rhs_buffer, return_buffer;
/* config buffer */
  lhs_buffer = clCreateBuffer(int_matrix::_clconfig._context,
        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, M*K * sizeof(int), NULL, &err);
  rhs_buffer = clCreateBuffer(int_matrix::_clconfig._context,
        CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, N*K * sizeof(int), NULL, &err);
  return_buffer = clCreateBuffer(int_matrix::_clconfig._context,
        CL_MEM_READ_WRITE, M*N * sizeof(int), NULL, &err);
  cl_kernel Kernel= clCreateKernel(int_matrix::_clconfig._program, ker, &err);
/* enqueue buffer */
  clEnqueueWriteBuffer(int_matrix::_clconfig._cmdque, lhs_buffer, CL_TRUE, 0, M*K * sizeof(int), lhs.element, 0, NULL, NULL);
  clEnqueueWriteBuffer(int_matrix::_clconfig._cmdque, rhs_buffer, CL_TRUE, 0, N*K * sizeof(int), rhs.element, 0, NULL, NULL);
  clEnqueueWriteBuffer(int_matrix::_clconfig._cmdque, return_buffer, CL_TRUE, 0, M*N * sizeof(int), return_val.element, 0, NULL, NULL);
   ...
}

在此示例中,我发现lhs.elementrhs.elementreturn_val.element无法在内核中传递。但是当我在这个函数中更改为某个数组malloc(复制相同的值)时,内核可以返回正确的结果。 那么传递给clEnqueueWriteBuffer的数组指针有什么限制吗?

1 个答案:

答案 0 :(得分:0)

... Emmm 我发现答案是我的,cl_mem对象和int* element应放在同一范围内。