Я пишу программу для преобразования изображения rgba в оттенки серого. Я много работал над этим и правильно реализовал ядро. Тем не менее, размер сетки может быть неправильным, даже если он правильный по моей логике.CUDA: невозможно вычислить размер сетки
Ядро:
__global__
void rgba_to_greyscale(const uchar4* const rgbaImage,
unsigned char* const greyImage,
int numRows, int numCols)
{
int x = (blockIdx.x * blockDim.x) + threadIdx.x;
int y = (blockIdx.y * blockDim.y) + threadIdx.y;
if(x >= numCols || y >= numRows)
return;
uchar4 rgba = rgbaImage[x+y];
float channelSum = 0.299f*rgba.x + 0.587f*rgba.y + 0.114f*rgba.z;
greyImage[x+y] = channelSum;
}
и запуск ядра:
const dim3 blockSize(10, 10, 1); //TODO
size_t gridSizeX, gridSizeY;
gridSizeX = numCols + (10 - (numCols % 10)); //adding some number to make it multiple of 10
gridSizeY = numRows + (10 - (numRows % 10)); //adding some number to make it multiple of 10
const dim3 gridSize(gridSizeX, gridSizeY, 1); //TODO
rgba_to_greyscale<<<gridSize, blockSize>>>(d_rgbaImage, d_greyImage, numRows, numCols);
Я создаю больше числа потоков, то требуется, а затем применяя связанную проверку в ядре.
Это широко используемая логика для создания немного большего количества потоков и выполнения связанных проверок внутри ядра. Вот общая формула для расчета размера сетки. 'gridSizeX = (numCols + blockSize.x - 1) /blockSize.x;' – sgarizvi
Возможный дубликат [this] (http://stackoverflow.com/questions/14711668/colored-image-to-greyscale-image-using- cuda-parallel-processing). Я думаю, что его стандартная проблема от курса udacity. –
@SagarMasuti; Я тоже прочитал этот пост, но я не мог понять, что не так в моем коде. Было бы полезно, если бы вы указали ошибку в моем (логически правильном) коде. –