OpenCL:使用write_imagef设置CL_强度CL_浮动图像像素值

OpenCL:使用write_imagef设置CL_强度CL_浮动图像像素值,opencl,Opencl,我已从image1\uuu内核中复制image2,如下所示(main.cpp): 此外,write_imagef()中的float变量也可以工作(可能是因为CL_强度是单通道的),例如: write_imagef(image2, loc, pixel.x); 或 两者都会从image1生成复制的image2 不起作用的示例(我的问题) 当我尝试编辑输出图像而不是使用write_imagef直接复制时,总是失败(内核成功编译,但无法生成输出图像)。我认为错误是因为像素值未正确编辑: write_

我已从image1
\uuu内核中复制image2,如下所示(main.cpp):

此外,
write_imagef()
中的
float
变量也可以工作(可能是因为CL_强度是单通道的),例如:

write_imagef(image2, loc, pixel.x);

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

不起作用的示例(我的问题) 当我尝试编辑输出图像而不是使用
write_imagef
直接复制时,总是失败(内核成功编译,但无法生成输出图像)。我认为错误是因为像素值未正确编辑:

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

通过从输入文件中读取图像f
基于向量的操作也无法生成输出图像:

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

对于CL_强度图像,是否有我忽略的特殊格式?因为我发现很多例子显示
(float4)(1.0f,1.0f,1.0f,1.0f)
可以处理RGB图像

谢谢

,因为
image1
image2
都是二维阵列 我自己找到了答案,数组是这样创建的:

int j;
float** newarray = (float**) malloc(dimx*sizeof(float*));
for (j = 0 ; j < dimx ; j++)
    newarray[j] = (float*) malloc(dimy*sizeof(float));
intj;
float**newarray=(float**)malloc(dimx*sizeof(float*);
对于(j=0;j
我知道将2D数组传递给内核是“否”,但我认为作为一个
图像对象它应该可以工作,结果仍然是“否”

一旦我制作了
image1
image2
1D数组,
write_imagef(image2,loc,1)
写入图像f(图像2,位置,像素x*2)等都可以工作(对于
CL\u强度
是单通道,一个
float
值也可以)

我通过尝试将主机2D数组传递给
缓冲区对象(1D数组),然后将其读回另一个主机2D数组来发现这一点。简单的直接拷贝仍然有效,而任何进一步的操作尝试都无法生成机器可读的数组

所以结论是我把2D数组传递给内核是一个错误。2D数组可以被传递到内核,并被读回。但是,它非常脆弱。

你说的“失败”是什么意思?内核是否未编译,或产品是否出现意外结果?您是否已验证您的设备支持数据的CL_强度格式图像?我可以确认,即使图像是单通道的,write_imagef也需要float4参数,因此您尝试仅使用float是不正确的。@Dithermaster谢谢。“失败”是指
内核
已编译但未生成输出映像。我认为我的设备支持CL_强度,因为我有成功的例子。并且尝试将
float
用作像素值也成功了。然而,除了简单的图像复制之外的进一步修改失败了。
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);
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);  
int j;
float** newarray = (float**) malloc(dimx*sizeof(float*));
for (j = 0 ; j < dimx ; j++)
    newarray[j] = (float*) malloc(dimy*sizeof(float));