问题描述和示例
我正在使用 OpenCL,并且正在尝试调整图像大小。我已经阅读了一些教程,并且几乎结束了尝试为此编写自己的内核。
我的问题是我无法让 OpenCL 从我传输给它的图像中读取像素。
这是 OpenCL 中的内核:
const sampler_t SMPL_PREF = CLK_NORMALIZED_COORDS_TRUE |
CLK_ADDRESS_CLAMP |
CLK_FILTER_LINEAR;
__kernel void image_scaling( __read_only image2d_t src_img,
__write_only image2d_t dest_img,
float WRATIO,
float HRATIO )
{
int2 coor = (int2)( get_global_id(0), get_global_id(1) );
float2 origCoor = (float2)(convert_float2(coor).x * WRATIO,
convert_float2(coor).y * HRATIO );
uint4 color = read_imageui( src_img, SMPL_PREF, origCoor );
// Test write_imageui -- THIS WORKS!!! :(
//color = (uint4)(20, 255, 20, 255);
write_imageui( dest_img, coor, color );
}
我正在使用 OpenCL.Net,但我认为这不是导致问题的原因。这就是我将图像从主机传输到设备内存的方式:
ImageFormat clImageFormat = new ImageFormat( ChannelOrder.RGBA,
ChannelType.Unsigned_Int8 );
// Allocate Memory on Device
IMem inputImage2DBuffer = Cl.CreateImage2D( env.Context,
MemFlags.AllocHostPtr |
MemFlags.ReadOnly,
clImageFormat,
(IntPtr) originalWidth,
(IntPtr) originalHeight,
(IntPtr) 0,
(IntPtr) 0, //imageData,
out error );
// Copy the host data to the device
error = Cl.EnqueueWriteImage( env.CommandQueues[ 0 ], // OpenCL Command Queue
inputImage2DBuffer, // Ptr on device for image
Bool.True, // Blocking write
originPtr, // origin x,y (0,0)
regionPtrInput, // dimension w,h
(IntPtr) 0, // rowPitch
(IntPtr) 0, // rowSlice
imageData, // Ptr to byte[] host data
0, // Number of wait events
null, // array of wait events
out clEvent );
Cl.WaitForEvents( (uint) 1, new Event[] { clEvent } );
CheckError( error, "EnqueueWriteImage" );
clEvent.Dispose( );
我需要帮助
如果我没有将图像正确传输到设备或者我的设备有问题,如果有人可以建议一种调试方法,我会很高兴。我有点走投无路了。就像我说的,我认为这不是 OpenCL.Net 的问题,但我现在几乎愿意尝试任何事情。我认为在传输主机内存时我可能在做一些愚蠢的事情,但我已经查看了 100 多次该代码并重写了近十二次。我看不到的任何东西都不应该导致这个问题。
我知道我可以将常规缓冲区传输到设备并将其读回,读取图像是我唯一的问题。如果您查看我的 OpenCL 代码,您会看到一个注释行。通过取消注释,我可以将数据返回给我的主机(石灰绿色)。这导致人们相信问题出在 read_image 上。
我正在使用 Intel 5000 GPU 开发 2013 MacBook Air 来运行我的 OpenCL 代码。