OpenCL:使用write_imagef设置CL_INTENSITY cl_float图像像素值

时间:2014-10-13 13:17:08

标签: opencl

我是OpenCL和C ++的新手。我正在尝试使用write_imagef来编辑CL_INTENSITY cl_float图像中的像素。工作环境是Mac OS X(所以OpenCL 2.0?),Eclipse Luna和GCC 4.9设置。

工作示例

我从image1 __kernel获得了copy image2,如下所示(main.cpp link):

__kernel void image_copy(__read_only image2d_t image1, __write_only image2d_t image2) {
    const int2 loc = (int2) (get_global_id(0),get_global_id(1));
    const sampler_t sampler=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST;
    float4 pixel = read_imagef(image1, sampler, loc);
    write_imagef(image2, loc, pixel);
}

此外,float中的write_imagef()变量也可以起作用(可能因为CL_INTENSITY是单通道),例如:

write_imagef(image2, loc, pixel.x);

或者

float p = pixel.x;
write_imagef(image2, loc, p);

两者都会从image2生成复制的image1

不工作的例子(我的问题)

当我尝试编辑输出图像而不是使用write_imagef进行直接复制时,它总是失败(内核成功编译但无法生成输出图像)。我认为错误是因为像素值没有正确编辑:

write_imagef(image2, loc, (float4)(1,1,1,1));

或者

write_imagef(image2, loc, (float4)(1.0f,1.0f,1.0f,1.0f));  // not quite different

或者

const float4 foo = (float4)(1,1,1,1);
write_imagef(image2, loc, foo);

基于来自inputfile的float4向量read_imagef的操作也无法生成输出图像:

float4 pixel = read_imagef(image1, sampler, loc);
pixel = pixel * 2;
write_imagef(image2, loc, pixel);  

或者

float4 pixel = read_imagef(image1, sampler, loc);
float p = pixel.x * 2;  
write_imagef(image2, loc, p);  

我为CL_INTENSITY图像忽略了哪些特殊格式?因为我发现很多例子表明(float4)(1.0f,1.0f,1.0f,1.0f)可以用于RGB图像。

由于

1 个答案:

答案 0 :(得分:0)

因为image1& image2都是2D数组

我自己找到了答案,这些数组是以这种方式创建的:

int j;
float** newarray = (float**) malloc(dimx*sizeof(float*));
for (j = 0 ; j < dimx ; j++)
    newarray[j] = (float*) malloc(dimy*sizeof(float));

我知道将2D数组传递给内核是“NO NO”,但我认为它应该是Image Object它应该可以工作,但结果仍然是“NO”。

我制作image1image2 1D数组后,write_imagef(image2, loc, 1);write_imagef(image2, loc, pixel.x*2);等都会有效(CL_INTENSITY为单通道,{{ 1}}值也可以。)

我通过尝试将主机2D数组传递给float(1D数组)然后将其读回另一个主机2D数组来发现这一点。仍然简单的直接复制工作,而任何进一步的操作尝试都不能产生可读的机器数组。

所以结论是我通过将2D数组传递给内核而犯了一个错误。 2D数组可以传递给内核,然后回读。但是,它非常脆弱。