Я конвертирую изображение из цветного в оттенки серого, используя 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;
}
}
Функция С++:
inline unsigned char rgba_to_grayscale( uchar4 rgbaImage)
{
return (unsigned char) 0.299f * rgbaImage.x + 0.587f * rgbaImage.y + 0.114f * rgbaImage.z;
}
и они оба называются соответствующим образом. Однако они дают разные результаты.
Исходное изображение:
CUDA-версия:
Серийная версия процессора:
Кто-нибудь может объяснить, почему результаты разные?