Toshkent axborot texnologiyalari universiteti


Nvidia CUDA interfeysi yordamida tasvirlarga parallel ishlov berish jarayonlarini dasturlash



Yüklə 4,21 Mb.
səhifə13/18
tarix27.05.2023
ölçüsü4,21 Mb.
#113620
1   ...   10   11   12   13   14   15   16   17   18
Tayyor Dissertatsiya ishi Abdusalomov Saidmalikxon

3.2. Nvidia CUDA interfeysi yordamida tasvirlarga parallel ishlov berish jarayonlarini dasturlash


CUDA orqali dasturlash, dastur o‘z kompilyatoriga ega bo‘lganligi sababli va nisbatan qulayroq. Faqatgina Nvidia Videokartalarini qo‘llab quvvatlashi esa biroz noqulaylik tug‘dirishi mumkin. Unda biror vazifani bajarib uning uchun ketadigan vaqtni CPU va GPU orasidasidagi farqlarini tahlil qilib chiqildi. Ushbu tizim uchun algoritm ishlab chiqildi va dastur tuzildi. Dasturda turli xil hajmdagi tasvirlarga CPU hamda GPU haar veyvlet yordamida qayta ishlov berib, unga ketgan vaqtni hisoblash va taqqoslash orqali qanday holatlarda, qaysi protsessordan foydalanish zarurligi ko‘rsatilgan.
Sinovdan o‘tgan konfiguratsiya

  • CPU :Amd Ryzen 5 5500u(6core,12thread)

  • RAM: 8GB DDR4 2666mhz

  • GPU:Nvidia Gtx 1080ti 8gb

  • OS:Windows 10 Professional

  • Cuda:

    • Compute Capability 7.5

    • Threads per Multiprocessor 1024

    • CUDA 11.1.70

  • GPU-Z:version 2.35.0

  • Visual Studio 2017
    CUDA tafsilotlari GPU-Z-dan olingan

Bu konfiguratsiya nisbatan yangi hisoblanib, Nvidia GTX 1080TI 8gb li videokarta ancha kuchli, Amd Ryzen 5 5500u protsessori ham o‘z pog‘onasining kuchli chiplaridan biri hisoblanadi, shu sababdan ushbu tizimda tajribalarni o‘tkazish ancha qulay va ishonarli.
CUDA interfeysi orqali tasvirga haar veyvlet usulida ishlov berish. Ish birliklari bo‘lgan (Gx,Gy) har bir ish guruhi esa (Sx,Sy) qilib belgilanadi. Har bir kernel uchun unga umumiy global o‘lchov beriladi. Qo‘llanilgan kombinatsiyaning idenfikatsiyasi (Wx,Wy). Ishlovchi yadrolar sonini aniqlash tartibi quyidagi ko‘rinishda bo‘ladi.
(gx,gy))= (wx*Sx+Sx, wy*Sy+Sy) (2.1)
Global xotirani hisobga olgan holda ishlash guruhi va elementlarini hisoblash tahminan shu ko‘rinishda hisoblanadi.
(Wx,Wy)=( , ) (2.2)
Ikki o'lchovli signal uchun Haar konvertatsiyasi
Ikki o'lchovli diskret kirish signali S deb olsak. Qo'shni elementlarning har bir juftiga ikkita raqam mos keladi:
(2.3)
Ushbu operatsiyani asl signalning har bir elementi uchun takrorlab, chiqishda ikkita signal olinadi, ulardan biri kirish signalining qo'pol versiyasi — a_{i}, ikkinchisi esa asl signalni tiklash uchun zarur bo'lgan batafsil ma'lumotlarni o'z ichiga oladi. Xuddi shunday, Haar konvertatsiyasi olingan A_{i} signaliga va boshqalarga qo'llanilishi mumkin.
Haarning ikki o'lchovli o'zgarishi Haarning bir o'lchovlidan deyarli umuman farq qilmaydi. Ikki o'lchovli kirish signali s matritsasi bilan ifodalansa, s matritsasining har bir qatoriga bir o'lchovli Haar konvertatsiyasini qo'llaganimizdan so'ng, ikkita yangi matritsa olinadi, ularning satrlari asl matritsaning satrlarining taxminiy va batafsil qismini o'z ichiga oladi. Xuddi shunday, olingan matritsalarning har bir ustuniga bir o'lchovli Haar konvertatsiyasi qo'llaniladi va chiqishda to'rtta matritsa olinadi, ulardan biri asl signalning taxminiy komponenti, qolgan uchtasi esa batafsil ma'lumotni o'z ichiga oladi — vertikal, gorizontal va diagonal.

3.13- rasm. CUDA yordamida parallel hisoblash algoritmi
Ushbu tizimning ham algoritmi standart bo‘lib birinchi vazifalar taqsimlanadi,
CUDA da C++ dasturi yordami CPU orqali bajariladigan kodi shu tarzda bo‘ladi.


#include
#include
#include


// JPEG formatdagi tasvirni siqish uchun ishlatiladi
void compressImage(const cv::Mat& inputImage, std::vector& compressedData) {
// Tasvirdagi ranglarni konversatsiya qilish YCrCb
cv::Mat ycrcbImage;
cv::cvtColor(inputImage, ycrcbImage, cv::COLOR_BGR2YCrCb);


// Kanalga ajratish Y, Cr и Cb
std::vector channels;
cv::split(ycrcbImage, channels);


// JPEG yordamida Y kanalini siqish
std::vector compression_params;
compression_params.push_back(cv::IMWRITE_JPEG_QUALITY);
compression_params.push_back(90); // Siqish sifati JPEG (0-100)
cv::imencode(".jpg", channels[0], compressedData, compression_params);
}


int main() {
// CUDA yordamida tasvirni yuklash
cv::Mat inputImage = cv::imread("input_image.jpg", cv::IMREAD_COLOR);


// Tasvirni muvaffaqiyatli yuklanganligini tekshirish
if (inputImage.empty()) {
std::cerr << "Failed to load input image." << std::endl;
return -1;
}


// Siqish ma`lumotlarini tayyorlash
std::vector compressedData;
compressImage(inputImage, compressedData);


// Tayyor bo‘lgan faylni yuklash yoki tarmoq orqali jo‘natish
cv::imwrite("compressed_image.jpg", compressedData);
// GPU xotirasidagi ma`lumotlarni Asosiy xotiraga ko‘chirish
cudaStatus = cudaMemcpy(Number, dev_Number, size * sizeof(unsigned long long), cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
}
cudaStatus = cudaMemcpy(Degree_of, dev_Degree_of, size * sizeof(unsigned long long), cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
}
cudaStatus = cudaMemcpy(Stop, dev_Elements_that_need_to_stop, size * sizeof(bool), cudaMemcpyDeviceToHost);
if (cudaStatus != cudaSuccess) {
fprintf(stderr, "cudaMemcpy failed!");
goto Error;
}
GPU xotirasini ma`lumotlardan tozalash
cudaFree(dev_INPUT);
cudaFree(dev_Degree_of);
cudaFree(dev_Max);
cudaFree(dev_Elements_that_need_to_stop);
cudaFree(dev_Number);
return 0;
}
GPU uchun variant esa


//Cuda freymvorki cuda_runtime.h va device_launch_parameters.h
//CUDA da ishlash uchun
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include
#include// getline uchun
#include
#include

Yüklə 4,21 Mb.

Dostları ilə paylaş:
1   ...   10   11   12   13   14   15   16   17   18




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©genderi.org 2024
rəhbərliyinə müraciət

    Ana səhifə