Reputation: 612
Windows 7 AMD App SDK 2.6 Asic: Redwood
I am trying to write a simple pass-thru kernel to see what the issue is and I can't seem to find what the error might be.
void kernel_test(CLManager* clMgr, int W, int H)
{
cl::ImageFormat format;
format.image_channel_order = CL_RGBA;
format.image_channel_data_type = CL_FLOAT;
cl_float4* inp = new cl_float4[W * H];
for (int i = 0; i < W * H; ++i)
{
inp[i].s[0] = 1.0f;
inp[i].s[1] = 0.0f;
inp[i].s[2] = 0.0f;
inp[i].s[3] = 1.0f;
}
cl_float4* oup = new cl_float4[W * H];
cl::Image2D clInputImage = clMgr->createImage<cl::Image2D>(CL_MEM_READ_ONLY, format, W, H, 0, NULL);
cl::Image2D clOutputImage = clMgr->createImage<cl::Image2D>(CL_MEM_WRITE_ONLY, format, W, H, 0, NULL);
cl::Sampler sampler = clMgr->createSampler(CL_FALSE, CL_ADDRESS_CLAMP_TO_EDGE, CL_FILTER_NEAREST);
cl::size_t<3> origin;
origin[0] = 0; origin[1] = 0, origin[2] = 0;
cl::size_t<3> region;
region[0] = W; region[1] = H; region[2] = 1;
unsigned int pgmID = clMgr->buildSource("CL/convolution.cl");
cl::Kernel* kernel = clMgr->makeKernel(pgmID, "passthru");
cl::CommandQueue* queue = clMgr->getCmdQueue();
queue->enqueueWriteImage(clInputImage, CL_TRUE, origin, region, 0, 0, inp, 0, NULL);
int status;
status = kernel->setArg(0, clInputImage);
status = kernel->setArg(1, clOutputImage);
status = kernel->setArg(2, sampler);
cl::NDRange globalSize(W, H);
std::cout << "Starting Kernel: passthru" << std::endl;
status = queue->enqueueNDRangeKernel(*kernel, 2, globalSize, cl::NullRange);
std::cout << "Ending Kernel: passthru" << std::endl;
status = queue->enqueueReadImage(clOutputImage, CL_TRUE, origin, region, 0, 0, oup);
}
The kernel looks like this
__kernel
void passthru(__read_only image2d_t sourceImage,
__write_only image2d_t outputImage,
sampler_t sampler)
{
// Store each work-items unique row and column
int2 coords = (int2){get_global_id(0), get_global_id(1)};
float4 pixel = read_imagef(sourceImage, sampler, coords);
write_imagef(outputImage, coords, pixel);
}
So I am clearing the input image to RED and then the kernel should just write back the RED color to the output. However, it just writes out 0.0f for everything in output. Any particular reason why I am not seeing the values in the clOutputImage?
Upvotes: 1
Views: 2856
Reputation: 612
The problem was this line.
status = queue->enqueueNDRangeKernel(*kernel, 2, globalSize, cl::NullRange);
I was mistakenly assumed the C argument list and added 2 as dimensions. Removing the 2 solved the problem.
Upvotes: 1