opencl image2d#t不';不能写回值
视窗7 AMD应用软件开发工具包2.6 Asic:红杉 我正在尝试编写一个简单的pass-thru内核,以了解问题所在,但似乎无法找到可能的错误opencl image2d#t不';不能写回值,opencl,Opencl,视窗7 AMD应用软件开发工具包2.6 Asic:红杉 我正在尝试编写一个简单的pass-thru内核,以了解问题所在,但似乎无法找到可能的错误 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_f
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);
}
因此,我将输入图像清除为红色,然后内核应该将红色写回输出。但是,它只为输出中的所有内容写出0.0f。我没有看到clOutputImage中的值有什么特别的原因吗?问题是这一行
status=queue->enqueueNDRangeKernel(*kernel,2,globalSize,cl::NullRange)代码>
我被错误地假定为C参数列表,并将2添加为维度。卸下2解决了问题 问题出在这条线路上
status=queue->enqueueNDRangeKernel(*kernel,2,globalSize,cl::NullRange)代码>
我被错误地假定为C参数列表,并将2添加为维度。卸下2解决了问题
__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);
}