Opencl GPU上的enqueueWriteImage失败
我正在开发一些用于图像缓冲区的内核。问题是,当我通过直接复制图像的数据来创建Image2D时,一切都很好 如果我尝试将写操作加入到我的图像缓冲区的队列中,它将不适用于我的GPU 下面是一个基本内核:Opencl GPU上的enqueueWriteImage失败,opencl,gpgpu,Opencl,Gpgpu,我正在开发一些用于图像缓冲区的内核。问题是,当我通过直接复制图像的数据来创建Image2D时,一切都很好 如果我尝试将写操作加入到我的图像缓冲区的队列中,它将不适用于我的GPU 下面是一个基本内核: __kernel void myKernel(__read_only image2d_t in, __write_only image2d_t out) { const int x = get_global_id(0); const int y = get_global_id(1);
__kernel void myKernel(__read_only image2d_t in, __write_only image2d_t out) {
const int x = get_global_id(0);
const int y = get_global_id(1);
const sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
uint4 pixel = read_imageui(in, sampler, (int2)(x, y));
write_imageui(out, (int2)(x, y), pixel);
}
这个简单的内核在我的GPU上给了我一个黑色的图像,但在我的CPU上运行良好
为了让它工作,我必须释放缓冲区映像并通过使用CL\u MEM\u COPY\u HOST\u PTR
直接传递数据来创建一个新的缓冲区映像。
我使用了好的数据格式:CL_RGBA,CL_UNSIGNED_INT8,我的图像大小很好
cl_image_format imageFormat = new cl_image_format();
imageFormat.image_channel_order = CL_RGBA;
imageFormat.image_channel_data_type = CL_UNSIGNED_INT8;
inputImageMem = clCreateImage2D(
context, CL_MEM_READ_ONLY,
new cl_image_format[]{imageFormat}, imageSizeX, imageSizeY,
0, null, null);
在运行时,为每个帧调用GPU上不工作的部分:
clEnqueueWriteImage(commandQueue, inputImageMem, CL_TRUE, new long[]{0, 0, 0},
new long[]{imageSizeX, imageSizeY, 1}, 0, 0,
Pointer.to(data), 0, null, null);
在GPU和CPU上工作但强制我重新创建缓冲区的部分:
clReleaseMemObject(inputImageMem);
cl_image_format imageFormat = new cl_image_format();
imageFormat.image_channel_order = CL_RGBA;
imageFormat.image_channel_data_type = CL_UNSIGNED_INT8;
inputImageMem = clCreateImage2D(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, new cl_image_format[]{imageFormat}, imageSizeX, imageSizeY, 0, Pointer.to(data), null);
发送的数据是一个int数组,大小为imageSizeX*imageSizeY
。我通过以下代码获得:
DataBufferInt dataBuffer = (DataBufferInt)image.getRaster().getDataBuffer();
int data[] = dataBuffer.getData();
<>上述代码是在java中使用JOCL,同样的问题出现在C++ C++程序中的另一个C++程序中。唯一的区别是java中虚拟机崩溃(3~4帧)之后,C++中的结果是黑色图像。那是我的司机表现得很奇怪 我当时使用的是12.4版本(我开始使用OpenCL时安装的版本),我刚刚安装了12.6版本,问题就消失了
因此,让您的驱动程序保持最新 您是否从clxx功能中获得y错误或状态代码?你能分享主机代码的相关部分,关于如何设置AM映像并排队缓冲区?状态代码在C++中都是清晰的,在java中没有异常(用<代码> C.StExistExistEngEngEnter(true);< /C> >)。我开始认为问题可能来自驱动程序或OpenCL实现。