snowrain
snowrain

Reputation: 442

Passing std::vector to openCL kernel C++ bindings

I'm new to OpenCL. I want to pass vector to OpenCL kernel using the C++ bindings.

Currently I have in host program:

std::vector<cl_float4> toKernel;
std::vector<cl_float3> output;
int n = 50;

//init some value in toKernel vector
//make kernel, program, command queue, etc...

cl::Buffer bufferX = cl::Buffer(
      context,
      CL_MEM_READ_ONLY,
      vectorSize * sizeof(cl_float4)
    );

cl::Buffer bufferNumber = cl::Buffer(
      context,
      CL_MEM_READ_ONLY,
      sizeof(int)
    );

cl::Buffer bufferOutput = cl::Buffer(
      context,
      CL_MEM_WRITE_ONLY,
      vectorSize * sizeof(cl_float3)
    );


queue.enqueueWriteBuffer(
      bufferX,
      CL_TRUE,
      0,
      vectorSize * sizeof(cl_float4),
      toKernel.data()
    );
queue.enqueueWriteBuffer(
      bufferNumber,
      CL_TRUE,
      0,
      sizeof(int),
      &n
    );

kernel.setArg(0, bufferX);
kernel.setArg(1, bufferNumber);
kernel.setArg(2, bufferOutput);

cl::NDRange global(vectorSize);
    cl::NDRange local(1);
    queue.enqueueNDRangeKernel(
      kernel,
      cl::NullRange,
      global,
      local
    );

queue.enqueueReadBuffer(
      bufferOutput,
      CL_TRUE,
      0,
      vectorSize * sizeof(cl_float3),
      &output
    );

And in my kernel program I access each vector value like this:

__kernel void calculate(__global const float4 *x, __global const int *n, __global float3 *out){
    int i = get_global_id(0);
    for (int j=0; j<n; j++) {
         //do some calculation using x[i] and x[j]....
    }

    out[i] = calc_result;
}

Is this the correct way? I'm not sure how to output debug message in OpenCL. I get clEnqueueReadBuffer(-5) when I try to read the output from the kernel. How do you read back std::vector from OpenCL?

Upvotes: 2

Views: 940

Answers (1)

Alan Birtles
Alan Birtles

Reputation: 36389

-5 means "out of resources". You can't pass output as a pointer to enqueueReadBuffer. You need to pass output.data()

Upvotes: 4

Related Questions