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 バージョン:
結果が異なる理由を誰か説明できますか?