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?
output.data(). Its better than&output[0]which you forgot to add indexing for first item. If that doesn't work, check size of cl_float3 in both host and device and their alignment requirements. They may be different. Did you resize output before passing address to kernel? Without memory allocated, opencl just assumes it has memory and writes an illegal address. - huseyin tugrul buyukisik