Opencl GPU上的enqueueWriteImage失败

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);

我正在开发一些用于图像缓冲区的内核。问题是,当我通过直接复制图像的数据来创建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);
    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,我的图像大小很好

遇到了JOCL和API的C++绑定问题。(我没有测试C API)

最后,它通过重新创建缓冲区来运行,但这是一个好主意吗?这正常吗?我可以执行哪些操作来避免它

顺便说一下,我正在运行英特尔OpenCL SDK(英特尔Core I7)和ATI AMD应用程序SDK(HD6800)

[编辑]

下面是我用来在缓冲区中编写的代码

首先,分配部分:

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实现。