我是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图像。
由于
答案 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”。
我制作image1
和image2
1D数组后,write_imagef(image2, loc, 1);
和write_imagef(image2, loc, pixel.x*2);
等都会有效(CL_INTENSITY
为单通道,{{ 1}}值也可以。)
我通过尝试将主机2D数组传递给float
(1D数组)然后将其读回另一个主机2D数组来发现这一点。仍然简单的直接复制工作,而任何进一步的操作尝试都不能产生可读的机器数组。
所以结论是我通过将2D数组传递给内核而犯了一个错误。 2D数组可以传递给内核,然后回读。但是,它非常脆弱。