2

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;
    }

}

C++ 関数は次のとおりです。

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

どちらも適切に呼び出されます。しかし、それらは異なる結果をもたらしています。

元の画像:

このカラー画像

CUDA バージョン:

クーダの結果

シリアル CPU バージョン:

シリアルコード結果

結果が異なる理由を誰か説明できますか?

4

2 に答える 2

8

CUDA 関数に問題はありません。CPU のバージョンが正しくありません。次のコードと同等の値0.299f * rgbaImage.xを型キャストしています。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;
}

最終結果を次の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);
}
于 2013-05-12T12:37:13.067 に答える