【发布时间】:2020-01-18 22:33:47
【问题描述】:
我目前正在 OSX 上开发 OpenCL 内核,我正在尝试将输入图像设置为所有 255。
我用CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR 和CL_UNSIGNED_INT8 创建了一个单通道图像,我的内核和主机代码如下:
const sampler_t linear_sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_FILTER_LINEAR | CLK_ADDRESS_CLAMP_TO_EDGE;
__kernel void test(__write_only image2d_t dst)
{
const int2 src_pos = int2(get_global_id(0), get_global_id(1));
write_imagei(dst, src_pos, 255);
}
void clTest(cl_image2d dst)
{
cl_int retval;
cl_kernel kTest = clCreateKernel(m_oclEnv.program, "test", &retval);
CHECK_OCL(clSetKernelArg(kTest, 0, sizeof(cl_mem), (void*)&dst.mem));
size_t grid_item_size[2] = {static_cast<size_t>(m_nFrameWidth), static_cast<size_t>(m_nFrameHeight)};
size_t block_item_size[2] = {8, 8};
cl_uint nDim = 2;
CHECK_OCL(clEnqueueNDRangeKernel(m_oclEnv.queue, kTest, nDim, NULL, grid_item_size, block_item_size, 0, NULL, NULL));
clReleaseKernel(kTest);
}
显然内核只在y=x的位置绘制,那么问题出在哪里呢?谢谢。
ps:我已经尝试将图像写入GPU并立即读取并且效果很好,因此opencl上下文或环境应该没有任何问题。
【问题讨论】:
-
可能不是问题的根源,但对于无符号类型的图像,您需要使用
write_imageui。 -
问题已解决。在我的 opencl 内核的第一行。将类型
int2更改为(int2),我不知道为什么内核之前会这样,为什么opencl 没有报告任何语法错误。