对于Nvidia GTX480 GPU,使用驱动程序版本275.50和280.19对图像进行重新采样,灰度值几乎没有变化。也许这是一个插值问题。除了OpenCL 1.1版的实现之外,我无法确定新版本中的更改。仅使用OpenCL 1.0,灰度值的变化相同。
在下面的代码中,驱动程序版本275.50和280.19之间给出了不同的结果:
success oclInitImgData(struct _Image2d *image)
{
cl_image_format volume_format;
volume_format.image_channel_order = CL_R;
volume_format.image_channel_data_type = CL_UNORM_INT16;
size = len[0] * sizeof(unsigned short);
img_h = clCreateImage2D(Ocl._GPUContext, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR,
&volume_format, len[0], len[1], size, data, &error);
resampledImg_h = clCreateBuffer(Ocl._GPUContext, CL_MEM_READ_WRITE, size, NULL, &error);
oclResampleImg(Ocl._GPUCommandQueue[posSet], Ocl._pGPUKernels[posSet][K_IMG_RESAMPLE], img_h, resampledImg_h , Size, PixelSize, mm_per_p, vm_h);
}
__kernel void resampleImage( __read_only image2d_t IN image, __global uint OUT *resampledImage)
{
//get resampled position
int2 posResampledImg = (int2)(get_global_id(0), get_global_id(1));
//get dimension of the image
int2 imageSize = get_image_dim(image);
//calulate image size in mm
float2 imageSizemm = convert_float2(imageSize)*imagePixelSize;
float2 posImg = (posResampledImgmm + (imageSizemm*0.5f));
float2 posImgnorm = posImg/imageSizemm;
int2 posImgpix = convert_int2(posImg/imagePixelSize);
uint sample = 0;
if(read_imageui(image, CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP | CLK_FILTER_NEAREST, posImgpix).x == 1)
{
//get grey value and store it in the resampled image
sample = read_imagef(image, CLK_NORMALIZED_COORDS_TRUE | CLK_ADDRESS_CLAMP | CLK_FILTER_LINEAR, posImgnorm).x * 65535.0f;
}
resampledImg[posResampledImg.y*convert_int(imageSizeResampled.x)+posResampledImg.x] = sample;
}
答案 0 :(得分:1)
要获得有用的结果,您应该:
(1)了解OpenCL规范是否涵盖行为差异。
(2)如果是,请创建一个演示它的测试用例
(3)使用Nvidia提交错误报告
(4)???
(5)利润
我不知道这里的人们如何能够帮助你超越步骤1-5。