Я конвертирую изображение из цветного в оттенки серого, используя 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-версия:

Серийная версия процессора:

Кто-нибудь может объяснить, почему результаты разные?