Reputation: 442
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
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