Advertisement
Guest User

cuda

a guest
Nov 24th, 2014
230
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.19 KB | None | 0 0
  1. Použiješ jenom dvě cudy.. cuda2 a cuda4 jako prvni je aby jsi udelal že mas a jedem dolůůůůůůůů :D
  2. // ***********************************************************************
  3. // main
  4. // Demo program pro vyuku predmetu APPS (10/2012)
  5. // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
  6. // email:petr.olivka@vsb.cz
  7. //
  8. // Priklad pouziti CUDA technologie.
  9. // Prevedeni barevneho obrazku na odstiny sede.
  10. //
  11. // Pro manimulaci s obrazkem je pouzita knihovna OpenCV.
  12. //
  13. // ***********************************************************************
  14.  
  15. #include <stdio.h>
  16. #include <cuda_runtime.h>
  17. #include \"..\\include\\opencv\\highgui.h\"
  18.  
  19. void run_grayscale( uchar4 *color_pic, uchar4 *bw_pic, int sizex, int sizey );
  20.  
  21. int main( int numarg, char **arg )
  22. {
  23.  
  24. // nacteni obrazku
  25. IplImage *bgr_img = cvLoadImage( \"C:\\\\Users\\\\PAL0149\\\\Desktop\\\\img.jpg\" );
  26. int sizex = bgr_img->width;
  27. int sizey = bgr_img->height;
  28.  
  29. // alokace poli uchar4 pro body obrazku a jeho naplneni
  30. int nova_velikost = sizex - 40;
  31.  
  32. uchar4 *bgr_pole = new uchar4[ sizex * sizey ];
  33. uchar4 *bw_pole = new uchar4[ nova_velikost * sizey ];
  34.  
  35. for ( int y = 0; y < sizey; y++ )
  36. for ( int x = 0; x < sizex; x++ )
  37. {
  38. CvScalar s = cvGet2D( bgr_img, y, x );
  39. uchar4 bgr = { (char) s.val[ 0 ], (char) s.val[ 1 ], (char) s.val[ 2 ] };
  40. bgr_pole[ y * sizex + x ] = bgr;
  41.  
  42. }
  43.  
  44. // volani funkce ze souboru .cu
  45. run_grayscale( bgr_pole, bw_pole, sizex, sizey );
  46.  
  47. IplImage *bw_img = cvCreateImage( cvSize( nova_velikost, sizey ), IPL_DEPTH_8U, 3 );
  48.  
  49. // ziskana data ulozime do noveho obrazku
  50. for ( int y = 0; y < sizey; y++ )
  51. for ( int x = 0; x < nova_velikost; x++ )
  52. {
  53. uchar4 bgr = bw_pole[ y * nova_velikost + x ];
  54. CvScalar s = { bgr.x, bgr.y, bgr.z };
  55. cvSet2D( bw_img, y, x, s );
  56. }
  57.  
  58. // zobrazeni puvodniho obrazku a vysledku
  59. cvShowImage( \"Color\", bgr_img );
  60. cvShowImage( \"GrayScale\", bw_img );
  61. cvWaitKey( 0 );
  62. }
  63.  
  64.  
  65.  
  66.  
  67.  
  68.  
  69. // ***********************************************************************
  70. // cuda4.cu
  71. // Demo program pro vyuku predmetu APPS (10/2021)
  72. // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
  73. // email:petr.olivka@vsb.cz
  74. //
  75. // Priklad pouziti CUDA technologie.
  76. // Prevod barevneho obrazku na odstiny sede barvy
  77. //
  78. // ***********************************************************************
  79.  
  80. #include <cuda_runtime.h>
  81. #include <stdio.h>
  82.  
  83. // Demo kernel pro prevod barevneho bodu na odstin sede.
  84. __global__ void kernel_grayscale( uchar4 *color_pic, uchar4* bw_pic, int sizex, int sizey )
  85. {
  86. // souradnice vlakna, kontrola rozmeru obrazku
  87. int y = blockDim.y * blockIdx.y + threadIdx.y;
  88. if ( y >= sizey ) return;
  89. int x = blockDim.x * blockIdx.x + threadIdx.x;
  90. if ( x >= sizex ) return;
  91.  
  92. uchar4 bgr = color_pic[ y * sizex + x ];
  93.  
  94.  
  95. // vsechny tri barevne slozky budou mit stejnou hodnotu
  96. bgr.x = bgr.y = bgr.z = bgr.x * 0.11 + bgr.y * 0.59 + bgr.z * 0.30;
  97.  
  98. // ulozeni bodu do obrazku
  99. if ( x >= 20 && x < (sizex -20) ) // timhle zajistis aby se to orezalo celou touhle podminkou
  100. {
  101. bw_pic[ y * (sizex - 40)+ (x-20) ] = bgr;
  102. }
  103. /*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 :-) */
  104.  
  105.  
  106. }
  107.  
  108. void run_grayscale( uchar4 *color_pic, uchar4* bw_pic, int sizex, int sizey )
  109. {
  110. cudaError_t cerr;
  111. // alokace pameti ve videokarte
  112.  
  113. int nova_velikost = sizex - 40;
  114. uchar4 *cudaColorPic;
  115. uchar4 *cudaBWPic;
  116. cerr = cudaMalloc( &cudaColorPic, sizex * sizey * sizeof( uchar4 ) );
  117. if ( cerr != cudaSuccess )
  118. printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
  119.  
  120. cerr = cudaMalloc( &cudaBWPic, nova_velikost * sizey * sizeof( uchar4 ) );
  121. if ( cerr != cudaSuccess )
  122. printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
  123.  
  124. // prenos barevneho obrazku do videokarty
  125. cerr = cudaMemcpy( cudaColorPic, color_pic, sizex * sizey * sizeof( uchar4 ), cudaMemcpyHostToDevice );
  126. if ( cerr != cudaSuccess )
  127. printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
  128.  
  129. int block = 12;
  130. int block2 = 10;
  131.  
  132. dim3 blocks( ( sizex + block - 1 ) / block, ( sizey + block - 1 ) / block2 );
  133. dim3 threads( block, block2 );
  134.  
  135. // vytvoreni bloku s vlakny, matice vlaken muze byt vetsi, nez samotny obrazek!
  136. kernel_grayscale<<< blocks, threads >>>( cudaColorPic, cudaBWPic, sizex, sizey );
  137.  
  138. if ( ( cerr = cudaGetLastError() ) != cudaSuccess )
  139. printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
  140.  
  141. // prenos dat z videokarty
  142. cerr = cudaMemcpy( bw_pic, cudaBWPic, nova_velikost * sizey * sizeof( uchar4 ), cudaMemcpyDeviceToHost );
  143. if ( cerr != cudaSuccess )
  144. printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
  145.  
  146. // uvolneni alokovane pameti ve videokarte
  147. cudaFree( cudaColorPic );
  148. cudaFree( cudaBWPic );
  149. }
  150.  
  151.  
  152. // ***********************************************************************
  153. // main
  154. // Demo program pro vyuku predmetu APPS (10/2012)
  155. // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
  156. // email:petr.olivka@vsb.cz
  157. //
  158. // Priklad pouziti CUDA technologie.
  159. // Pole prvku float[] se vynasobi hodnotou float
  160. //
  161. // ***********************************************************************
  162.  
  163. #include <stdio.h>
  164. #include <math.h>
  165. #include <time.h>
  166. #include <stdlib.h>
  167.  
  168. // prototyp funkce v souboru .cu
  169. void run_mult( char *P, int Delka );
  170.  
  171. #define N 1000
  172.  
  173. int main()
  174. {
  175. //tohle je presne ten prvni ukol za dva body!!!!
  176. srand(time(NULL));
  177.  
  178. // inicializace pole
  179. char prvky[ N ];
  180. for (int i = 0; i < N; i++)
  181. {
  182. prvky[i] = rand() % 26;
  183. prvky[i] += 65;
  184. }
  185.  
  186.  
  187. int random_pozice[10];
  188. for (int i = 0; i < 10; i++) {
  189. random_pozice[i] = rand() % 1000;
  190. }
  191.  
  192. // vypis vysledku pred volanim metody
  193. for (int i = 0; i < 10; i++) {
  194. printf(\"%c \", prvky[random_pozice[i]]);
  195. }
  196. printf(\"\\n\");
  197.  
  198. // volani funkce ze souboru .cu
  199. run_mult(prvky, N);
  200.  
  201. // vypis vysledku po volani metody
  202. for (int i = 0; i < 10; i++) {
  203. printf(\"%c \", prvky[random_pozice[i]]);
  204. }
  205. printf(\"\\n\");
  206.  
  207.  
  208. getchar();
  209. return 0;
  210. }
  211.  
  212.  
  213.  
  214. // ***********************************************************************
  215. // cuda2.cu
  216. // Demo program pro vyuku predmetu APPS (10/2012)
  217. // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
  218. // email:petr.olivka@vsb.cz
  219. //
  220. // Priklad pouziti CUDA technologie.
  221. // Nasobeni vsech prvku pole float[] hodnotou float
  222. //
  223. // ***********************************************************************
  224.  
  225. #include \"device_launch_parameters.h\"
  226. #include <cuda_runtime.h>
  227. #include <stdio.h>
  228.  
  229. // Demo kernel pro nasobeni prvku pole hodnotou.
  230. // Kazde vlakno provede nasobeni prave jednoho prvku pole
  231. __global__ void kernel_mult( char *pole, int L )
  232. {
  233. int l = blockDim.x * blockIdx.x + threadIdx.x;
  234. // pokud je index vlakna vetsi, nez delka pole, tak return
  235. if ( l >= L ) return;
  236.  
  237. pole[ l ] += 32; // tady prictes 32 protože aby jsi zmensit velke A na male tak je to o 32 mist
  238. }
  239.  
  240. void run_mult( char *P, int Delka )
  241. {
  242. cudaError_t cerr;
  243. int vlaken = 9; // ja mela 9 ty mas v zadani 10
  244. int bloku = ( Delka + vlaken - 1 ) / vlaken; // tady tohle je vzorec to tam musis mit
  245.  
  246. // alokace pameti ve videokarte
  247. char *cudaP;
  248. cerr = cudaMalloc( &cudaP, Delka * sizeof( char ) );
  249. if ( cerr != cudaSuccess )
  250. printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
  251.  
  252. // prenos dat do videokarty
  253. cerr = cudaMemcpy( cudaP, P, Delka * sizeof( char ), cudaMemcpyHostToDevice );
  254. if ( cerr != cudaSuccess )
  255. printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
  256.  
  257. // vytvoreni bloku s vlakny, organizace jednoromerna
  258. kernel_mult <<<bloku, vlaken="">>>( cudaP, Delka );
  259.  
  260. if ( ( cerr = cudaGetLastError() ) != cudaSuccess )
  261. printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
  262.  
  263. // prenos dat z videokarty
  264. cerr = cudaMemcpy( P, cudaP, Delka * sizeof( char ), cudaMemcpyDeviceToHost );
  265. if ( cerr != cudaSuccess )
  266. printf( \"CUDA Error [%d] - \'%s\'\\n\", __LINE__, cudaGetErrorString( cerr ) );
  267.  
  268. // uvolneni alokovane pameti ve videokarte
  269. cudaFree( cudaP );
  270. }
  271.  
  272. </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