openCL - 处理数组和标量的差异

时间:2013-01-17 12:15:13

标签: opencl

我正在尝试挖掘openCL。目前我问自己为什么标量与传输到GPU时的数据不同。

下面有两个输入。标量和数组。为什么将它们转移到GPU会有这么大的差异?

提前致谢!

// input size
int input_size = 4;
err = clSetKernelArg(kernel, 0, sizeof(unsigned int), &_input_size);
if (err != CL_SUCCESS) {
  throw std::runtime_error("Failed to set kernel arguments!");
}

// input
int input[input_size];
input[0] = 1;
input[1] = 2;
input[2] = 3;
input[3] = 4;
cl_mem cl_input = clCreateBuffer(context,  CL_MEM_READ_ONLY, sizeof(int) * _input_size, NULL, NULL);
if (!cl_input) {
  throw std::runtime_error("Failed to allocate device memory!");
}
err  = clSetKernelArg(kernel, 1, sizeof(cl_mem), &cl_input);
if (err != CL_SUCCESS) {
  throw std::runtime_error("Failed to set kernel arguments!");
}
err = clEnqueueWriteBuffer(commands, cl_input, CL_TRUE, 0, sizeof(int) * _input_size, _input, 0, NULL, NULL);
if (err != CL_SUCCESS) {
  throw std::runtime_error("Failed to write to source array!");
}

// output
int output_size = 4;
int output[output_size];
cl_mem cl_output = clCreateBuffer(context, CL_MEM_WRITE_ONLY, sizeof(int) * _output_size, NULL, NULL);
if (!cl_output) {
  throw std::runtime_error("Failed to allocate device memory!");
}
err = clSetKernelArg(kernel, 2, sizeof(cl_mem), &cl_output);
if (err != CL_SUCCESS) {
  throw std::runtime_error("Failed to set kernel arguments!" );
}

1 个答案:

答案 0 :(得分:2)

在OpenCL中,标量按值传递,并且是每个线程的常量。数组通过引用(地址)传递,可用于输入(只读),输出(只写)或输入/输出(读/写)。数组要求将cl_mem对象作为参数传递。 cl_mem是描述数组的元对象。标量非常简单,只需将它们的大小作为元数据。

所以在上面的例子中,内核应该看起来像......

kernel void mykernel( const int arg0,  global int * arg1, global int * arg2 ... ) {
    int  i =  get_global_id(0);

    // In every thread arg0  is constant value and cannot be changed

    if (i < arg0)
        arg2[i] = arg[1[i];
}