CUDA浮点给出不同的结果

Dav*_*ton 2 cuda image grayscale

我正在使用CUDA 5/VC 2008将图像从彩色转换为灰度.

CUDA内核是:

__global__ static void rgba_to_grayscale( const uchar4* const rgbaImage, unsigned char * const greyImage,
                                     int numRows, int numCols) 
{
    int pos = blockIdx.x * blockDim.x + threadIdx.x;
    if (pos < numRows * numCols) {
        uchar4 zz = rgbaImage[pos];
        float out = 0.299f * zz.x + 0.587f * zz.y + 0.114f * zz.z;
        greyImage[pos] = (unsigned char) out;
    }

}
Run Code Online (Sandbox Code Playgroud)

C++函数是:

inline unsigned char rgba_to_grayscale( uchar4 rgbaImage) 
{
    return (unsigned char) 0.299f * rgbaImage.x + 0.587f * rgbaImage.y + 0.114f * rgbaImage.z;
}
Run Code Online (Sandbox Code Playgroud)

他们都被称为适当的.然而,它们产生了不同的结果.

原始图片:

这个彩色图像

CUDA版本:

cuda结果

串口CPU版本:

序列号结果

任何人都可以解释为什么结果不同?

sga*_*zvi 8

您的CUDA功能没有问题.CPU版本不正确.您类型转换值0.299f * rgbaImage.xunsigned char这相当于下面的代码:

inline unsigned char rgba_to_grayscale( uchar4 rgbaImage) 
{
    return ((unsigned char) 0.299f * rgbaImage.x) + 0.587f * rgbaImage.y + 0.114f * rgbaImage.z;
}
Run Code Online (Sandbox Code Playgroud)

您必须将最终结果转换为unsigned char:

inline unsigned char rgba_to_grayscale( uchar4 rgbaImage) 
{
    return (unsigned char) (0.299f * rgbaImage.x + 0.587f * rgbaImage.y + 0.114f * rgbaImage.z);
}
Run Code Online (Sandbox Code Playgroud)