1

我有示例代码,但它完全忽略了我的 (void*)should_be!

我设置了 cl_image_desc、cl_image_format、缓冲区、原点和区域:

cl_image_desc desc;
desc.image_type = CL_MEM_OBJECT_IMAGE2D;
desc.image_width = width;
desc.image_height = height;
desc.image_depth = 0;
desc.image_array_size = 0;
desc.image_row_pitch = 0;
desc.image_slice_pitch = 0;
desc.num_mip_levels = 0;
desc.num_samples = 0;
desc.buffer = NULL;

cl_image_format format;
format.image_channel_order = CL_R;
format.image_channel_data_type = CL_FLOAT;

cl_mem bufferSourceImage = clCreateImage(context, CL_MEM_READ_ONLY, &format, &desc, NULL, NULL);
size_t origin[3] = {0, 0, 0};
size_t region[3] = {width, height,1};

在下一个片段中,sourceImage 是一个指向我的图像的空指针。但我的形象是什么?对于每个像素,都有 r、g、b、a、x 和 y 值。

clEnqueueWriteImage(queue, bufferSourceImage, CL_TRUE, origin, region, 0, 0, sourceImage, 0, NULL, NULL);

如何将我的图像(一堆(r,g,b,a,x,y))变成合适的数组?

这是他们提供的内核:

__kernel void convolution(__read_only image2d_t sourceImage, __write_only image2d_t outputImage, int rows, int cols, __constant float* filter, int filterWidth, sampler_t sampler)
{
    int column = get_global_id(0);
    int row = get_global_id(1);
    int halfWidth = (int)(filterWidth/2);

    float4 sum = {0.0f, 0.0f, 0.0f, 0.0f};

    int filterIdx = 0;
    int2 coords;
    for(int i = -halfWidth; i <= halfWidth; i++)
    {
        coords.y = row + i;
        for(int i2 = -halfWidth; i2 <= halfWidth; i2++) 
        {
            coords.x = column + i2;
            float4 pixel;
            pixel = read_imagef(sourceImage, sampler, coords);
            sum.x += pixel.x * filter[filterIdx++];

        }
    }
    if(myRow < rows && myCol < cols)
    {
        coords.x = column;
        coords.y = row;
        write_imagef(outputImage, coords, sum);
    }
}
4

1 回答 1

1

根据需要设置 cl_image_format,然后您只需遵循您选择的格式即可。目前,您的通道 (R, G, B, A) 数据应表示为“单精度浮点值” - image_channel_data_type = CL_FLOAT,您只能采用其中一个通道并将其输入预期的 R 通道 ( image_channel_order = CL_R)。

您的内核期望浮动:

float4 pixel;
pixel = read_imagef(sourceImage, sampler, coords);
于 2013-08-02T19:06:24.010 回答