Отчет по лабораторной работе 4 на тему Перевод цветного изображения в градации серого на cuda
Скачать 0.53 Mb.
|
Министерство цифрового развития, связи и массовых коммуникаций Российской Федерации Ордена Трудового Красного Знамени Федеральное государственное бюджетное образовательное учреждение высшего образования «Московский технический университет связи и информатики» Кафедра математической кибернетики и информационных технологий Отчет по лабораторной работе №4 на тему «Перевод цветного изображения в градации серого на CUDA» по дисциплине «Распределенные вычислительные системы» Выполнил: студент группы БИБ2003 Андреев А. А. Руководитель: Соловьев А. С. Москва 2021 Оглавлени Введение 3 Исходный код программы 4 Входные данные……………………………………………………………………………..6 Результат работы программы 6 Вывод 7 Введение Цель работы: требуется выполнить перевод RGB изображения в изображение в градациях серого, имея следующие входные данные: тройка RGB чисел с плавающей точкой, которую необходимо преобразовать в единственное значение с плавающей точкой – интенсивность серого цвета. Исходный код программы Код программы представлен ниже. #include #define wbCheck(stmt) \ do { \ cudaError_t err = stmt; \ if (err != cudaSuccess) { \ wbLog(ERROR, "Failed to run stmt ", #stmt); \ wbLog(ERROR, "Got CUDA error ... ", cudaGetErrorString(err)); \ return -1; \ } \ } while (0) // Местодлявставкикода #define TILE_WIDTH 16 __global__ void rgb2gray(float *grayImage, float *rgbImage, int channels, int width, int height) { int x = threadIdx.x + blockIdx.x * blockDim.x; int y = threadIdx.y + blockIdx.y * blockDim.y; if (x < width && y < height) { // получаем координату для изображения в градациях серого int grayOffset = y * width + x; int rgbOffset = grayOffset * channels; float r = rgbImage[rgbOffset]; // red value for pixel float g = rgbImage[rgbOffset + 1]; // green value for pixel float b = rgbImage[rgbOffset + 2]; // blue value for pixel // сохраняем изменения масштаба // умножаем их на константы с плавающей точкой grayImage[grayOffset] = 0.21f * r + 0.71f * g + 0.07f * b; } } int main(int argc, char *argv[]) { wbArg_t args; int imageChannels; int imageWidth; int imageHeight; char *inputImageFile; wbImage_t inputImage; wbImage_t outputImage; float *hostInputImageData; float *hostOutputImageData; float *deviceInputImageData; float *deviceOutputImageData; args = wbArg_read(argc, argv); /* чтениевходныхаргументов */ inputImageFile = wbArg_getInputFile(args, 0); inputImage = wbImport(inputImageFile); imageWidth = wbImage_getWidth(inputImage); imageHeight = wbImage_getHeight(inputImage); // Вданнойлабораторнойзначениеравно 3 imageChannels = wbImage_getChannels(inputImage); // Таккакизображениемонохромное, оносодержиттолько 1 канал outputImage = wbImage_new(imageWidth, imageHeight, 1); hostInputImageData = wbImage_getData(inputImage); hostOutputImageData = wbImage_getData(outputImage); wbTime_start(GPU, "Doing GPU Computation (memory + compute)"); wbTime_start(GPU, "Doing GPU memory allocation"); cudaMalloc((void **)&deviceInputImageData, imageWidth * imageHeight * imageChannels * sizeof(float)); cudaMalloc((void **)&deviceOutputImageData, imageWidth * imageHeight * sizeof(float)); wbTime_stop(GPU, "Doing GPU memory allocation"); wbTime_start(Copy, "Copying data to the GPU"); cudaMemcpy(deviceInputImageData, hostInputImageData, imageWidth * imageHeight * imageChannels * sizeof(float), cudaMemcpyHostToDevice); wbTime_stop(Copy, "Copying data to the GPU"); /////////////////////////////////////////////////////// wbTime_start(Compute, "Doing the computation on the GPU"); //Местодлявставкикода dim3 dimGrid(ceil((float)imageWidth / TILE_WIDTH), ceil((float)imageHeight / TILE_WIDTH)); dim3 dimBlock(TILE_WIDTH, TILE_WIDTH, 1); rgb2gray<< deviceInputImageData, imageChannels, imageWidth, imageHeight); wbTime_stop(Compute, "Doing the computation on the GPU"); /////////////////////////////////////////////////////// wbTime_start(Copy, "Copying data from the GPU"); cudaMemcpy(hostOutputImageData, deviceOutputImageData, imageWidth * imageHeight * sizeof(float), cudaMemcpyDeviceToHost); wbTime_stop(Copy, "Copying data from the GPU"); wbTime_stop(GPU, "Doing GPU Computation (memory + compute)"); wbSolution(args, outputImage); cudaFree(deviceInputImageData); cudaFree(deviceOutputImageData); wbImage_delete(outputImage); wbImage_delete(inputImage); return 0; } Входные данные Рис. 1 - Исходное изображение Результат работы программы Рис. 2 - Изображение после выполнения кода Рис. 3 – Снимок экрана работы программы Вывод На данной лабораторной работе я выполнил перевод RGB изображения в изображение в градациях серого. Контрольные вопросы |