2012-08-08 36 views
0

我正在開發一些與圖像緩衝區一起工作的內核。問題是,當我通過直接複製圖像的數據創建我的Image2D時,一切正常。在GPU上enqueueWriteImage失敗

如果我嘗試寫入我的圖像緩衝區,它將不適用於我的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_MEM_COPY_HOST_PTR直接傳遞數據來釋放緩衝圖像並創建一個新圖像。 我使用良好的數據格式:CL_RGBA,CL_UNSIGNED_INT8和我的圖像的大小是好的。

JOCL和API的C++綁定遇到了問題。 (我沒有測試C API)。

最後,它通過重新創建緩衝區來運行,但這是一個好主意嗎?這是正常的嗎?我可以執行哪些操作來避免它?

順便說一下,我使用的是Intel SDK for OpenCL(英特爾酷睿I7)和ATI AMD APP 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); 

發送的數據是一個大小爲012的int數組。我此代碼得到它:

DataBufferInt dataBuffer = (DataBufferInt)image.getRaster().getDataBuffer(); 
int data[] = dataBuffer.getData(); 

上面的代碼是在使用JOCL java中,同樣的問題出現在使用C++的OpenCL包裝的另一C++程序。唯一的區別是在Java中虛擬機崩潰(在3〜4幀之後)並且在C++中結果是黑色圖像。

+0

你是否從clxx函數中得到y錯誤或狀態碼?你可以分享主機代碼的相關部分,關於你如何設置圖像和入隊緩衝區? – 2012-08-08 16:36:47

+0

狀態代碼在C++中都是清晰的,在java中沒有拋出異常(使用'CL.setExceptionsEnabled(true);')。我開始認爲問題可能來自驅動程序或OpenCL實現。 – dkg 2012-08-10 08:43:33

回答

2

嗯,我發現了這個問題。那是我的司機行爲怪異。

我使用的是12.4版本(我開始使用OpenCL時安裝的版本),我剛安裝了12.6版本,問題就消失了。

因此,請保持您的驅動程序是最新的!