Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Použiješ jenom dvě cudy.. cuda2 a cuda4 jako prvni je aby jsi udelal že mas a jedem dolůůůůůůůů :D
- // ***********************************************************************
- // main
- // Demo program pro vyuku predmetu APPS (10/2012)
- // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
- // email:petr.olivka@vsb.cz
- //
- // Priklad pouziti CUDA technologie.
- // Prevedeni barevneho obrazku na odstiny sede.
- //
- // Pro manimulaci s obrazkem je pouzita knihovna OpenCV.
- //
- // ***********************************************************************
- #include <stdio.h>
- #include <cuda_runtime.h>
- #include \"..\\include\\opencv\\highgui.h\"
- void run_grayscale( uchar4 *color_pic, uchar4 *bw_pic, int sizex, int sizey );
- int main( int numarg, char **arg )
- {
- // nacteni obrazku
- IplImage *bgr_img = cvLoadImage( \"C:\\\\Users\\\\PAL0149\\\\Desktop\\\\img.jpg\" );
- int sizex = bgr_img->width;
- int sizey = bgr_img->height;
- // alokace poli uchar4 pro body obrazku a jeho naplneni
- int nova_velikost = sizex - 40;
- uchar4 *bgr_pole = new uchar4[ sizex * sizey ];
- uchar4 *bw_pole = new uchar4[ nova_velikost * sizey ];
- for ( int y = 0; y < sizey; y++ )
- for ( int x = 0; x < sizex; x++ )
- {
- CvScalar s = cvGet2D( bgr_img, y, x );
- uchar4 bgr = { (char) s.val[ 0 ], (char) s.val[ 1 ], (char) s.val[ 2 ] };
- bgr_pole[ y * sizex + x ] = bgr;
- }
- // volani funkce ze souboru .cu
- run_grayscale( bgr_pole, bw_pole, sizex, sizey );
- IplImage *bw_img = cvCreateImage( cvSize( nova_velikost, sizey ), IPL_DEPTH_8U, 3 );
- // ziskana data ulozime do noveho obrazku
- for ( int y = 0; y < sizey; y++ )
- for ( int x = 0; x < nova_velikost; x++ )
- {
- uchar4 bgr = bw_pole[ y * nova_velikost + x ];
- CvScalar s = { bgr.x, bgr.y, bgr.z };
- cvSet2D( bw_img, y, x, s );
- }
- // zobrazeni puvodniho obrazku a vysledku
- cvShowImage( \"Color\", bgr_img );
- cvShowImage( \"GrayScale\", bw_img );
- cvWaitKey( 0 );
- }
- // ***********************************************************************
- // cuda4.cu
- // Demo program pro vyuku predmetu APPS (10/2021)
- // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
- // email:petr.olivka@vsb.cz
- //
- // Priklad pouziti CUDA technologie.
- // Prevod barevneho obrazku na odstiny sede barvy
- //
- // ***********************************************************************
- #include <cuda_runtime.h>
- #include <stdio.h>
- // Demo kernel pro prevod barevneho bodu na odstin sede.
- __global__ void kernel_grayscale( uchar4 *color_pic, uchar4* bw_pic, int sizex, int sizey )
- {
- // souradnice vlakna, kontrola rozmeru obrazku
- int y = blockDim.y * blockIdx.y + threadIdx.y;
- if ( y >= sizey ) return;
- int x = blockDim.x * blockIdx.x + threadIdx.x;
- if ( x >= sizex ) return;
- uchar4 bgr = color_pic[ y * sizex + x ];
- // vsechny tri barevne slozky budou mit stejnou hodnotu
- bgr.x = bgr.y = bgr.z = bgr.x * 0.11 + bgr.y * 0.59 + bgr.z * 0.30;
- // ulozeni bodu do obrazku
- if ( x >= 20 && x < (sizex -20) ) // timhle zajistis aby se to orezalo celou touhle podminkou
- {
- bw_pic[ y * (sizex - 40)+ (x-20) ] = bgr;
- }
- /*ale ty potrebujes aby sis ten mensi obrazek dal do mensiho okna takze budes mit od zacatku dve okna jedno velke a jedno mensi a to mensi pak vsude prepises kdyz si ten kod potom projdes tak to pochopisv mainu nic nedelas ale v cudu4 doplnujes vsude to nove pole a udelas tuto podminku a jeste nactes obrazek ale to uz si anjdes :-) */
- }
- void run_grayscale( uchar4 *color_pic, uchar4* bw_pic, int sizex, int sizey )
- {
- cudaError_t cerr;
- // alokace pameti ve videokarte
- int nova_velikost = sizex - 40;
- uchar4 *cudaColorPic;
- uchar4 *cudaBWPic;
- cerr = cudaMalloc( &cudaColorPic, sizex * sizey * sizeof( uchar4 ) );
- if ( cerr != cudaSuccess )
- printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
- cerr = cudaMalloc( &cudaBWPic, nova_velikost * sizey * sizeof( uchar4 ) );
- if ( cerr != cudaSuccess )
- printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
- // prenos barevneho obrazku do videokarty
- cerr = cudaMemcpy( cudaColorPic, color_pic, sizex * sizey * sizeof( uchar4 ), cudaMemcpyHostToDevice );
- if ( cerr != cudaSuccess )
- printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
- int block = 12;
- int block2 = 10;
- dim3 blocks( ( sizex + block - 1 ) / block, ( sizey + block - 1 ) / block2 );
- dim3 threads( block, block2 );
- // vytvoreni bloku s vlakny, matice vlaken muze byt vetsi, nez samotny obrazek!
- kernel_grayscale<<< blocks, threads >>>( cudaColorPic, cudaBWPic, sizex, sizey );
- if ( ( cerr = cudaGetLastError() ) != cudaSuccess )
- printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
- // prenos dat z videokarty
- cerr = cudaMemcpy( bw_pic, cudaBWPic, nova_velikost * sizey * sizeof( uchar4 ), cudaMemcpyDeviceToHost );
- if ( cerr != cudaSuccess )
- printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
- // uvolneni alokovane pameti ve videokarte
- cudaFree( cudaColorPic );
- cudaFree( cudaBWPic );
- }
- // ***********************************************************************
- // main
- // Demo program pro vyuku predmetu APPS (10/2012)
- // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
- // email:petr.olivka@vsb.cz
- //
- // Priklad pouziti CUDA technologie.
- // Pole prvku float[] se vynasobi hodnotou float
- //
- // ***********************************************************************
- #include <stdio.h>
- #include <math.h>
- #include <time.h>
- #include <stdlib.h>
- // prototyp funkce v souboru .cu
- void run_mult( char *P, int Delka );
- #define N 1000
- int main()
- {
- //tohle je presne ten prvni ukol za dva body!!!!
- srand(time(NULL));
- // inicializace pole
- char prvky[ N ];
- for (int i = 0; i < N; i++)
- {
- prvky[i] = rand() % 26;
- prvky[i] += 65;
- }
- int random_pozice[10];
- for (int i = 0; i < 10; i++) {
- random_pozice[i] = rand() % 1000;
- }
- // vypis vysledku pred volanim metody
- for (int i = 0; i < 10; i++) {
- printf(\"%c \", prvky[random_pozice[i]]);
- }
- printf(\"\\n\");
- // volani funkce ze souboru .cu
- run_mult(prvky, N);
- // vypis vysledku po volani metody
- for (int i = 0; i < 10; i++) {
- printf(\"%c \", prvky[random_pozice[i]]);
- }
- printf(\"\\n\");
- getchar();
- return 0;
- }
- // ***********************************************************************
- // cuda2.cu
- // Demo program pro vyuku predmetu APPS (10/2012)
- // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
- // email:petr.olivka@vsb.cz
- //
- // Priklad pouziti CUDA technologie.
- // Nasobeni vsech prvku pole float[] hodnotou float
- //
- // ***********************************************************************
- #include \"device_launch_parameters.h\"
- #include <cuda_runtime.h>
- #include <stdio.h>
- // Demo kernel pro nasobeni prvku pole hodnotou.
- // Kazde vlakno provede nasobeni prave jednoho prvku pole
- __global__ void kernel_mult( char *pole, int L )
- {
- int l = blockDim.x * blockIdx.x + threadIdx.x;
- // pokud je index vlakna vetsi, nez delka pole, tak return
- if ( l >= L ) return;
- pole[ l ] += 32; // tady prictes 32 protože aby jsi zmensit velke A na male tak je to o 32 mist
- }
- void run_mult( char *P, int Delka )
- {
- cudaError_t cerr;
- int vlaken = 9; // ja mela 9 ty mas v zadani 10
- int bloku = ( Delka + vlaken - 1 ) / vlaken; // tady tohle je vzorec to tam musis mit
- // alokace pameti ve videokarte
- char *cudaP;
- cerr = cudaMalloc( &cudaP, Delka * sizeof( char ) );
- if ( cerr != cudaSuccess )
- printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
- // prenos dat do videokarty
- cerr = cudaMemcpy( cudaP, P, Delka * sizeof( char ), cudaMemcpyHostToDevice );
- if ( cerr != cudaSuccess )
- printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
- // vytvoreni bloku s vlakny, organizace jednoromerna
- kernel_mult <<<bloku, vlaken="">>>( cudaP, Delka );
- if ( ( cerr = cudaGetLastError() ) != cudaSuccess )
- printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
- // prenos dat z videokarty
- cerr = cudaMemcpy( P, cudaP, Delka * sizeof( char ), cudaMemcpyDeviceToHost );
- if ( cerr != cudaSuccess )
- printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
- // uvolneni alokovane pameti ve videokarte
- cudaFree( cudaP );
- }
- </bloku,></stdio.h></cuda_runtime.h></stdlib.h></time.h></math.h></stdio.h></stdio.h></cuda_runtime.h></cuda_runtime.h></stdio.h>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement